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

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

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

예를 들어 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

보다`file`에 의해 보고된 대로 동적 링커/로더 자체를 어떻게 동적으로 링크할 수 있습니까?이것이 어떻게 작동하는지 자세히 알아보세요.

대체 C 라이브러리는 자체 동적 로더를 제공합니다. 예를 들어 다음으로 작성된 프로그램은머슬x86_64에서는 "인터프리터"를 /lib/ld-musl-x86_64.so.1musl 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 라이브러리에서 제공하는 기능에 의존하며 그 반대의 경우도 마찬가지입니다. 그것~일 것이다기술적으로 특정 로더를 호환 가능한 구현으로 교체하는 것이 가능하지만 최소한 기존 로더를 효과적으로 다시 작성하게 됩니다. 동적 로더의 기본 사양은 잘 정의되고 제한되어 있지만(Linux에서 ELF 바이너리 로드, 관련 동적 라이브러리 및 필요한 재배치 수행 등) 따라서 특정 로더를 다른 로더로 교체하는 것을 상상할 수 있지만 구현 세부 사항은 다음과 같습니다. 모두 중요합니다.

각 동적 로더가 서로 다른 표준 이름을 갖는 한 단일 시스템이 프로그램에서 적절하게 사용되는 서로 다른 로더를 가질 수 있다는 점에 유의하십시오. 이것이 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도 있습니다.가장 빠른그중에서도.

관련 정보