programing

Linux에서 공유 라이브러리를 주소 공간에 로드하는 방법

kingscode 2022. 8. 11. 18:29
반응형

Linux에서 공유 라이브러리를 주소 공간에 로드하는 방법

질문은 다음과 같습니다.

프로그램에서 공유 객체의 주소는 언제 지정됩니까?링크 중에?로드 중?메모리 주소를 찾으려면system내부에서 지휘하다libc내 프로그램 안에서 나는 그것을 쉽게 찾을 수 있었다.gdb하지만 프로그램을 디버거에 넣지 않으려면 어떻게 해야 합니까?

이 주소는 실행에서 실행으로 변경될 수 있습니까?실행 시 이 프로그램의 메모리 공간에 라이브러리 또는 함수가 로드되는 위치를 표시할 수 있는 다른 정적 분석 도구가 있습니까?

편집: 이 정보는 프로그램 이외의 것으로 합니다(즉,다음과 같은 유틸리티 사용objdump정보를 수집하다)

라이브러리는 (다이나믹링커 또는 런타임링커로 불린다)에 의해 로드됩니다.ld-linux.so.2또는ld-linux.so.*Linux의 경우, glibc의 일부).「인터프리터」(INTERP;)로 선언됩니다..interp모든 다이내믹 링크된 ELF 바이너리의 섹션).따라서 프로그램을 시작하면 Linux는 다음 프로그램을 시작합니다.ld.so(메모리에 로딩하여 엔트리 포인트로 점프)ld.so프로그램을 메모리에 로드하여 준비한 후 실행합니다.동적 프로그램을 시작할 수도 있습니다.

 /lib/ld-linux.so.2 ./your_program your_prog_params

ld.so실제로 실행하다open그리고.mmap필요한 모든 ELF 파일, 프로그램의 ELF 파일과 필요한 모든 라이브러리의 ELF 파일.또한 GOT 테이블과 PLT 테이블을 채우고 재배치 해결을 수행합니다(많은 경우 간접 호출을 사용하여 라이브러리에서 콜 사이트로 함수 주소를 씁니다).

에서 얻을 수 있는 일부 라이브러리의 일반적인 로드 주소ldd효용.실제로는 bash 스크립트입니다.이 스크립트는 ld.so의 디버깅 환경변수를 설정합니다(실제로).LD_TRACE_LOADED_OBJECTS=1glibc의 rtld의 경우)와 프로그램을 시작합니다.스크립트의 필요 없이 직접 실행할 수도 있습니다.예를 들어 bash를 사용하여 단일 실행을 위해 환경 변수를 쉽게 변경할 수 있습니다.

 LD_TRACE_LOADED_OBJECTS=1 /bin/echo

ld.so는 이 변수를 확인하여 필요한 모든 라이브러리와 해당 라이브러리의 인쇄 로드 주소를 해결합니다.하지만 이 변수 집합으로 인해ld.so는 실제로 프로그램을 시작하지 않습니다(프로그램 또는 라이브러리의 정적 생성자에 대해서는 확실하지 않습니다).ASLR 기능이 비활성화되어 있는 경우 로드 주소는 대부분 동일합니다.최신 Linux에서는 ASLR이 활성화되어 있는 경우가 많기 때문에 비활성화하려면 를 사용합니다.

하면 ''이 수 있어요.systemlibc.sonmbinutils의 입니다.'아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예',nm -D /lib/libc.so ★★★★★★★★★★★★★★★★★」objdump -T /lib/libc.soGREP가 되다.

, " "를 할 수 있습니다.dlopen()메인 프로그램:

void *self = dlopen(NULL, RTLD_NOW);
dlsym(self, "system"); // returns the pointer to the system() function

컴파일 시 이름을 알고 있는 함수의 주소만 원하는 경우,void *addr = &system;

"소스로 바로 가서 말에게 물어보세요.."

Drepper - 공유 라이브러리 쓰기 방법

Linux 라이브러리 라이터용 필수 문서입니다.로딩 방법에 대해 자세히 설명합니다.

nm명령어, 사용libc.so의 위치가 표시됩니다.system로 상징하다.libc.so단, ASLR이 활성화 되어 있는 경우 주소는libc.so로딩되어 있기 때문에, 최종 주소는system프로그램이 실행될 때마다 랜덤으로 변경됩니다.ASLR이 없어도 주소를 확인해야 합니다.libc.so로딩되어 주소가 오프셋됩니다.system그 양만큼.

사용자 환경에 LD_LIBRARY_PATH 경로가 있어야 합니다.공유 라이브러리를 찾을 위치를 정의합니다./etc/ld.so.conf 이 게시물을 참조하십시오.http://www.google.com/url?sa=t&source=web&cd=3&ved=0CCQQFjAC&url=http%3A%2F%2Fubuntuforums.org%2Fshowthread.php%3Ft%3D324660&ei=KqJpTey7JofEsAPE9_imBA&usg=AFQjCNEIbGGrTHp4fufRuj4Yfc58RTHcag&sig2=_9tdlyadMbPc-FcOdCko-w

언급URL : https://stackoverflow.com/questions/5130654/when-how-does-linux-load-shared-libraries-into-address-space

반응형