共享库如何获取自己的基地址

Sas*_*lic 3 gcc symbols shared-libraries elf dynamic-linking

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

symbol_address = base_address + symbol_offset

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

Emp*_*ian 6

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

  void *dli_fbase;      /* Load address of that object */
Run Code Online (Sandbox Code Playgroud)

更多信息在这里

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

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