cc(1)
を使用してプログラムをリンクすると、デフォルトのリンカーコマンドが呼び出されます。たとえば、あなたのバージョンのコンパイラは、UNIXのようなプラットフォームではデフォルトで/ usr/bin/ldを使うようにビルドされているかもしれません。'cc'とリンクするときに代替リンカーコマンドを指定する方法
cc(1)
(またはc++(1)
)が(例えば、/usr/local/bin/ld
代わり/usr/bin/ld
の)使用することを異なるリンカーコマンドを指定する方法はありますか?私は主にgccとclangに興味があります。
私は、さまざまなコンパイルステップを別々に実行する方法(たとえば、前処理、コンパイル、アセンブル、リンク)を必要としない方法を探していません。
例えば、私はこの仕事をするかもしれないような何かを期待していた:
env LD=/usr/local/bin/ld cc foo.c -o foo
をしかし、それはGCCや打ち鳴らすために動作しません。あなたが最初のオブジェクトファイルを構築し、メイクファイルを持っていた場合には、当然のことながら、働くだろう、そしてリンクに$ {LDを}呼び出された(例えば、env LD=/usr/local/bin/ld make
)
更新(一つの可能な動機で):簡単にテストするには既定のリンカーとは異なるリンカーです。例えば、これを行うことができるようにいいだろう:
cc --linker=/usr/local/bin/ld foo.c -o foo
は代わりに、あなたは、オブジェクトファイルを生成しませんld
に引数を把握するためにcc -v
を実行して、手動のものとしたいld
を実行する必要があります引数:
cc -c foo.c
cc -v foo.c -o /dev/null
リンカの呼び出しを見て、リンカと一時オブジェクトファイルを置き換えて手動でコピー/ペーストします。このような何か(フェドーラ23上のテストから取られた例)あなたは/usr/local/bin/ld
と/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/collect2
を交換する(それはまさにではありませんが、collect2
と同じ):
/usr/local/bin/ld -plugin /usr/libexec/gcc/x86_64-redhat-linux/5.3.1/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper -plugin-opt=-fresolution=/tmp/jhein/ccM2XKIg.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o c /usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/5.3.1/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/5.3.1 -L/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../.. c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/5.3.1/crtend.o /usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../lib64/crtn.o
あなたはそれが簡単ではない、見ることができるように。 collect2がリンカープログラムを探す方法については、gcc infoページのドキュメントを参照してください。しかし、これらのドキュメントによれば、最初に見えるのは、環境変数やコマンドラインで指定できるもの(例えば、--linker)ではありません。ドキュメントでは、 "ハードコーディングされたリンカファイル名"については、の最初の文字がとなっています。そのドキュメントが正しい場合、そのリンカーを使用しないように強制する(つまり、それを騙す)ためには、デフォルトのリンカーの名前を変更する必要があります(例:sudo mv /usr/bin/ld /usr/bin/ld.tmp-disable
)。
更新2:-B
を使用すると、私のニーズに十分に対応しているようです。私が答えを投稿したところを見てください。私は自分の答えを受け入れることはできませんが、できれば私はします。問題をうまく解決するようです。
'cc'は' gcc'、 'clang'、またはあなたのシステムが使うデフォルトのCコンパイラのエイリアスです。 –
はい、同意します。確かにそうだ。あなたはgccやclangの質問に対する答えを持っていますか? – Juan
'gcc'の' -c'フラグを試すことができます。 –