내 이해에 따르면 so
파일은 동적 라이브러리입니다. 이를 사용하여 ldd
종속성을 인쇄할 수 있습니다.
ldd -r /usr/lib/aarch64-linux-gnu/libstdc++.so.6
예를 들어 다음과 같은 출력을 얻기 위해 실행할 수 있습니다 .
linux-vdso.so.1 => (0x0000ffff793f7000)
libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffff79173000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff7902c000)
/lib/ld-linux-aarch64.so.1 (0x0000aaaae0a5d000)
libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000ffff7900b000)
그런데 오늘 실행해보니 ldd -r /lib/ld-linux-aarch64.so.1
다음과 같은 결과가 나왔습니다.
statically linked
이 출력이 나타나는 이유는 무엇입니까? 무슨 뜻이에요?
답변1
이 파일은 동적 라이브러리를 사용하지 않지만 실행 파일에 라이브러리의 필수 부분을 포함합니다.
따라서 ldd
파일에 대해 아무 것도 알 수 없습니다.
이는 실행 파일에 동적 라이브러리가 필요하지 않다는 의미이지만 라이브러리의 버그 수정으로 인한 이점을 얻을 수 없으며 커널 인터페이스가 변경되면 정적 실행 파일이 변경 후 새 커널에서 작동하지 않는다는 의미이기도 합니다.
run time linker
특별한 경우 런타임 시 동적 라이브러리를 기본 바이너리에 연결하는 데 사용되는 소위 메서드를 확인 mmap()
하고 동적 라이브러리 호출에 대한 올바른 오프셋을 생성하여 확인합니다. 런타임 링커가 작업을 수행하므로 다른 동적 개체에 의존할 수 없습니다.