2011-03-16 141 views
0

我們有一個運行在嵌入式oOS上的程序。我們通常在輸出二進制文件中嵌入一個版本字符串,用於識別生成二進制文件時包含的所有版本。通常,我們使用的編譯器可以通過創建一個「undefined」符號來確保版本字符串在二進制文件中,然後由我們的版本字符串解析。在gcc中定義鏈接符號

但是,我們現在已經轉移到基於Linux的系統和gcc。

gcc正在從最終的exe中刪除版本字符串。最終的exe是通過鏈接在一堆庫中創建的。每個庫都嵌入了一個版本字符串。

gcc正在刪除版本字符串,因爲沒有任何內容引用該字符串,並且我們已打開-Os優化。

有沒有辦法確保gcc不去掉一串字符串(我們需要嵌入大約5-10個版本字符串)?

謝謝。

回答

2

好,解決這一點,我們在交流的文件這樣做:

const char _string_[] = "some string"; 

然後包括對象文件在最後一個鏈接:

gcc <snip> -Wl,--start-group string.o <snip> -Wl,--end-group -Wl,--strip-all -o final.exe 
1

嘗試用--retain符號文件(選項鍊接)

ldmangpage工作:

--retain符號文件的文件名 只保留中列出的符號文件的文件名,丟棄所有其他文件。 filename只是一個平面文件,每行一個符號名稱。此選項在環境(如VxWorks)中逐漸累積大型全局符號表時特別有用,以節省運行時內存。

--retain-symbols-file不會丟棄未定義的符號或重定位所需的符號。

您只能在命令行中指定--retain-symbols-file一次。它覆蓋了-s和-S。

編輯我剛剛注意到上面引用的文檔的最後一行。它將覆蓋「脫光所有」選項,所以我不知道這會幫助你...

+0

嗨,不幸的是,它似乎沒有按照通緝。如前所述,現在保留所有其他不需要的符號。因爲這不是一個主要的問題,因爲它將19k添加到最終的二進制文件中。 – user626201 2011-03-17 06:51:09