例如:
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/