我已經在我的系統上安裝了一個二進制文件,並希望查看給定函數的反彙編。最好使用objdump
,但其他解決方案也是可以接受的。使用objdump反彙編一個函數
From this questions我知道如果我只知道邊界地址,我可能會反彙編部分代碼。從this answer我學會了如何將我的拆分調試符號恢復爲單個文件。但即使在單個文件上運行,甚至拆卸所有代碼(即沒有開始或停止地址,但參數爲objdump
),我仍然沒有在任何地方看到該符號。這是有意義的,因爲所討論的函數是靜態的,所以它不會被導出。儘管如此,valgrind
將報告函數名稱,所以它必須存儲在某個地方。
看看調試部分的細節,我發現在.debug_str
部分提到的名稱,但我不知道一個工具,它可以把它變成一個地址範圍。
A小調側面說明:如果一個函數標記爲'static',它可能會被編譯器內聯到其呼叫站點。這可能意味着實際上可能沒有任何功能可以進行反彙編。如果您可以找到其他功能的符號,但找不到您正在查找的功能,這是一個強烈暗示該功能已被內聯的提示。 Valgrind可能仍然引用原始的預先內置函數,因爲ELF文件調試信息存儲每個單獨指令源自的位置,即使指令移動到別處。 – davidg
@davidg:是的,但是由於湯姆在這種情況下的回答,似乎並非如此。儘管如此,你是否知道一種方法,例如用每條指令來自哪裏的信息來註釋彙編代碼? – MvG
好聽! 'addr2line'將接受來自'stdin'的PC/IP並打印出相應的源代碼行。同樣,'objdump -l'會混合objdump和源代碼行;儘管對於高度優化的內聯代碼,兩個程序的結果並不總是特別有用。 – davidg