gpt4 book ai didi

c - 返回共享库符号表

转载 作者:太空狗 更新时间:2023-10-29 16:34:18 26 4
gpt4 key购买 nike

例如:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com