2013-01-19 11 views
9

はハローワールドCプログラムを考えてみましょう:gccがデフォルトでldに渡すコマンドラインオプションを特定する方法は?

のhello.c

#include "stdio.h" 

int main() 
{ 
     printf("Hello, World!\n"); 
} 

私が呼び出す場合:

$ gcc -c hello.c -o hello.o 

それは、hello.o

ELF再配置可能ファイルを生成します

次に、電話する場合:

​​

それは私がLDの代わりに[1]の直接[2]呼び出す場合は

ハローLDとhello.oリンクし、ELF実行可能ファイルを生成します。

$ ld hello.o -o hello    [2] 

を、私はこれらのエラーを取得:

/usr/bin/ld.bfd.real: warning: cannot find entry symbol _start 
test.c:(.text+0xa): undefined reference to `puts' 

gcc must ldに他のオプションを渡してください(例えば、Cライブラリをリンクするため)。

コマンドラインgccがコマンド[1]でldに渡っているものを正確に判断する方法はありますか?

答えて

15

はい、gcc -v hello.o -o helloを使用してリンク行を取得できます。 collect2ldためだけの別名であることを

/usr/lib/gcc/x86_64-linux-gnu/4.4.5/collect2 
--build-id 
--eh-frame-hdr 
-m elf_x86_64 
--hash-style=gnu 
-dynamic-linker 
/lib64/ld-linux-x86-64.so.2 
-o hello 
-z relro 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crti.o 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtbegin.o 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib 
-L/lib/../lib 
-L/usr/lib/../lib 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../.. -L/usr/lib/x86_64-linux-gnu 
hello.o 
-lgcc 
--as-needed -lgcc_s --no-as-needed 
-lc 
-lgcc 
--as-needed -lgcc_s --no-as-needed 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtend.o 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crtn.o 

注:私のUbuntuマシンでご例えば、私は(読みやすくするために複数行であることを編集した)このリンク行を取得します。

+1

私のUbuntu 12.10 64の箱のようです。 'collect2'は' ld'の単純なエイリアスではありません。 'collect2'は実行可能ファイルですが、' ld'はperlスクリプトである 'hardened-ld'へのシンボリックリンクである' ld.bfd'へのシンボリックリンクです。何が起こっているのか分かりません。 –

+1

申し訳ありませんが、私はリテラルエイリアスを意味しません。代わりに 'ld'で同じコマンドを実行すると、同じように動作します。 Docs:http://gcc.gnu.org/onlinedocs/gcc-4.3.5/gccint/Collect2.html –

+0

'collect2'と' ld'の違いは何ですか? gccintを読んだ後、簡単に理解できませんでした。 –

関連する問題