2014-11-20 13 views
-1

程序已經加載到內存中。我需要知道程序源代碼中的所有函數地址及其大小(使用nm等工具即可)。所有功能的意思是,包括像「printf」這樣的加載共享庫函數,並且應該是實際函數地址,而不是PLT地址。我怎麼能實現這一點?當程序在Linux下運行時,如何知道所有函數(包括共享庫)的地址和大小?

+0

你爲什麼問?你爲什麼需要這些信息?你會用它做什麼? – 2014-11-21 06:31:56

+0

我在做研究。所以這在工程中可能不那麼有意義。 – WindChaser 2014-11-21 15:52:42

+0

有趣的是,哪種研究激發了你的問題......(我們中有些人是研究人員,所以你可能對你的動機感興趣)。 – 2014-11-21 16:24:09

回答

1

我需要知道的程序源代碼 內的所有函數的地址和它們的大小(使用工具,如納米是OK)

您可以閱讀/proc/self/maps找出當前映射到所有ELF圖片你的過程,並在每一個上運行nm

這會給你所有的函數地址(共享庫,你就需要調整由拆遷nm輸出(你也/proc/self/maps獲得),和大多數的功能規格。

2

我不知道你的問題永遠是有道理的,即使Employed Russian's answer給出了一個實際有用的線索。

首先,在剝離可執行文件或庫static功能(包括static功能共享庫像libc)沒有明顯的ELF小號其次,一些編譯器能夠(使用函數或其他技術的克隆)在強烈優化以具有不連續的功能代碼時(例如,因爲兩個函數共享一個通用機器碼。 從某種意義上說,當編譯器正在優化tail-calls時也會發生這種情況。

並且大多數編譯器都能夠內聯函數調用(特別是未定義爲inline的函數)。使用link-time optimization(例如編譯爲的鏈接與gcc -flto -O3),它甚至可能發生在幾個翻譯單元之間。

您可以試用dladdr(3) & backtrace(3)。你會發現功能代碼可能會有令人驚訝的甚至是很差的「界限」。

相關問題