返回共享库符号表

joe*_*moe 15 c dll plugins shared-libraries dlopen

例如:

void* sdl_library = dlopen("libSDL.so", RTLD_LAZY);
void* initializer = dlsym(sdl_library,"SDL_Init");
Run Code Online (Sandbox Code Playgroud)

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

但是,这需要知道符号"SDL_Init"存在.

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

jwe*_*ich 15

没有libc功能可以做到这一点.但是,您可以自己编写一个(虽然代码有点涉及).

在Linux上,dlopen()实际上返回一个link_map结构的地址,该结构的成员名称l_addr指向加载的共享对象的基地址(假设您的系统不随机化共享库放置,并且您的库尚未预先链接).

在Linux上,查找基址(地址Elf*_Ehdr)的可靠方法是在库dl_iterate_phdr()之后使用dlopen().

使用ELF标头,您应该能够迭代导出符号列表(动态符号表),首先查找Elf*_Phdr类型PT_DYNAMIC,然后定位DT_SYMTAB,DT_STRTAB输入和迭代动态符号表中的所有符号.使用/usr/include/elf.h来指导你.

另外,你可以使用libelf,但我无法指导你,因为我没有以前的经验.

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