假設我正在用GCC
編譯一個簡單的Hello World程序。鏈接器如何知道哪些檔案鏈接在一起?
當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庫,當給定一個包含這些函數定義的目標文件的目錄時,如何知道需要傳遞的文件鏈接器,以便它不會抱怨未知的符號?