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,但我无法指导你,因为我没有以前的经验.
最后请注意,练习有点徒劳:您将获得已定义函数的列表,但您不知道如何调用它们(它们期望的参数),那么重点是什么?
| 归档时间: |
|
| 查看次数: |
6598 次 |
| 最近记录: |