ダイナミックリンカーは交換可能ですか?
たとえば、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.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ライブラリが提供する機能に依存しており、その逆も同様です。だろう技術的には、特定のローダーを互換性のある実装に置き換えることは可能ですが、少なくとも既存のローダーを実質的に書き直すことになります。動的ローダーの基本仕様は明確に定義され、制限されています (Linux 上の ELF バイナリ、関連する動的ライブラリのロード、必要な再配置の実行など)。そのため、特定のローダーを別のローダーに置き換えることが考えられますが、実装の詳細はすべて重要です。
各動的ローダーが異なる正規名を持つ限り、単一のシステムで異なるローダーを持つことが可能であり、プログラムによって適切に使用される。これにより、GNU Cライブラリベースのシステムを使用してmuslバイナリをビルドおよび実行できるようになり、次のような取り組みへの道が開かれる。llvm-libclibc.so.5
、あるいは歴史的には、からへの切り替えですlibc.so.6
。
答え2
それらは互換性がある必要があります。
ld
eg 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もあり、これは最速それらすべて。