4

我有所有符号的偏移地址(通过 libelf 在其自己的二进制 .so 上执行获得)。现在,在运行时,我需要计算所有这些符号的绝对地址,为此我需要获取基地址(加载共享库的位置)并进行计算:

符号地址 = 基地址 + 符号偏移量

共享库如何获得自己的基地址?在 Windows 上,我会使用传递给 DllMain 的参数,在 linux 中是否有一些等价物?

4

2 回答 2

7

在 Linuxdladdr()上,任何符号 fromlibfoo.so都会给你

  void *dli_fbase;      /* Load address of that object */

更多信息在这里

或者,dl_iterate_phdr 可以为您提供加载到当前进程中的每个 ELF 图像的加载地址。

两者都是GLIBC扩展。如果您不使用GLIBC,请说出您使用的是什么,以便给出更合适的答案。

于 2010-07-24T03:43:03.450 回答
-1

经过一番研究,我设法找到了通过其描述符发现库加载地址的方法,该描述符由 dlopen() 函数返回。它是在这样的宏的帮助下执行的:

#define  LIBRARY_ADDRESS_BY_HANDLE(dlhandle) ((NULL == dlhandle) ? NULL :  (void*)*(size_t const*)(dlhandle))
于 2010-12-13T14:37:07.450 回答