동적 링커는 상호 교환 가능합니까?

동적 링커는 상호 교환 가능합니까?

동적 링커는 상호 교환 가능합니까?

예를 들어 gcc를 사용하여 다양한 동적 라이브러리에 연결되는 프로그램을 컴파일하고 해당 프로그램이 런타임에 gnu 링커와 함께 사용되어 동적 라이브러리 기호를 확인한다고 가정해 보겠습니다. 나는 gnu 링커를 사용하고 있지 않지만 다른 링커가 필요하거나 사용하고 싶습니다.

이것이 가능한가? 왜 안돼?

답변1

ld.so나는 "동적 링커"가 프로그램을 만들 때 사용되는 링커가 아니라 일반적으로 동적 링커/로더라고 불리는 것을 의미한다고 가정합니다 ld.

동적 링커/로더는 관련 C 라이브러리와 밀접하게 결합되어 있으며 심지어 그 일부이기도 합니다. Linux에서 여기서 설명한 대로 일반적인 로더는 GNU C 라이브러리용 로더입니다. 해당 기호를 보면 C 라이브러리에서 기호를 가져오는 것을 볼 수 있습니다.

$ nm -D /lib/ld-linux.so.2 | grep -E ' A|D '
00028898 D _dl_argv
00000000 A GLIBC_2.0
00000000 A GLIBC_2.1
00000000 A GLIBC_2.3
00000000 A GLIBC_2.4
00000000 A GLIBC_PRIVATE
00028f28 D __libc_enable_secure
00028f24 D __libc_stack_end
00029040 D _rtld_global
000288a0 D _rtld_global_ro

바라보다동적 링커/로더 자체는 "파일" 보고서에 따라 어떻게 동적으로 링크됩니까?작동 방식에 대해 자세히 알아보세요.

예를 들어 자체 동적 로더를 제공하는 C 라이브러리 대신머슬러x86_64에서 "인터프리터"는 다음과 같이 지정됩니다 /lib/ld-musl-x86_64.so.1. 다음은 musl C 라이브러리 자체에 대한 링크입니다.

$ ls -l /lib/ld-musl-x86_64.so.1
lrwxrwxrwx 1 root root 25 Jan 23  2019 /lib/ld-musl-x86_64.so.1 -> x86_64-linux-musl/libc.so

로더는 관련 C 라이브러리에서 제공하는 기능에 의존하며 그 반대의 경우도 마찬가지입니다. 그것회의기술적으로 특정 로더를 호환 가능한 구현으로 바꾸는 것이 가능하지만 최소한 기존 로더를 효과적으로 다시 작성하게 됩니다. 동적 로더의 기본 사양은 잘 정의되고 제한되어 있지만 - ELF 바이너리(Linux에서) 로드, 관련 동적 라이브러리, 필요한 재배치 수행 등 - 다른 로더를 사용하는 것을 상상할 수도 있습니다. 주어진 로더를 대체하지만 구현 세부 사항이 중요합니다. .

각 동적 로더가 서로 다른 표준 이름을 갖는 한 단일 시스템에는 프로그램 재량에 따라 사용되는 서로 다른 로더가 있을 수 있습니다. 이것이 바로 GNU C 라이브러리 기반 시스템을 사용하여 musl 바이너리를 빌드하고 실행할 수 있는 이유입니다.llvm-libclibc.so.5, 심지어 역사적으로도 에서 로 전환되었습니다 libc.so.6.

답변2

상호 교환이 가능해야 합니다.

ld예를 들어 vs에 대한 좋은 토론은 gold여기에서 찾을 수 있습니다.https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience

또한 다음 사항을 확인하세요.https://stackoverflow.com/questions/29361801/is-the-lld-linker-a-drop-in-replacement-for-ld-and-gold

LLVM 프로젝트의 LLD도 있는데, 이는가장 빠른그들 모두의.

관련 정보