我想写一个小函数的跟踪器。我使用ptrace。
当我看到CALL指令时,我想显示相当于地址调用的函数名称。
我的跟踪器使用带有绝对地址的符号(符号在主二进制文件中定义)。 但我不知道如何在虚拟内存中获取共享库函数的绝对地址。例如,检测对libc函数的调用。
我注意到共享库中函数的地址是相对于文件的。
以下等式是否合适?
Absolute address of symbol = address of the shared library in virtual memory +
relative address of the symbol.
如何从共享库中获取符号的绝对地址?
答案 0 :(得分:2)
我想你想看看动态链接是如何工作的,特别是全局偏移表。 http://www.gentoo.org/proj/en/hardened/pic-guide.xml是一个开始,但让它在各个系统中可靠地工作可能会很棘手。
答案 1 :(得分:1)
本书'Linkers and Loaders'包含对此类问题的回答以及背景说明。这可能值得一读。适用于ELF的内容不适用于Windows,但本书同时涵盖了 - 以及其他一些系统。
答案 2 :(得分:0)
只要您没有描述您正在使用的系统,this article就会明确说明至少所描述的任务可以解决某些情况,而不是所有情况。
如果我在你的情况下,我会在内存和库中搜索相应的二进制片段。然后,只要内存和库对齐,问题就解决了。所以是的,只要不能将库拆分并作为独立部分加载,该等式就是好的。