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

devtools/2024/10/9 10:54:27/

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.ppmy.cn/devtools/123334.html

相关文章

ASP.NetCore---I18n(internationalization)多语言版本的应用

文章目录 0.实现的效果如下1.创建新项目I18nBaseDemo2.添加页面中的下拉框3.在HomeController中添加ChangeLanguage方法4.在Progress.cs 文件中添加如下代码&#xff1a;5. 在progress.cs中添加code6.添加Resource资源文件7.在页面中引用i18n的变量8. 重启项目&#xff0c;应该…

Java面试题——第九篇(JVM)

1. Java中的强引用、软引用、弱引用和虚引用分别是什么 强引用 最常见的引用类型&#xff0c;在Java中&#xff0c;默认情况下&#xff0c;任何普通的对象引用都是强引用只要一个对象有强引用指向他&#xff0c;垃圾回收器永远不会回收该对象&#xff0c;即使系统内存紧张。 …

【图论】树剖(上):重链剖分

一、前置知识清单 深度优先搜索DFS 点我复习图的存储 复习链接敬请期待树状数组 点我复习 二、树剖简介 树剖&#xff08;树链剖分&#xff09;&#xff0c;是一种把树划分成链的算法&#xff0c;该算法分为重链剖分和长链剖分。 本文仅讨论重链剖分&#xff0c;长链剖分目前…

BUU刷题-Pwn-shanghai2018_baby_arm(ARM_ROP_csu_init,ARM架构入门)

解题思路&#xff1a; 泄露或修改内存数据&#xff1a; 堆地址&#xff1a;无需栈地址&#xff1a;无需libc地址&#xff1a;无需BSS段地址&#xff1a;无需 劫持程序执行流程&#xff1a;ARM_ROP && mprotect函数(运行内存权限修改) && [[ARM_ROP_csu_init]…

vue 不是spa 单页面应用吗? 配置路由工作模式为history 后 ,为什么配置Nginx的 try_files 可以根据url 找到对应的文件?

免责申明 记录用&#xff0c;本人主要是后端,可能理解有误 Vue.js 是一个前端框架&#xff0c;主要用于构建单页面应用程序&#xff08;SPA&#xff09;。然而&#xff0c;Nginx 是一个服务器端的应用程序&#xff0c;负责处理 HTTP 请求并返回相应的资源。 当在 Vue.js 应用…

【k8s深入理解之csi插件】理解存储 csi 插件的总体逻辑框架

转载自 k8s通过ceph-csi接入存储的概要分析 - 良凯尔 - 博客园如何接入 K8s 持久化存储&#xff1f;K8s CSI 实现机制浅析 - 腾讯云原生 - 博客园29 | PV、PVC体系是不是多此一举&#xff1f;从本地持久化卷谈起-深入剖析 Kubernetes-极客时间K8S-StorageClass资源-实践【补充…

Python机器学习框架介绍和入门案例:Scikit-learn、TensorFlow与Keras、PyTorch

Python机器学习框架介绍和入门案例 目录 &#x1f31f; 机器学习框架概述&#x1f4ca; Scikit-learn 2.1 模型选择与评估2.2 常用API&#xff08;fit、predict、score&#xff09;2.3 实现示例&#xff08;线性回归、K近邻&#xff09; &#x1f680; TensorFlow与Keras 3.1…

LC538 - 把二叉搜索树转换为累加树

文章目录 1 题目2 思路3 ACM模式参考 1 题目 https://leetcode.cn/problems/convert-bst-to-greater-tree/description/ 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09; 累加树&#…