2010-07-21 49 views
2

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

symbol_address = base_address + symbol_offset

一个共享库怎样才能获得自己的基地址?在Windows上,我会使用传递给DllMain的参数,在linux中有一些等价的东西吗?

+0

你想要一个库函数来计算同一个库中的一个对象的地址吗?你有没有理由不能像指针赋值那样将对象的地址? – 2010-07-21 13:47:52

+0

我需要迭代二进制文件中的所有符号,并获取其绝对地址以进行一些进一步计算,因此手动访问每个对象几乎不可能用于较大的二进制文件(更不用说来自crt的符号)。所以现在我可以用libelf获得所有符号的偏移量,只需要这个基地址就可以计算虚拟地址。 – 2010-07-23 07:52:14

回答

4

在Linux上,dladdr()libfoo.so任何符号会给你

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

更多信息here

或者,dl_iterate_phdrcan give加载加载到当前过程中的每个ELF图像的地址。

两者都是GLIBC扩展。如果你不使用GLIBC,不要告诉你使用的是什么,所以更加合适的回答可以给。

+0

谢谢,与dladdr() – 2010-07-30 10:33:17

-1

经过一番研究,我设法找出其描述符,它会受到dlopen()函数返回游览库加载的地址的方法。它是在这样的宏的帮助下执行的:

#define LIBRARY_ADDRESS_BY_HANDLE(dlhandle) ((NULL == dlhandle) ? NULL : (void*)*(size_t const*)(dlhandle)) 
+0

一起工作此答案对于预链接库不起作用。此外,它最好表达为“((struct link_map *)dlhandle) - > l_addr” – 2010-12-28 05:17:50