当前位置: 首页 > 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地址,注释后查找的是真实地址。

相关文章:

  • 相机基础概念
  • 电源管理芯片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
  • 西藏日喀则市拉孜县发生5.5级地震,震感明显部分人被晃醒
  • 中方发布会:中美经贸高层会谈取得了实质性进展,达成了重要共识
  • 《三餐四季》广东篇今晚开播:食在岭南,遇见百味
  • “科创板八条”后百单产业并购发布,披露交易金额超247亿
  • 墨西哥宣布就“墨西哥湾”更名一事起诉谷歌
  • 上海国际电影节推出三大官方推荐单元,精选十部优秀影片