2011-12-14 19 views
3

単純なHello WorldプログラムをGCCでコンパイルしているとします。 gcc -v hello-world.cで実行するとリンカーは、リンクするアーカイブをどのように知っていますか?

、我々はELFバイナリを生成し出力から最後の行を取得することができます:

/usr/libexec/gcc/x86_64-pc-linux-gnu/4.5.3/collect2 --eh-frame-hdr -m 
elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../lib64/crt1.o 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../lib64/crti.o 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/crtbegin.o 
-L/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../x86_64-pc-linux-gnu/lib 
-L/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../.. /tmp/ccRykv97.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/crtend.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../lib64/crtn.o 

この出力から、我々はcrtbegin.ocrtend.oのようないくつかのオブジェクトが相互にリンクされていることを見ることができました。しかし、リンカは、これらのファイルを結合する必要があることをどのように知っていますか?

標準のCライブラリを使用したくない場合、これらの関数の定義を含むオブジェクトファイルのディレクトリが指定されている場合、渡す必要があるファイルを知る方法それは未知のシンボルについて不平を言うことはありませんように、リンカに?

答えて

3

我々は実際では、ELFバイナリを生成し、実際のコマンドではないことをELFバイナリ

を生成し出力から最後の行を得ることができます。 collectldを呼び出し、コマンドがバイナリを生成します。

どのようにリンカはそれがないこれらのファイルは

をリンクする必要があることを知っているん。 GCC と書かれています(コマンドラインで入力してください)。

GCCにはコンパイル済みのspecsファイルがあります。このファイルはドメイン固有の小さなプログラムで、GCCにリンカにどのような引数を渡すべきかを指示します。

内蔵のspecsは、gcc -dumpspecsで調べることができます。プログラムが実際にはかなり複雑であることがわかります.は、-static-pieまたは-sharedでない場合にのみ使用されます。 -sharedcrtbeginS.oを意味し、-staticcrtbeginT.oを意味します。

私は

使用その場合の-nostdlibフラグ標準Cライブラリを使用しない場合。

リンカに使用する関数を定義

ものを渡すために必要なファイルを知っているか、これらの関数の定義を含むオブジェクトファイルのディレクトリを与えられました。 Thisが役に立ちます。

関連する問題