在我的 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)
这打印
“基本地址是 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
有人建议 l_addr 不是实际的库基地址,而是可执行头的偏移量 - 但我不确定如何找到该头地址。