簡體   English   中英

調試二進制文件:如何轉儲每個符號來自哪個.a / .o?

[英]debug binary: How to dump which .a/.o each symbol came from?

我有一個啟用調試的二進制文件,與該文件靜態鏈接的.a文件的集合以及所有內容的源代碼。

如何獲得可解析的轉儲,列出最終可執行二進制文件中的每個符號名稱,以及它來自哪個.a和.o? (如果可能,請加上原始的.c / .cpp文件。)

我試圖繪制出的庫中有一系列的交叉依賴關系,循環依賴關系,甚至還有多個定義的符號,最終目的是重新創建構建系統。 舊的構建系統以某種方式設法將所有內容鏈接在一起。 (我認為這更多是偶然而不是設計...)

到目前為止,我已經嘗試過各種nm調用,但是似乎無法完全獲得此數據。 也許nm是錯誤的工具。

鏈接最終二進制文件時,有關哪個符號來自.o.a的信息丟失了。

由於您具有可用的調試信息,因此您可以知道每個符號的來源,這可以幫助您重建丟失的信息(或不可以:如果foo.c被編譯為foo1.ofoo2.ofoo3.o (例如,帶有不同的-DFOO=1等標志),然后填充到不同的存檔庫中,則沒有簡單的方法來判斷哪個對象將符號貢獻給了最終的二進制文件。希望您的舊構建系統還不錯。

所以,

# list of global symbols and their addresses
nm a.out | egrep ' [TDW] '

# dump source for every symbol
addr2line a.out < /list/of/addresses/from/above

# list all objects in all libraries
ar t *.a

現在,您有足夠的信息來將大多數符號映射到它們來自的對象。 在源文件名與目標文件名不匹配的源中,可能有<= 10%。 這些您必須手動解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM