2010-11-11 116 views
10

除了使用-nostdlib和鏈接crt1.o -lc -lgcc自己,有沒有簡單的方法,以防止從GCC連接crtbegin[S].ocrtend[S].o?這些文件並不是那麼大,但是我正在製作小的二進制文件,並且想要刪除C程序不需要的無用的C++支持代碼。 (據推測,如果你使用C++庫和全局對象變量,gcc甚至可以將它們鏈接到C程序中,我會告誡大家應該如何在全局對象引用的地方生成安全的一次性初始化調用C++模塊,而不是main之前初始化的全局對象...)有沒有一種簡單的方法可以讓gcc忽略crtbegin.o/crtend.o?

我不會反對黑客攻擊的GCC specs文件,使C++這樣,和這樣的條件支持文件的鏈接,但我不知道我會怎麼做。也許有一個很好的方法?

+0

我相信它們是'__attribute__((構造函數))'(和'析構函數')函數所需要的。 (和我從一個C++高手很遠,但我被告知,以符合標準的,全局構造也出現之前'發生的main()'被調用。) – caf 2010-11-11 07:29:34

+0

@caf:我的印象是,下C++標準規定,構造函數的調用在程序調用並在第一時間之間的未指定的時間的對象被使用(當然在未指定的順序,除了其中一個對象引用另一個,從而調用「它的​​使用第一次」的情況下) 。你有沒有提到相反的? – 2010-11-11 07:40:13

+0

可能會是一個「雞蛋吸教」,但你有沒有試過用'gcc'編譯,而直接進入你的系統的連接(可能是'ld')爲實際的鏈接步驟,讓你有過聯繫更大的控制權? – 2010-11-11 07:49:47

回答

6
gcc -wrapper sh,-c,'z= ; for i ; do [ "$z" ] || set -- ; z=1 ; 
    case "$i" in *crtbegin*.o|*crtend*.o) ;; *) set -- "[email protected]" "$i" ;; esac ; 
    done ; exec "$0" "[email protected]"' 
+1

有人可以解釋上述腳本中發生了什麼嗎? – 2015-02-25 07:40:06

+0

@ 4aRkKn1gh7:'-wrapper'選項讓gcc調用它通過包裝程序運行的外部命令。包裝程序是一個shell腳本,它在調用請求的命令之前刪除任何匹配'* crtbegin * .o'或'* crtend * .o'的參數。它只是在命令行上內聯寫入,而不是將腳本保存到文件中。 – 2015-02-25 19:03:42

3

我認爲你需要的-nostartfiles選項。無論如何,這就是我所需要的嵌入式內容。

+1

這是一個很好的開始(沒有雙關語意思),但它也省略了包含'_start'入口點的'crt1.o'。 – 2010-11-11 07:42:12

+0

@R ..:我相信你可以在連接腳本中設置ENTRYPOINT。 – leppie 2010-11-11 07:49:17

+0

是的,我知道我可以這樣做,但這比找到'crt1.o'的路徑並使用'gcc'命令行進行鏈接要糟糕得多。基本上我正在尋找最接近可移植的方式來讓gcc不要鏈接不必要的東西,而答案似乎是沒有。 – 2010-11-11 08:21:14

相關問題