我正在使用C++中的裸機cortex-M3來獲得樂趣和利潤。如何調試鏈接過程 - GCC/ld - STL C++
最近我決定嘗試使用STL庫,因爲我需要一些容器。 我認爲通過簡單地提供我的分配器,它不會向 最終二進制文件添加太多的代碼,因爲您只能得到您使用的內容。 我實際上甚至沒有期望STL (給出我的分配器)的任何鏈接過程,因爲我認爲它是全部模板代碼。
我正在用-fno-exception進行編譯。
不幸的是,我的二進制文件中增加了約600KB或更多。我用nm查找包含在最終二進制文件中的什麼符號 ,這對我來說似乎是個玩笑。名單很長 我不會試着去過去。雖然有一些微弱的符號。
我也看了在鏈接器生成的.map文件,我甚至發現scanf函數符號
.text 0x000158bc 0x30 /CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../arm-none-linux-gnueabi/libc/usr/lib/libc.a(sscanf.o)¶
0x000158bc __sscanf¶
0x000158bc sscanf¶
0x000158bc _IO_sscanf¶
$ arm-none-linux-gnueabi-nm binary | grep scanf
000158bc T _IO_sscanf
0003e5f4 T _IO_vfscanf
0003e5f4 T _IO_vfscanf_internal
000164a8 T _IO_vsscanf
00046814 T ___vfscanf
000158bc T __sscanf
00046814 T __vfscanf
000164a8 W __vsscanf
000158bc T sscanf
00046814 W vfscanf
000164a8 W vsscanf
如何調試呢?首先,我想了解GCC正在使用什麼來鏈接(我通過GCC鏈接)。我知道如果在文本段中找到符號,則使用整個段,但仍然太多。
任何有關如何解決這個問題的建議真的很感謝。
感謝, S.
我使用Code Sourcery的gcc版本4.6.3。 -Wl,-v選項非常有用。除了我傳遞給鏈接的標誌,它也包含以下 -lstdC++ -lm --start組-lgcc -lgcc_eh -lc --end組 現在我明白爲什麼,以及如何刪除它們。特別是我認爲gcc_eh代表異常處理。任何建議或閱讀關於此? – emitrax 2012-07-22 08:29:08
如果你用'gcc',而不是'G ++鏈接'那麼它不會通過-lstdc''++的鏈接,而且還可能消除對'-lgcc -lgcc_eh'需要(我不記得的副手,我倒是要檢查),但如果不從這些庫使用任何代碼,那麼它不應該增加可執行文件的大小無論如何 - 冗長終止處理程序中的libstdC++可能是不需要的代碼 – 2012-07-22 11:31:30
什麼拉如果我用gcc它贏得找不到_List_node_base :: _ M_hook符號。通過-lstdC++包含其他所有內容。 爲了縮小這個問題,我試着直接連接ld,然後逐個添加這些標誌。它缺少的libstdC++ __aeabi_unwind_cpp_pr0一(list.o):(..._ List_node_base7_M_hookE) 然後指向libc,就是(memcpy和其他),然後鏈接一切。這是一個大型連鎖店和PITA。我只是想要一個容器。 :-) 我也認爲,因爲我有一個全局對象,它需要__static_initialization_and_destruction_0,我沒有想到。謝謝你的幫助。 – emitrax 2012-07-22 12:21:59