返回共享库符号表

例如:

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导出的任何其他符号。

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

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

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

有了ELF头,你应该能够迭代一个导出符号列表(动态符号表),首先找到类型为PT_DYNAMICElf*_Phdr PT_DYNAMIC ,然后找到DT_SYMTABDT_STRTAB条目,并迭代所有符号。动态符号表。 使用/usr/include/elf.h来指导您。

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

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

我认为没有为此发布的API。 您可以使用binutils中的nm工具或检查其源代码: http : //sourceware.org/cgi-bin/cvsweb.cgi/src/binutils/? cvsroot = src

http://sourceware.org/cgi-bin/cvsweb.cgi/src/binutils/nm.c?rev=1.63&content-type=text/x-cvsweb-markup&cvsroot=src

(显然假设精灵)

可以使用linux nm命令: http : //man.yolinux.com/cgi-bin/man2html? cgi_command = nm

 void *dlsym(void *restrict handle, const char *restrict name); 

回报价值

如果handle没有引用dlopen()打开的有效对象,或者如果在与handle关联的任何对象中找不到命名符号,则dlsym()将返回NULL。 应通过dlerror()获得更详细的诊断信息。

(来源: http : //www.opengroup.org/onlinepubs/009695399/functions/dlsym.html )

换句话说,如果找不到符号, dlsym()将返回NULL 。 不确定这是不是你想要的,但这是我能找到的最简单的方法。