다양한 `libc.so`의 차이점과 연결은 무엇입니까?

다양한 `libc.so`의 차이점과 연결은 무엇입니까?

Lubntu 18.04에서

$ whereis libc
libc: /usr/lib/x86_64-linux-gnu/libc.a /usr/lib/x86_64-linux-gnu/libc.so /usr/share/man/man7/libc.7.gz

$ locate libc.so
/lib/i386-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so

$ ls -li /usr/lib/x86_64-linux-gnu/libc.so  /lib/x86_64-linux-gnu/libc.so.6 /lib/i386-linux-gnu/libc.so.6
 2101838 lrwxrwxrwx 1 root root  12 Apr 16 16:14 /lib/i386-linux-gnu/libc.so.6 -> libc-2.27.so
 2101796 lrwxrwxrwx 1 root root  12 May 13 20:09 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.27.so
15736469 -rw-r--r-- 1 root root 298 Apr 16 16:14 /usr/lib/x86_64-linux-gnu/libc.so

그들 사이의 차이점과 연관성은 무엇입니까 libc.so?

어느 것이 사용되고 있나요?

감사해요.

내 질문은 다음에서 비롯됩니다.https://stackoverflow.com/questions/50798907/why-does-loading-the-libc-shared-library-have-libraryloader-object-is-not-cal

감사해요.

답변1

그들은 모두 다른 목적을 가지고 있습니다:

  • /lib/i386-linux-gnu/libc.so.632비트 실행 파일을 실행하는 데 사용되는 32비트 x86 C 라이브러리에 대한 심볼릭 링크입니다.
  • /lib/x86_64-linux-gnu/libc.so.664비트 실행 파일을 실행하는 데 사용되는 64비트 x86 C 라이브러리에 대한 심볼릭 링크입니다.
  • /usr/lib/x86_64-linux-gnu/libc.so(일반적으로) 64비트 C 라이브러리(해당하는 경우 동적 또는 공유)를 가리키는 링커 스크립트와협회64비트 실행 파일(빌드 시)

프로그램을 구축하고 실행할 때 세 가지 유형의 링크가 있습니다.

  • 정적 링크: 빌드 타임 링커( ld)는 빌드 중에 프로그램에 사용된 모든 개체를 구문 분석하고, 사용된 개체를 병합하고, 외부 라이브러리를 사용하지 않는 실행 가능한 바이너리를 생성합니다.
  • 빌드 시 동적 링크: ld프로그램에 사용된 모든 개체를 확인하지만 실행 파일에 저장하지 않고 해당 개체에 대한 참조만 저장합니다.
  • 런타임 동적 링커: 런타임 링커( ld.so) 또는 동적 링커는 실행 파일에 저장된 모든 참조를 확인하고, 필요한 모든 라이브러리를 로드하고, 프로그램을 실행하기 전에 모든 개체 참조를 업데이트합니다.

링커 스크립트 형식으로 libc.so제공되는 링커 스크립트 지시문 :ld

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a  AS_NEEDED ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) )

일반적으로 동적 라이브러리는 심볼릭 링크를 사용하여 간단히 설정됩니다( libfoo.so이는 사용되는 모든 것을 ld가리키며 일반적으로 현재 설치된 라이브러리 버전을 가리키는 심볼릭 링크입니다.libfoo.so.1ld.so예를 들어 libfoo.so.1.2.3). GNU C 라이브러리의 경우 동적으로 링크된 프로그램에는 여전히 정적 라이브러리의 일부 기호가 필요하지만 링커가 두 가지를 모두 시도할 수 있도록 대신 링커 스크립트가 사용됩니다. 링커 스크립트는 /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2실행 파일(에서)에 이름이 포함된 런타임(위)에 사용되는 동적 링커를 참조하기도 합니다 .interp.

"동적 링커"와 "동적 로더"라는 용어는 동의어이며 서로 바꿔 사용할 수 있습니다(참조:ld.so맨페이지).

관련 정보