単純な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.o
とcrtend.o
のようないくつかのオブジェクトが相互にリンクされていることを見ることができました。しかし、リンカは、これらのファイルを結合する必要があることをどのように知っていますか?
標準のCライブラリを使用したくない場合、これらの関数の定義を含むオブジェクトファイルのディレクトリが指定されている場合、渡す必要があるファイルを知る方法それは未知のシンボルについて不平を言うことはありませんように、リンカに?