小编lin*_*ker的帖子

如何以编程方式列出ELF共享库符号

在我的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不是实际的库基址,而是与可执行标头的偏移量-但我不确定如何找到该标头地址。

linker elf dlopen dlsym

5
推荐指数
1
解决办法
1065
查看次数

标签 统计

dlopen ×1

dlsym ×1

elf ×1

linker ×1