我沒有源代碼,但有二進制。使用命令「nm binary_name」,我可以知道二進制內的函數。爲沒有源代碼的二進制功能,有沒有什麼辦法來獲取參數的數量
我可以知道一個函數有多少個參數?在solaris下,無論如何要這樣做?例如,如果函數是:func1(一個int,b int,c int),則有3個參數。
由於 丹尼爾
我沒有源代碼,但有二進制。使用命令「nm binary_name」,我可以知道二進制內的函數。爲沒有源代碼的二進制功能,有沒有什麼辦法來獲取參數的數量
我可以知道一個函數有多少個參數?在solaris下,無論如何要這樣做?例如,如果函數是:func1(一個int,b int,c int),則有3個參數。
由於 丹尼爾
在最低級別,如果您模擬機器上運行的函數,那麼它將從寄存器或未寫入的堆棧中讀取一些信息。如果您將這些讀數與平臺的ABI進行比較(您不會說是Sparc Solaris還是Intel Solaris),那麼其中一些應該對應於函數參數的寄存器/堆棧位置。當然,不能保證函數會讀取所有的參數。
對於Solaris,elfdump
比nm
(快速谷歌爲elfdump簽名表明請求,並且支援,但你需要檢查你有什麼版本)可能會給出更多的信息
假設這是C代碼,則沒有有沒有 - 在 編譯器/鏈接elides該信息。如果它是C++代碼,則可能會保留該函數的損壞名稱並且包含編碼形式的參數。
號尼爾·巴特沃思的建議審查該函數簽名是一個很好的一個C++(因爲參數經常編碼成功能,使鏈接器可以告訴"int x(int)"
和"int x(float)"
例如之間的差異),但對C,你將不得不弄髒你的手並拆開這個功能,特別要注意堆棧框架是如何在你的環境中構建和使用的。
請記住,SPARC有一個旋轉窗口堆棧,而不是常規的堆棧。你真的要深入研究CPU的工作方式。如果您正在與Intel討論Solaris,當然,旋轉堆棧不在那裏。
IDA Pro的(http://www.hex-rays.com/idapro/ )是一個反彙編程序,它在從目標代碼中推斷函數參數時非常聰明; 也許你也可以使用符號信息;例如。在Win32符號_function @ 8揭示了8個字節(2個參數)傳遞 一個還可以解碼C++的名字來獲取參數和類型
感謝皮特, 是完整的,如果我們可以運行程序,然後pstack運行過程可以顯示一個函數的參數個數並顯示這些參數的值。 – Daniel 2009-09-06 08:52:46