DLSYM - Linux手册页

时间:2019-08-20 18:00:08  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-06-09

名称

dlsym,dlvsym-获取共享对象或可执行文件中符号的地址

语法

#包括

void * dlsym(void * handle,const char * symbol);

#定义_GNU_SOURCE
#包括

无效* dlvsym(无效句柄,字符符号,字符*版本);

与-ldl链接。

说明

函数dlsym()获取dlopen(3)返回的动态加载共享对象的"句柄"以及以空字符结尾的符号名称,并返回将该符号加载到内存中的地址。如果未找到该符号,则在指定对象或加载该对象时dlopen(3)自动加载的任何共享对象中,dlsym()返回NULL。 (dlsym()执行的搜索首先通过这些共享库的依赖关系树进行。)

在特殊情况下(请参见注释),该符号的值实际上可能为NULL。因此,从dlsym()返回的NULL不必指示错误。区分错误和值为NULL的符号的正确方法是调用dlerror(3)清除任何旧的错误条件,然后调用dlsym(),然后再次调用dlerror(3),将其返回值保存到变量中,然后检查此保存的值是否不为NULL。

可以在handle中指定两个特殊的伪句柄:

RTLD_DEFAULT
使用默认共享库搜索顺序查找所需符号的第一个匹配项。搜索将包括可执行文件及其依赖中的全局符号,以及使用RTLD_GLOBAL标志动态加载的共享对象中的符号。
RTLD_NEXT
在当前对象之后的搜索顺序中找到所需符号的下一个匹配项。这样一来,用户就可以为另一个共享库中的函数提供包装器,这样,例如,预加载的共享库中的函数定义(请参阅ld.so(8)中的LD_PRELOAD)就可以找到并调用"实数"在另一个共享库中提供的函数(或者,如果存在多层预加载,则为函数的"下一个"定义)。

为了从中获取RTLD_DEFAULT和RTLD_NEXT的定义,必须定义_GNU_SOURCE功能测试宏。

函数dlvsym()与dlsym()相同,但是将版本字符串作为附加参数。

返回值

成功执行后,这些函数将返回与符号关联的地址。失败时,它们返回NULL。可以使用dlerror(3)诊断错误原因。

版本

dlsym()存在于glibc 2.0及更高版本中。 dlvsym()最早出现在glibc 2.1中。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
dlsym(),dlvsym()Thread safetyMT-Safe

遵循规范

POSIX.1-2001描述了dlsym()。 dlvsym()函数是GNU扩展。

备注

在几种情况下,全局符号的地址为NULL。例如,链接器可以通过链接器脚本或--defsym命令行选项将符号放置在零地址处。未定义的弱符号也具有NULL值。最后,符号值可能是GNU间接函数(IFUNC)解析器函数的结果,该函数返回NULL作为解析值。在后一种情况下,dlsym()也会返回NULL且无错误。但是,在前两种情况下,GNU动态链接器的行为不一致:重定位处理成功并且可以观察到该符号具有NULL值,但是dlsym()失败并且dlerror()指示查找错误。

History

dlsym()函数是从SunOS派生的dlopen API的一部分。该系统没有dlvsym()。

示例

请参见dlopen(3)。

另外参见

dl_iterate_phdr(3),dladdr(3),dlerror(3),dlinfo(3),dlopen(3),ld.so(8)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/