동적 링커/로더 자체는 "파일" 보고서에 따라 어떻게 동적으로 링크됩니까?

동적 링커/로더 자체는 "파일" 보고서에 따라 어떻게 동적으로 링크됩니까?

/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

나는 알고 싶다:

  1. 동적 링커/로더() 자체는 어떻게 /lib64/ld-linux-x86-64.so.2동적으로 연결됩니까? 런타임에 자체적으로 링크됩니까?
  2. /lib/x86_64-linux-gnu/ld-2.28.soa.out 바이너리( man ld.so) 를 처리하는 것으로 문서화되어 있지만 /bin/bashELF는 실행 파일입니까?

ld.so 프로그램은 오래 전에 사용된 형식인 a.out 바이너리를 처리합니다(libc5의 경우 /lib/ld-linux.so.1, glibc2 ld-linux.so의 경우 /lib/). 2) ELF를 처리하며 모두가 수년 동안 사용해 왔습니다.

답변1

  1. 예, 초기화 시 자체적으로 연결됩니다. 기술적으로 동적 링커 자체는 개체 확인 및 재배치를 필요로 하지 않습니다. 왜냐하면 개체를 있는 그대로 완전히 해결하기 때문입니다. 그러나 기호를 정의하고 "해석"하는 바이너리를 구문 분석할 때 이러한 기호를 처리해야 하며 이러한 기호는 개체를 가리키도록 업데이트됩니다. 로드된 라이브러리에서 구현합니다. 특히 이는 영향을 미칩니다 malloc. 링커에는 해당 기호가 포함된 최소 버전이 내장되어 있지만 일단 로드되고 재배치되면 C 라이브러리 버전(또는 삽입된 버전이라도)으로 대체되므로 주의가 필요합니다. 링커가 손상될 수 있는 경우 이러한 일이 발생하지 않도록 합니다.

    피투성이의 세부 사항은 다음과 같습니다rtld.cdl_main, 함수 에서 .

    ld.so하지만 외부 종속성이 없다는 점에 유의하세요 . 관련된 기호를 볼 수 있습니다 nm -D. 그 중 정의되지 않은 기호는 없습니다.

  2. 에 직접 있는 맨페이지에 대한 참조만 /lib, /lib/ld.so(libc 5 동적 링커, 지원 a.out) 및 /lib*/ld-linux*.so*(libc 6 동적 링커, ELF 지원). 맨페이지는매우구체적으로는 ld.so그렇지 않습니다 ld-2.28.so.

    현재 대다수 시스템의 동적 링커에는 a.out지원이 포함되어 있지 않습니다.

fileldd동적 링커는 정적으로 링크된 바이너리를 구성하는 요소에 대한 정의가 다르기 때문에 동적 링커에 대해 서로 다른 내용을 보고합니다 . 의 ldd경우 바이너리에 DT_NEEDED기호가 없으면 정적으로 링크됩니다.정의되지 않은 기호가 없습니다. 의 경우 fileELF 바이너리에 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

( file5.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

  1. file동적 링커/로더 자체와의 동적 연결에 대해 프로그램이 잘못된 것 같습니다 . 프로그램이 ldd동의하지 않습니다. 적어도 내 시스템에는 없습니다(Debian Stretch):

    ldd /lib/x86_64-linux-gnu/ld-2.24.so
        statically linked
    
  2. man ld.so또한 읽어보세요:"ld-linux.so*가 ELF를 처리합니다". 귀하의 시스템(그리고 제 시스템)에서는 둘 다 동일한 바이너리를 가리키는 심볼릭 링크입니다. 이는 ELF와 (오래된) a.out 형식을 모두 처리할 수 있다고 추론합니다.

관련 정보