2014-02-24 101 views
0

我有學習makefile項目。我使用的GNU GCC和作爲連​​接器,我用下面的參數在gcc:鏈接器語法:鏈接器不會在鏈接過程中使用所有鏈接器的標記

linkerCmdLine=$(exe) -Wl,--start-group -nostdlib -Map=test_mapfile.map -l:libc.a -l:libgcc.a -l:libm.a -Wl,--end-group -o $(output)

在關聯過程中,連接器不使用所有這些標誌: 不使用標誌-Map=test_mapfile.map

爲什麼?

有一個項目設置文件,在這個文件中還存儲了鏈接器設置。

\u201ClinkerCmdLine\=$(exe) -Wl, --start-group -nostdlib -Map\=./99_output/PUZ_GPF.map --gc-sections -l\:libc.a -l\:libgcc.a -l\:libm.a -Wl,--end-group -o $(output)\u201D

如何存儲設置是否正確?

編輯:

隨着地圖文件工作正常,但我有一個鏈接文件實際上問題。我只用以下標誌:

「linkerCmdLine = $(EXE)輪候冊,--script = C:/workspace/test_project/test_linker_file.ld -static -o $(輸出)」

我得到此錯誤在控制檯窗口:

臂-NONE-EABI-gcc.exe:錯誤:無法識別的命令行選項 '--script = C:/workspace/test_project/test_linker_file.ld'

我不不明白爲什麼,因爲映射文件和.ld文件屬於鏈接器標記。

回答

3

-Wl,前綴僅傳遞當前參數,逗號分隔鏈接器參數。所以爲了通過-z defs,你可以使用-Wl,-z,defs

該機制僅適用於真正的標誌,即當命令行中的位置不相關時。 -l參數不是標誌,並且gcc編譯器驅動程序將它們收集到一個單獨的列表中,並將它們傳遞到一個單獨的塊中。

所以這種技術不適用於你想要的確切命令行。另一方面,-nostdlib禁止默認的-lc -lgcc -lm

正常情況是海灣規範的規定(編譯器驅動程序的腳本)靜態鏈接時(這似乎是你想要做什麼),以周圍使用標準庫--start-group--end-group

所以我認爲

linkerCmdLine=$(exe) -Wl,-Map=test_mapfile.map -static -o $(output) 

應該爲你的情況下工作。