侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 239 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

dlsym函数用法详解

noerror
2022-10-19 / 0 评论 / 0 点赞 / 50 阅读 / 921 字 / 正在检测是否收录...

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 可以找到并调用另一个共享对象中提供的“真实”函数(或者在存在多层预加载的情况下,可以调用该函数的“下一个”定义)。

为了从 获得 RTLD_DEFAULTRTLD_NEXT 的定义,必须定义 _GNU_SOURCE 特性测试宏
函数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)

0

评论区