2012-12-26 102 views
2

GCC manual,有下列選項整體:GCC的「-wrapper」標誌是做什麼的?

-wrapper
調用的包裝方案下的所有子命令。
包裝程序的名稱及其參數
作爲逗號分隔列表傳遞。

GCC -c T.C -wrapper GDB, - ARGS

這將調用所有的gcc子程序下gdb --args', thus the invocation of cc1 will be GDB --args CC1 ......「。

我無法理解該示例和標誌的用途。

gcc -c t.c將創建一個t.o
然後呢?目標文件被髮送到gdb?
或者是gdb被賦予創建目標文件的責任(正在添加調試信息)?

回答

2

是,用於調試編譯器本身。或者「跟蹤」編譯器中發生的事情 - 例如,您可以通過添加一個程序來打印傳遞給cc1本身的參數,然後運行cc1。

gdb不負責產生任何東西,它只是披着cc1 whihc是「正確的編譯器」 - 當您運行gcc -c t.c編譯器第一次運行cpp -o t.i t.c來預處理t.c文件。然後,它運行cc1 -o t.s t.i最後as -o t.o t.s(或類似的規定與包裝物,它會運行這些命令,例如,gdb --args cc1 -o t.s t.i

編輯:這是當然簡單得多相比,一個「真正的」編譯 - 還有一大堆的傳遞給cc1參數等

1

在編譯過程中gcc調用其他一些程序(實際彙編器,連接),並與-wrapper標誌調用它們在所述包裝。在你的例子中,所有子命令都在gdb內執行,這對於調試gcc很有用。

又如:把所有調用的子命令列表中一個可以在echo包裝它們(當然,他們沒有執行這樣):

$ gcc 1.c -wrapper echo 
/usr/lib/gcc/x86_64-linux-gnu/4.6/cc1 -quiet -imultilib . -imultiarch x86_64-linux-gnu 1.c -quiet -dumpbase 1.c -mtune=generic -march=x86-64 -auxbase 1 -fstack-protector -o /tmp/cc7cQrsT.s 
as --64 -o /tmp/ccaLYkv9.o /tmp/cc7cQrsT.s 
/usr/lib/gcc/x86_64-linux-gnu/4.6/collect2 --sysroot=/ --build-id --no-add-needed --as-needed --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.. /tmp/ccaLYkv9.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.6/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o 
0

你可能已經嘗試過了一個簡單的Hello World。

GCC會調用不同的子命令。每個子命令將包裝作爲前綴。給予GDB作爲包裝意味着您要調試編譯器。