2010-02-08 76 views
5

我想寫一個小函數的示蹤器。我使用ptrace。如何找到共享庫符號的絕對地址?

當我看到一個CALL指令時,我想顯示相當於地址調用的函數名稱。

我的跟蹤器使用帶絕對地址的符號(符號在主二進制中定義)。 但我不知道如何獲得共享庫函數的虛擬內存中的絕對地址。例如,檢測對libc函數的調用。

我注意到共享庫中函數的地址是相對於文件的。

以下公式是否好?

Absolute address of symbol = address of the shared library in virtual memory + 
          relative address of the symbol. 

如何從共享庫中獲取符號的絕對地址?

+0

我認爲這個答案是操作系統特定的 – 2010-02-09 00:07:34

+0

是的,對於使用ELF可執行二進制格式的操作系統。比如Linux和一些* BSD(我相信NetBSD)。 – mctylr 2010-02-26 21:56:12

回答

0

只要你沒有描述你的工作系統,this article澄清至少所描述的任務可以解決一些情況,而不是所有。
如果我遇到你的情況,我會在內存和庫中搜索相應的二進制片段。然後,只要內存和庫對齊,問題就解決了。所以是的,只要圖書館不能作爲獨立部分拆分和加載,方程式就是好的。

1

本書'Linkers and Loaders'包含對這些問題的解答以及背景解釋。這可能值得一讀。適用於ELF的內容不適用於Windows,但該書涵蓋了兩個 - 以及其他一些系統。