프로세스는 공유 라이브러리의 주소를 어떻게 알 수 있나요?

프로세스는 공유 라이브러리의 주소를 어떻게 알 수 있나요?

내가 이해한 바로는 C 소스 코드를 컴파일할 때 GCC/LD는 컴파일 타임에 주소 바인딩을 수행합니다. 일반적으로 이 주소는 0부터 시작합니다. 공유 라이브러리에서 함수를 호출할 때 컴파일러는 공유 라이브러리의 주소를 어떻게 미리 알 수 있나요? 나는 공유 라이브러리가 로드될 때 주소를 얻는다는 것을 알고 있습니다. 내가 틀렸다면 정정해주세요.

답변1

이것을 이해하는 데 도움이 될 수 있는 몇 가지 일이 있습니다.

ldd /usr/bin/cat

내 노트북에서 출력은 다음과 같습니다.

1771 % ldd /usr/bin/cat 
        linux-vdso.so.1 (0x00007ffc37fba000)
        libc.so.6 => /usr/lib/libc.so.6 (0x00007f1ea7018000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1ea73bc000)

동적 연결을 위한 실제 경로가 무엇인지 보여주는 정규화된 경로가 없다는 linux-vdso.so.1것을 알 수 있습니다 .libc.so.6lddlibc.so.6

다시 수행하여 확인하고 배울 수 있지만 ldd약간 변형하면 다음과 같습니다.

1790 % export LD_LIBRARY_PATH=/lib
1791 % ldd /usr/bin/cat 
        linux-vdso.so.1 (0x00007fff0a5a0000)
        libc.so.6 => /lib/libc.so.6 (0x00007fa257535000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa2578d9000)

/lib64/ld-linux-x86-64.so.2자세히 살펴보면 동적 링커( 이 경우)가 이제 /lib/libc.so.6C 라이브러리를 선택하는 것을 볼 수 있습니다 . 따라서 환경 변수 LD_LIBRARY_PATH는 동적 링크에 실제로 사용되는 파일을 결정하는 데 매우 중요합니다.

당신이 할 수 있는 또 다른 일은 다음과 같습니다 strace:

strace -o cat.trace /usr/bin/cat /etc/motd

이 파일은 cat.trace테마 프로세스에서 수행된 시스템 호출을 기록합니다. 이들 중 일부는 mmap()동적 링크로 나타나는 파일 입니다 . Google을 통해 검색하세요.lddmmap

추가 자료: man ld.so.

readelf명령이 설치되어 있는지, 설치할 수 있는지 또는 컴파일할 수 있는지 확인하세요 . 달리기 readelf -a /usr/bin/cat. 실제로ELF 사양제가 보기에는 이해가 안 되는 것 같지만,일부 좋아요ELF 형식정보저기. 그것을 찾아보십시오.

당신이 가지고 있다면musl libcmusl libc로 컴파일된 간단한 실행 파일에 대해 위와 동일한 실험을 수행하여 이를 설치하거나 설치할 수 있으면 매우 유익할 수 있습니다. 동적 연결처럼 복잡한 것조차도 동일한 운영 체제에서 두 개의 서로 다른 유효한 구현을 가질 수 있습니다.

관련 정보