動的リンカーは交換可能ですか?
たとえば、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もあります。最速それらすべての。