当前位置: 首页 > news >正文

Linux dlsym和直接调用函数地址解析分析

dlsym 函数是 Linux 下动态链接库(shared library)编程中的一个重要函数。它用于在运行时获取动态链接库中符号的地址,通常用于获取函数指针或变量的地址。

以下是 dlsym 函数的基本用法和示例。

1. 函数原型

void *dlsym(void *handle, const char *symbol);
  • handle:通过 dlopen 函数获取的库句柄。
  • symbol:要查找的符号的名称(通常是函数名或变量名)。
  • 返回:返回符号的地址,失败时返回 NULL

2.疑惑

创建一个可执行程序和一个so文件

1.c

#include <stdio.h>
#include <dlfcn.h>
extern void a();
int main()
{
        void *p = dlsym(NULL, "a");
        void *q = printf;
        void *r = dlsym(NULL, "printf");
        void *s = a;
        a();
}

2.c

#include <stdio.h>

void a()
{
        void *b = printf;
        printf("hahahaha\n");
}

编译为共享库:

gcc -g -fPIC -shared 2.c -o liba.so

编译可执行程序:

gcc -g  1.c -I. -L. -la -ldl

不注释掉1.c中void *s = a;
使用gdb查看
在这里插入图片描述
可以看出使用dlsym查找的是a在内存中的绝对地址
在这里插入图片描述注释掉1.c中void *s = a;
使用gdb查看
在这里插入图片描述
发现dlsym查找的符号是plt表中a的地址,反汇编p
在这里插入图片描述

3.原因猜测

注释掉1.c中void *s = a;这句代码,1.c中没有对a的引用,意味着got plt标准不在在关于a的表项,不注释时,存在关于a的plt和got表项,dlsym从模块对应的表项开始搜索,所有不注释时查到到的地址时plt地址,注释后查找的是真实地址。

http://www.dtcms.com/a/13462.html

相关文章:

  • 相机基础概念
  • 电源管理芯片PMIC
  • 网站集群批量管理-Ansible(playbook)
  • Hive数仓操作(七)
  • 昇思学习打卡营第31天|深度解密 CycleGAN 图像风格迁移:从草图到线稿的无缝转化
  • 考研笔记之操作系统(三)- 存储管理
  • 探索Spring Boot:教学资源大全
  • 国庆作业
  • RDD的介绍、RDD的特点、创建RDD数据
  • 序列化与反序列化基础及反序列化漏洞(附案例)
  • SQL第14课挑战题
  • 如何用python抓取豆瓣电影TOP250
  • linux系统不同用户登录vnc
  • 逼近理论及应用精解【12】
  • (11)(2.1.4) DroneCAN ESCs
  • C# 多线程和异步编程,锁和信号
  • Redis: 集群高可用之MOVED转向和ASK转向解决方案
  • TS 中类型的继承
  • 数据结构-4.5.KMP算法(旧版上)-朴素模式匹配算法的优化
  • 图像增强论文精读笔记-Low-Light Image Enhancement via a Deep Hybrid Network
  • 初学Java基础Day14---初识面向对象,private关键字和封装及构造方法习题
  • SQLite SQL调优指南及高级SQL技巧
  • 19 基于51单片机的倒计时音乐播放系统设计
  • 举例说明 .Net Core 单元测试中 xUnit 的 [Theory] 属性的用法
  • 【iOS】计算器仿写
  • 数据链路层
  • MongoDB-aggregate流式计算:带条件的关联查询使用案例分析
  • MKV转MP4丨FFmpeg的简单命令使用——视频格式转换
  • 小蒋聊技术——DevOps 是什么“玩意”?
  • 爬虫——爬虫理论+request模块