簡體   English   中英

如何確定默認情況下 gcc 傳遞給 ld 的命令行選項?

[英]How to determine which command line options gcc passes to ld by default?

考慮 hello world C 程序:

你好.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

但是,如果我直接調用 ld [2]而不是[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 在命令[1]傳遞給 ld 的確切內容?

是的,您可以使用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的別名。

對於在線愛好者:

echo "int main(void) {}" | gcc -o /dev/null -v -x c - &> /dev/stdout| grep collect | tr -s " " "\012"

-xc替換為-x c++以獲取 c++ 標志。

也可以與 clang 一起使用,但在這種情況下,您應該 grep for /usr/bin/ld

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM