在我的C共享库中,我想dlopen()另一个共享库并检索该库具有的导出符号的列表。
有没有一种方法可以以编程方式做到这一点,而无需运行nm / objdump?
作为第二个问题:如何在dlopen()之后检索第二个库的加载基地址-不知道任何符号的名称(因此我无法运行dlsym!)并且不读取/ proc / self / maps?
我尝试了以下方法:
struct link_map *imagehandle = (struct link_map*)dlopen(libraryname, RTLD_LOCAL | RTLD_LAZY);
void * fbase = (void*) imagehandle->l_addr;
printf("base addr is %p",fbase)
Run Code Online (Sandbox Code Playgroud)
此打印
“基本地址是0x6862696c”
但是,该库不在此处:
[/ proc / pid / maps输出:]
b6d27000-b6d28000 r-xp 00000000 1f:01 1581 mysecondlib.so
b6d28000-b6d29000 r--p 00000000 1f:01 1581 mysecondlib.so
b6d29000-b6d2a000 rw-p 00001000 1f:01 1581 mysecondlib.so
Run Code Online (Sandbox Code Playgroud)
有人建议l_addr不是实际的库基址,而是与可执行标头的偏移量-但我不确定如何找到该标头地址。