2010-02-07 157 views
6

不必要的目標文件請看下面的例子編譯與海灣合作委員會

g++ a.o b.o c.o -o prog 

如果是情況c.o不提供任何可執行代碼prog,也沒有關於c.o任何依賴於任何其他文件, GCC還會在prog中包含c.o的內容嗎?

換句話說,除了編譯時間之外,編譯不必要的文件到可執行文件會產生什麼(如果有)負面影響?

在此先感謝;乾杯!

+0

您可以嘗試使用和不使用額外庫的鏈接,並查看可執行文件是否具有相同的大小。 – 2010-02-07 03:57:32

+0

我不瞭解GCC,但MSVC將包含所有.obj文件的內容,無論您是否引用它們,但它只包含您引用的.lib文件的各個部分。我希望GCC是相同的 – 2010-02-07 04:03:42

+2

所描述的步驟通常稱爲「鏈接」。術語「編譯」通常用於描述目標文件的生成。 – MSalters 2010-02-08 10:57:16

回答

5

除了您的可執行文件可能不必要的大,沒有任何負面影響。鏈接器可能會死掉未使用的代碼,這會使事情退步。您可以在輸出可執行文件上使用某種對象查看工具(otoolobjdump,nm等)來查看您的程序是否有額外的符號。

我使用的是Mac,所以會有一定的差異,如果您使用的是一套標準的GCC工具,但這裏有一個例子:

$ make 
gcc -o app main.c file2.c 
gcc -Wl,-dead_strip -o app_strip main.c file2.c 
$ ls -l app* 
-rwxr-xr-x 1 carl staff 8744 Feb 6 20:05 app 
-rwxr-xr-x 1 carl staff 8704 Feb 6 20:05 app_strip 

我認爲在非蘋果GCC世界,在我的例子中,你可以通過-Wl,--gc-sections而不是-Wl,-dead_strip。在兩個可執行文件,你可以看到大小不同的是,由於額外的功能被剝離:

$ nm app | cut -c 20- > app.txt 
$ nm app_strip | cut -c 20- > app_strip.txt 
$ diff app.txt app_strip.txt 
8d7 
< _function2 
2

我剛剛與我目前使用的一些C代碼試了一下 - 我在這包含的方法不是一個對象鏈接(還)在程序中的其他地方使用。該代碼包含在生成的可執行文件中,通過運行nm對elf文件進行檢查,並觀察到方法T確實存在,即使使用了-O2和-O3。

3

llvm可以消除鏈接步驟中的死碼。它使用特殊鏈接器llvm-ld

此外,使用-fwhole-ipo(intel)將有助於將死去的符號分離出去。

1

是的,GCC將包含所有的目標文件。使用最新的編譯器(開發版本4.5.0),您可以使用-flto(鏈接時優化)來執行該操作。

相關問題