程序已經加載到內存中。我需要知道程序源代碼中的所有函數地址及其大小(使用nm等工具即可)。所有功能的意思是,包括像「printf」這樣的加載共享庫函數,並且應該是實際函數地址,而不是PLT地址。我怎麼能實現這一點?當程序在Linux下運行時,如何知道所有函數(包括共享庫)的地址和大小?
-1
A
回答
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)。你會發現功能代碼可能會有令人驚訝的甚至是很差的「界限」。
相關問題
- 1. 如何在運行時知道數據庫大小
- 2. 線程如何知道共享變量的地址
- 3. 在運行時知道類的大小
- 4. 如何知道Linux中程序崩潰的地址?
- 5. 如何縮小共享庫的大小?
- 6. 不能隱式地在共享庫中包含運行時/ cgo
- 7. 當不知道運行時的大小時提供正確的圖像大小
- 8. 如何定義運行時已知大小的CUDA共享內存?
- 9. 如何知道在運行時鏈接的共享對象的內存分配大小?
- 10. 無法運行共享Groovy庫函數
- 11. 當程序啓動時運行所有的tkinter函數
- 12. 如何知道在Django上下文中共享此文件的所有者?
- 13. 運行時共享庫
- 14. 在運行時獲取Linux內核函數的結束地址
- 15. 共享對象和包含沒有安裝在Linux下的C++
- 16. 如何超時運行的函數及其在Linux上的所有子進程?
- 17. 如何知道運行時佔用的堆大小
- 18. 在Linux中查找共享庫的加載地址
- 19. 只有在運行時才知道程序包名稱時,如何使用__import __()導入程序包?
- 20. 多箇中斷處理程序共享地址如何多箇中斷處理程序共享地址0x00000018
- 21. 在共享庫中的地址分配
- 22. 遠程文件的大小不知道獲取運行時間
- 23. 當應用程序運行時最小化所有正在運行的窗口
- 24. 當超過最大緩存大小時想知道數據庫行爲
- 25. Linux共享庫
- 26. 如何在程序中檢查共享庫暴露函數
- 27. 如何在Go中調用Linux共享庫函數?
- 28. 知道Windows Phone中USB共享接口的IP地址
- 29. 共享庫文件大小
- 30. 如何在運行MPI程序時知道錯誤進程號?
你爲什麼問?你爲什麼需要這些信息?你會用它做什麼? – 2014-11-21 06:31:56
我在做研究。所以這在工程中可能不那麼有意義。 – WindChaser 2014-11-21 15:52:42
有趣的是,哪種研究激發了你的問題......(我們中有些人是研究人員,所以你可能對你的動機感興趣)。 – 2014-11-21 16:24:09