dlsym函数用法详解
dlsym函数简介
- 头文件包含
#include <dlfcn.h>
#include <dlfcn.h>
- 函数定义
void *dlsym(void * handle , const char * symbol );
#define _GNU_SOURCE
void *dlvsym(void * handle , char * symbol , char * version );
- 编译链接选项
-ldl
dlsym函数常见使用错误
- 链接错误
undefined reference to `dlsym'
解决办法:添加链接选项
-ldl
- 编译错误
warning: implicit declaration of function ‘dlsym’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <dlfcn.h>
#include <dlfcn.h>
dlsym函数详细描述
函数dlsym ()接受由dlopen (3)返回的动态加载共享对象的“句柄”以及以空结尾的符号名,并返回将该符号加载到内存中的地址。如果在指定的对象中或在加载该对象时dlopen (3)自动加载的任何共享对象中找不到该符号,dlsym ()将返回NULL。(dlsym ()执行的搜索首先是通过这些共享对象的依赖树进行广度搜索。)
在不寻常的情况下(请参见注释),符号的值实际上可能为空。因此,从dlsym ()返回NULL不需要表示错误。区分错误和值为NULL的符号的正确方法是调用dlerror (3)来清除任何旧的错误条件,然后调用dlsym (),然后再次调用dlerror (3),将其返回值保存到一个变量中,并检查保存的值是否为NULL。
在handle :中可以指定两个特殊的伪句柄
- RTLD_DEFAULT 使用默认的共享对象搜索顺序查找所需符号的第一个匹配项。搜索将包括可执行文件及其依赖项中的全局符号,以及用RTLD_GLOBAL标志动态加载的共享对象中的符号。
- RTLD_NEXT在当前对象之后的搜索顺序中查找所需符号的下一个出现。这允许在另一个共享对象中的函数周围提供一个包装器,以便,例如,预加载的共享对象中的函数定义(请参见ldso (8))中的 LD_PRELOAD 可以找到并调用另一个共享对象中提供的“真实”函数(或者在存在多层预加载的情况下,可以调用该函数的“下一个”定义)。
为了从
函数dlvsym ()执行与dlsym ()相同的操作,但使用一个版本字符串作为附加参数。
dlsym函数返回值
成功时,这些函数返回与symbol 相关联的地址;失败时,它们返回NULL;使用dlerror (3)可以诊断错误的原因
dlsym函数其他说明
当全局符号的地址为空时,有几种情况。例如,链接器可以通过链接器脚本或使用--defsym命令行选项将符号放置在零地址。未定义的弱符号也具有空值。最后,符号值可能是GNU间接函数(IFUNC)解析器函数的结果,该函数返回NULL作为解析值。在后一种情况下,dlsym ()也返回NULL而没有错误。然而,在前两种情况下,GNU动态链接器的行为是不一致的:重新定位处理成功,可以观察到符号具有空值,但dlsym ()失败,dlerror ()指示查找错误。History dlsym ()函数是从SunOS派生的dlopen API的一部分。该系统没有dlvsym ()
dlsym函数使用举例
参见dlopen (3)
评论区