c - 返回共享库符号表

标签 c dll plugins shared-libraries dlopen

例如:

void* sdl_library = dlopen("libSDL.so", RTLD_LAZY);
void* initializer = dlsym(sdl_library,"SDL_Init");

假设没有错误,初始化器将指向共享库 libSDK.so 中的函数 SD_Init。

然而,这需要知道符号“SDL_Init”的存在。

是否可以查询库中的所有符号?例如,在这种情况下,它将返回 SDL_Init、函数指针和 libSDL.so 导出的任何其他符号。

最佳答案

没有 libc 函数可以做到这一点。但是,你可以自己写一个(虽然代码有点复杂)。

在 Linux 上,dlopen()实际上返回一个 link_map 的地址结构,它有一个名为 l_addr 的成员指向加载的共享对象的基地址(假设您的系统没有随机化共享库的放置,并且您的库没有被预链接)。

在 Linux 上,找到基地址(Elf*_Ehdr 的地址)的可靠方法是使用 dl_iterate_phdr()dlopen() 之后访问图书馆。

有了 ELF header ,您应该能够通过首先找到 Elf*_Phdr 来遍历导出符号列表(动态符号表)。类型 PT_DYNAMIC , 然后定位 DT_SYMTAB , DT_STRTAB条目,并遍历动态符号表中的所有符号。使用 /usr/include/elf.h指导你。

此外,您可以使用 libelf ,但我无法指导您,因为我以前没有这方面的经验。

最后请注意,该练习有些徒劳:您将获得已定义函数的列表,但您不知道如何调用它们(它们需要什么参数),那么有什么意义呢?

关于c - 返回共享库符号表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2694290/

相关文章:

c - malloc 之后访问结构数组的内容

windows - 为什么我的 Windows wxPerl 应用程序没有启动?

c# 从带有 char * 的 C DLL 回调

c++ - DLL 项目中的 C++ 编译错误

php - 帮助安装 Symfony 插件

c - 列表元素而不是数组 C

c - 简单的 TDI 驱动程序

c++ - 为什么我不能运行目标文件?

android - 在 Sonar 分析中包含 xml 文件(Android 项目)

javascript - 用于处理私有(private)函数的 jQuery 插件设计模式(常见做法?)