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=1
glibc의 rtld의 경우)와 프로그램을 시작합니다.스크립트의 필요 없이 직접 실행할 수도 있습니다.예를 들어 bash를 사용하여 단일 실행을 위해 환경 변수를 쉽게 변경할 수 있습니다.
LD_TRACE_LOADED_OBJECTS=1 /bin/echo
그ld.so
는 이 변수를 확인하여 필요한 모든 라이브러리와 해당 라이브러리의 인쇄 로드 주소를 해결합니다.하지만 이 변수 집합으로 인해ld.so
는 실제로 프로그램을 시작하지 않습니다(프로그램 또는 라이브러리의 정적 생성자에 대해서는 확실하지 않습니다).ASLR 기능이 비활성화되어 있는 경우 로드 주소는 대부분 동일합니다.최신 Linux에서는 ASLR이 활성화되어 있는 경우가 많기 때문에 비활성화하려면 를 사용합니다.
하면 ''이 수 있어요.system
libc.so
nm
binutils의 입니다.'아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예', '아예',nm -D /lib/libc.so
★★★★★★★★★★★★★★★★★」objdump -T /lib/libc.so
GREP가 되다.
, " "를 할 수 있습니다.dlopen()
메인 프로그램:
void *self = dlopen(NULL, RTLD_NOW);
dlsym(self, "system"); // returns the pointer to the system() function
컴파일 시 이름을 알고 있는 함수의 주소만 원하는 경우,void *addr = &system;
"소스로 바로 가서 말에게 물어보세요.."
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
'programing' 카테고리의 다른 글
vueJ에서 v-select v2.5.1에서 선택한 옵션의 ID를 바인딩하는 방법 (0) | 2022.08.11 |
---|---|
ArrayList의 contains() 메서드는 객체를 어떻게 평가합니까? (0) | 2022.08.11 |
공허한 게 무슨 소용이야? (0) | 2022.07.16 |
v-for 루프의 n번째 항목마다 항목 삽입 (0) | 2022.07.16 |
Vue.js가 컴포넌트 내에서 실행 중인 setInterval을 삭제합니다. (0) | 2022.07.16 |