如何找到共享库的符号的绝对地址?

时间:2010-02-08 23:48:46

标签: c shared-libraries symbols elf

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

当我看到CALL指令时,我想显示相当于地址调用的函数名称。

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

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

以下等式是否合适?

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

本书'Linkers and Loaders'包含对此类问题的回答以及背景说明。这可能值得一读。适用于ELF的内容不适用于Windows,但本书同时涵盖了 - 以及其他一些系统。

答案 2 :(得分:0)

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