5

我想写一个小函数的跟踪器。我使用 ptrace。

当我看到一条 CALL 指令时,我想显示与地址调用等效的函数名称。

我的跟踪器使用具有绝对地址的符号(符号在主二进制文件中定义)。但是我不知道如何才能获得共享库函数在虚拟内存中的绝对地址。例如,检测对 libc 函数的调用。

我注意到共享库中函数的地址是相对于文件的。

下面的等式是好的吗?

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

如何从共享库中获取符号的绝对地址?

4

3 回答 3

2

我想你想看看动态链接是如何工作的,特别是全局偏移表。http://www.gentoo.org/proj/en/hardened/pic-guide.xml是一个开始,但要让它跨系统可靠地工作可能会很棘手。

于 2010-02-25T00:13:24.743 回答
1

“链接器和加载器”一书包含这些问题的答案以及背景解释。它可能值得一读。适用于 ELF 的内容不适用于 Windows,但本书涵盖了两者——以及其他一些系统。

于 2010-03-23T00:24:22.793 回答
0

只要您没有描述您所使用的系统,本文就会阐明至少所描述的任务可以在某些情况下解决,而不是全部解决。
如果我处于您的情况,我会在内存和库中搜索相应的二进制片段。然后,只要内存和库对齐,问题就解决了。所以是的,只要库不能拆分并作为独立部分加载,等式就很好。

于 2010-02-09T10:51:56.603 回答