怎样获得动态链接库的装载地址

这里讨论的是linux下某次运行是某so文件被装载的地址。得到这个地址有什么用 ?首先,在对so文件进行静态分析时,拿到的函数地址是相对于so基地址的,而__cyg_profile_function_enter 等函数中打印出来的是运行时地址。为了能够通过该函数打印出来的地址找到原来的函数就需要知道so文件在运行时的装载地址。通常,如果这个程序正在运行,可以通过
ps 获得该运行的pid
然后 cat /proc/$pid/maps 可以得到该动态库的装载地址。
以下是一个输出示例:
7fffead82000-7ffff4824000 r-xp 00000000 00:2d 2687732 /home/XXX.so <= 这里就是装载地址。 7ffff4824000-7ffff4a24000 —p 09aa2000 00:2d 2687732 /home/XXX.so 7ffff4a24000-7ffff5635000 rw-p 09aa2000 00:2d 2687732 /home/XXX.so 但是这种方法有一个问题,那就是一旦程序运行结束,就没办法再找到这个地址了。 另一种方法是利用LD_DEBUG 环境变量。 具体用法为 env LD_DEBUG=files LD_DEBUG_OUTPUT=myld.log cmdline 这样,你运行是的so装载地址就会被记录在myld.log<$pid>中,以下是一个示例输出:
12633: file=xxx.so [0]; needed by sh [0]
12633: file=xxx.so [0]; generating link map
12633: dynamic: 0x00007ffff7ffb1b0 base: 0x00007ffff7efa000 size: 0x0000000000101458
12633: entry: 0x00007ffff7efab90 phdr: 0x00007ffff7efa040 phnum: 5

其中的base就是该so运行是装载的地址。如果你用这两种方法对比这看,会发现这两个值是一样的。

这样,当你通过trace方法来导出函数调用顺序以后,就可以通过减去以上找到的基地址,得到该so中的偏移,从而找到具体的函数名。(可以通过Addr2line)



本文地址: http://www.bagualu.net/wordpress/archives/2317 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注