11

hello world C プログラムを考えてみましょう:

こんにちは

#include "stdio.h"

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

私が電話した場合:

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

ELF 再配置可能ファイルhello.oが生成されます。

次に電話すると:

$ gcc hello.o -o hello            [1]

hello.o を ld にリンクし、ELF 実行可能ファイルhelloを生成します。

[2]ただし、代わりにld を直接呼び出す場合[1]:

$ 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 は ld に他のオプションを渡す必要があります (たとえば、C ライブラリをリンクするため)。

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

4

2 に答える 2

19

はい、gcc -v hello.o -o helloリンク行を取得するために使用できます。私のubuntuマシンでの例では、次のリンク行を取得します(読みやすくするために複数行に編集されています):

/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

collect2は単なるエイリアスであることに注意してくださいld

于 2013-01-19T19:55:01.257 に答える