これを試してみたいLLDLLVMから。ドキュメントはaptにあります。ここしかし、どのパッケージに実行可能ファイルが含まれているのかわかりませんlld
。
lld
目的はシステムの依存関係を排除するようですが、clangにはlld
組み込まれていません。 (まだありませんか?)
次の例を使用して、使用するかどうかlld
をテストします。GNU-ld
アーカイブファイルが表示される順序にはいくつかの制限がありますがlld
(私が正しく理解した場合)、これについてもっと寛大に見えるので、lld
この例ではうまく構築されます。しかし、私のボックスでは失敗しました。
# one.c
extern int two();
int main(int argc, char *argv[])
{
two();
return 0;
}
# two.c
void two(){}
$ clang -c two.c; ar cr two.a two.o ; clang -c one.c ; clang two.a one.o
one.o: In function `main':
one.c:(.text+0x19): undefined reference to `two'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
私たちが使用する場合-v
:
$ clang -c two.c; ar cr two.a two.o ; clang -c one.c ; clang -v two.a one.o
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8.2
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.0
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.2
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.0
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8
"/usr/bin/ld" -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../.. -L/lib -L/usr/lib two.a one.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o
one.o: In function `main':
one.c:(.text+0x19): undefined reference to `two'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
周囲電圧
Ubuntu clangバージョン3.4-1ubuntu3(tags / RELEASE_34 / final)(LLVM 3.4ベース)ターゲット:x86_64-pc-linux-gnuスレッドモデル:posix
答え1
2017年1月から、LLVM 適切なストレージlldも同じだ。スナップショットパッケージDebianで利用可能です(不安定な4.0から5.0から実験的)。バージョン5以降、lld
パッケージはDebian(lld-5.0
Debian 9および10、Debian 9および10以降のパッケージ、現在準備中のリリース)で利用可能になりましたstretch-backports
。lld-6.0
stretch-backports
lld-7
lld-8
buster-backports
DebianまたはUbuntuにアップストリームパッケージをインストールするには、指示に従ってください。配布できるように。
この回答が元々2015年2月に作成されたとき、LLVM 適切なストレージLLVM、Clang、コンパイラ-rt、ポリ、LLDBが含まれていることを意味します。 lldは含まれていません。でも最新のスナップショットパッケージDebian(LLVMパッケージと同じチームでのメンテナンス)にはlddは含まれていません。
答え2
lld がまだ Clang/LLVM 成熟度に達していないようなので、基本パッケージには含まれません。
LLVMのリンカーには少し混乱があります(私も混乱しています)。この答えの残りの部分は(元の質問に直接答えることはありませんが)、私たちが言う内容を定義するのに混乱を取り除くのに役立ちます!リンカーには3つのタイプがあります。
- LLVM-LD- LLVMビットファイルと実行可能なバイナリオブジェクトファイルのためのリンカのように聞こえます。しかし、ここに答えてください(およびリンク提供)は、LLVM 3.2でldlが削除されたことを示します。この時点で代替リンカーはなく、システムldリンカーを使用する必要があります。
- llvm - リンク– LLVM ビットファイルへの現在のリンカ。
- LLD- 実行可能なバイナリオブジェクトファイルのみをリンクするldを置き換えるために積極的に開発されたように聞こえます。この回答はここにあります2014年5月現在、活発に開発中だと明らかにしました。ホームディレクトリにリストされていますLLVMプロジェクト一覧#13のように。私は、それがGNU ld / goldを置き換えるためにメインLLVMパッケージに含まれるのに十分な時間が経つにつれて、より良くなり成熟するだろうと思います。
答え3
使用Ubuntuパッケージ検索ウェブサイト「lld-4.0」というパッケージを表示します。 Ubuntu開発ブランチには、ldd、特に "lld-5.0"を含むことができる他のパッケージがあります(clever。)
'lld-4.0'パッケージは 'lld'という名前ではなく実行可能ファイルをインストールします。たとえば、汎用ドライバ「lld-4.0」をインストールします。これを呼び出すと、Linuxで "ld.lld-4.0"を呼び出すように求められます。
Ubuntuでインストールされたパッケージをテストします。
which ld.lld-4.0
ld.lld-4.0 --version