2010-02-08 79 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,但该书涵盖了两个 - 以及其他一些系统。