/bin/bash
무엇보다도 공유 객체 종속성이 고려됩니다 /lib64/ld-linux-x86-64.so.2
(동적 링커/로더):
ldd /bin/bash
linux-vdso.so.1 (0x00007fffd0887000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000)
검사 결과 /lib64/ld-linux-x86-64.so.2
심볼릭 링크인 것으로 나타났습니다 /lib/x86_64-linux-gnu/ld-2.28.so
.
ls -la /lib64/ld-linux-x86-64.so.2
lrwxrwxrwx 1 root root 32 May 1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so
또한 file
보고서 /lib/x86_64-linux-gnu/ld-2.28.so
자체를 동적으로 연결할 수 있습니다.
file -L /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
나는 알고 싶다:
- 동적 링커/로더() 자체는 어떻게
/lib64/ld-linux-x86-64.so.2
동적으로 연결됩니까? 런타임에 자체적으로 링크됩니까? /lib/x86_64-linux-gnu/ld-2.28.so
a.out 바이너리(man ld.so
) 를 처리하는 것으로 문서화되어 있지만/bin/bash
ELF는 실행 파일입니까?
ld.so 프로그램은 오래 전에 사용된 형식인 a.out 바이너리를 처리합니다(libc5의 경우 /lib/ld-linux.so.1, glibc2 ld-linux.so의 경우 /lib/). 2) ELF를 처리하며 모두가 수년 동안 사용해 왔습니다.
답변1
예, 초기화 시 자체적으로 연결됩니다. 기술적으로 동적 링커 자체는 개체 확인 및 재배치를 필요로 하지 않습니다. 왜냐하면 개체를 있는 그대로 완전히 해결하기 때문입니다. 그러나 기호를 정의하고 "해석"하는 바이너리를 구문 분석할 때 이러한 기호를 처리해야 하며 이러한 기호는 개체를 가리키도록 업데이트됩니다. 로드된 라이브러리에서 구현합니다. 특히 이는 영향을 미칩니다
malloc
. 링커에는 해당 기호가 포함된 최소 버전이 내장되어 있지만 일단 로드되고 재배치되면 C 라이브러리 버전(또는 삽입된 버전이라도)으로 대체되므로 주의가 필요합니다. 링커가 손상될 수 있는 경우 이러한 일이 발생하지 않도록 합니다.피투성이의 세부 사항은 다음과 같습니다
rtld.c
dl_main
, 함수 에서 .ld.so
하지만 외부 종속성이 없다는 점에 유의하세요 . 관련된 기호를 볼 수 있습니다nm -D
. 그 중 정의되지 않은 기호는 없습니다.에 직접 있는 맨페이지에 대한 참조만
/lib
,즉/lib/ld.so
(libc 5 동적 링커, 지원a.out
) 및/lib*/ld-linux*.so*
(libc 6 동적 링커, ELF 지원). 맨페이지는매우구체적으로는ld.so
그렇지 않습니다ld-2.28.so
.현재 대다수 시스템의 동적 링커에는
a.out
지원이 포함되어 있지 않습니다.
file
ldd
동적 링커는 정적으로 링크된 바이너리를 구성하는 요소에 대한 정의가 다르기 때문에 동적 링커에 대해 서로 다른 내용을 보고합니다 . 의 ldd
경우 바이너리에 DT_NEEDED
기호가 없으면 정적으로 링크됩니다.즉정의되지 않은 기호가 없습니다. 의 경우 file
ELF 바이너리에 PT_DYNAMIC
섹션이 없으면 정적으로 링크됩니다(이는 다음 5.37 릴리스에서 변경됩니다 file
. 이제PT_INTERP
사용 섹션의 존재코드의 주석과 일치하는 동적으로 연결된 바이너리의 표시기입니다.
GNU C 라이브러리 동적 링커에는 기호가 없지만 DT_NEEDED
섹션이 있습니다 PT_DYNAMIC
(기술적으로 공유 라이브러리이므로). 결과적으로 ldd
(즉, 동적 링커)는 정적으로 연결되었음을 나타내지만 file
동적으로 연결되었음을 나타내지는 않습니다. 섹션이 없으므로 PT_INTERP
다음 버전에서는 file
정적으로 링크되어 있음도 표시됩니다.
$ ldd /lib64/ld-linux-x86-64.so.2
statically linked
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
( file
5.35)
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(현재 개발 중인 버전 file
).
답변2
file
동적 링커/로더 자체와의 동적 연결에 대해 프로그램이 잘못된 것 같습니다 . 프로그램이ldd
동의하지 않습니다. 적어도 내 시스템에는 없습니다(Debian Stretch):ldd /lib/x86_64-linux-gnu/ld-2.24.so statically linked
man ld.so
또한 읽어보세요:"ld-linux.so*가 ELF를 처리합니다". 귀하의 시스템(그리고 제 시스템)에서는 둘 다 동일한 바이너리를 가리키는 심볼릭 링크입니다. 이는 ELF와 (오래된) a.out 형식을 모두 처리할 수 있다고 추론합니다.