2025-10-14

news/2025/10/15 8:40:16/文章来源:https://www.cnblogs.com/veosat/p/19140186

2025-10-14

ELF文件的结构网上有很多教程,这里先只记录如何从ELF文件构建地址-函数名。
首先从ELF Header获取section header表的偏移,section header

Elf32_Ehdr header;
...
fread(&header,sizeof(ELF32_Ehdr),1,fp);
ret=fseek(fp,header.e_shoff,SEEK_SET);

接下来需要获取两个section header:.sym_tab和.str_tab。.sym_tab中类型为FUNC的表项就是我们想要的函数,对于32位的ELF而言,.sym_tab是Elf32_Sym数组,如果表项的st_info低4比特的值是2则说明该项类型为FUNC,表项的st_name就是该项的名字,st_name实际是表项名字的字符串首字符在.str_tab的索引。

首先把.str_tab保存下来,先扫描section header找到sh_type为3的项,该项的sh_offset即strtab在ELF文件中的偏移

for(int i=0;i<header.e_shnum;i++){read_cnt = fread(&sh,sizeof(Elf32_Shdr),1,fp);if(sh.sh_type==3)str = sh;
}

实际上我发现ELF中会存在多个sh_type等于3的项,现在暂时用sh_name等于9做进一步筛选。后续研究一下这些字符串表的区别。
找到strtab的位置之后先把里面的字符串复制出来

char* str_tab;
str_tab=(char*)malloc(str.sh_size);
ret=fseek(fp,str.sh_offset,SEEK_SET);
read_cnt=fread(str_tab,sizeof(char),str_sh_size,fp);

这样后面直接从这个数组获取函数名即可。

这里先理一下在am-kernels/tests/cpu_tests中运行测试用例时发生了什么:首先am-kernels/tests/cpu_tests/下的Makefile会调用abstract-machine目录下的Makefile,这个Makefile会将测试用例编译成目标文件(使用riscv工具链),这个Makefile会调用abstract-machine/scripts/目录下对应结构和平台的mk文件,在我做的这个选择中就是riscv32-nemu.mk。riscv32-nemu.mk会调用abstract-machine/scripts/platform/nemu.mk,nemu.mk会调用nemu目录下的Makefile,nemu目录下的Makefile会调用nemu/scripts/native.mk来构建nemu运行前面编译出的测试程序的目标文件。

讲义中提到如果实现的是riscv32,还需要从jal或者jalr中解析出跳转的目标地址,我的想法是直接检测pc的值不就可以了吗?

不好区分call和ret
ret是伪指令,实际是用jalr实现的。

【确认下c语言中位操作和逻辑操作的优先级】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL笔记---表的约束 - 实践

MySQL笔记---表的约束 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

深入解析:Atlas Mapper 教程系列 (8/10):性能优化与最佳实践

深入解析:Atlas Mapper 教程系列 (8/10):性能优化与最佳实践2025-10-15 08:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

新买的笔记本电脑如何将旧笔记本数据迁移完整迁移克隆过来?买了新电脑,旧电脑大量数据如何迁移?

简单说,固态硬盘(SSD)和机械硬盘(HDD)就像两种“装东西的盒子”,区别主要在“取东西快不快”“结不结实”“贵不贵”这几点,用老百姓的话讲更直白:机械硬盘(HDD):像家里的“老式抽屉柜”,要拿东西得先拉开…

Nginx proxy_pass 末尾斜杠(/) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

反射型XSS与自反型XSS深度解析

本视频深入探讨了反射型XSS和自反型XSS漏洞的区别与危害,通过实际案例演示如何识别和利用这些漏洞,并解释了为什么看似简单的漏洞却能带来高额赏金回报。反射型XSS与自反型XSS 视频概览发布时间:2025年8月12日 观看…

Markdown 是一种「用肉眼就能看懂」标记语言

Markdown 是一种「用肉眼就能看懂」的纯文本标记语言。 它的设计哲学只有一句话:让源文件本身就能读,同时让机器一键转成漂亮的 HTML/PDF/Word 等格式。 核心特点语法只占用了键盘上最常见的符号(# * _ > [] ()…

实用指南:oracle linux 10 +pg18 源码安装要点

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java 与智慧能源:分布式能源与智能电网管理

一、引言 能源是社会发展的基础动力。随着 全球能源转型、碳中和目标、可再生能源普及,传统电力系统正经历深刻变革。分布式能源、智能电网、储能与能源互联网 已成为未来能源发展的核心方向。 然而,能源系统面临的挑…

PHP 真异步 TrueAsync SAPI 与 NGINX Unit 集成

PHP "真异步" TrueAsync SAPI 与 NGINX Unit 集成 现在的 Web 开发和过去最大的区别是什么?一句话:没人再愿意等服务器响应了。 七八年前,甚至更早的时候,模块加载、组件打包、脚本解释、数据库查询——…

Qt下设置Linux系统时间

Qt下设置Linux系统时间include <sys/time.h> bool SysTime(int nYear,int nMonth,int nDay,int nHours,int nMin,int nSecond) { QDateTime dateTime; dateTime.setDate(QDate(nYear, nMonth, nDay)); dateTime…

GitHub Spark引领Vibe编程与AI技术新趋势

本期节目探讨GitHub推出的Vibe编程工具Spark如何通过自然语言开发全栈应用,分析AI编码工具的数据安全问题,介绍科学推理与代码性能优化新数据集,并解读美国AI行动计划的技术战略布局。工具与应用某中心推出Vibe编程…

详细介绍:如何在 Apache 中启用 HSTS 以增强网络安全性 ?

详细介绍:如何在 Apache 中启用 HSTS 以增强网络安全性 ?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

Java 与智慧环保:生态监测与低碳治理

一、引言 环境保护是人类社会可持续发展的核心议题。随着 气候变化、环境污染、资源消耗 等问题的加剧,传统的环保手段难以满足当下高效、实时、精准的需求。智慧环保的目标是:通过信息技术、物联网、人工智能、大数…

VMware ESXi 9.0.1.0 macOS Unlocker OEM BIOS 2.7 Huawei 华为 定制版

VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 Huawei 华为 定制版VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 Huawei 华为 定制版 VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 标…

通过ctypesgen 快速生成ctypes 代码

通过ctypesgen 快速生成ctypes 代码ctypesgen 是一个很不错的工具,可以帮助我们快速的生成ctypes代码,方便python对于c/c++ 代码的访问,实际上有一些扩展,比如原生的以及pypdfium2-team fork 修改的 参考使用命令 …

VMware ESXi 9.0.1.0 macOS Unlocker OEM BIOS 2.7 xFusion 超聚变 定制版

VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 xFusion 超聚变 定制版VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 xFusion 超聚变 定制版 VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS …

完整教程:从格伦的角度理解信息哲学

完整教程:从格伦的角度理解信息哲学2025-10-15 08:00 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…

[AI] AI深度伪造欺诈防范

1 AI深度伪造概念 AI深度伪造欺诈现状科技进步始终伴随机遇与挑战,AI深度伪造技术便是典型代表。作为人工智能领域的前沿技术,其正以超乎想象的速度渗透进社会生活,在推动创新应用的同时,也带来了数据安全、伦理信…

[AI/AI中台] AI应用开发平台:Coze、Dify、阿里百炼、N8N、FastGPT

1 序面对越来越多的智能体平台,产品人该如何选型?本文将从功能定位、协同方式、应用场景等维度,系统梳理 Coze、Dify、百炼、N8N、Maxkb、Fastgpt 的异同,并提供一套实用的工具链搭建思路。2 概述:AI开发平台各AI…

【GitHub每日速递 251015】爆火, 20k star!小智 AI 聊天机器人多端控制+70 多个开源硬件支持,大模型应用新玩法

原文:https://mp.weixin.qq.com/s/5CtkdQwiFOPalmQQhoEsIA TypeScript+GraphQL+React,EverShop让你快速搭建定制化电商平台! evershop 是一个基于 TypeScript 的开源电商建站平台。简单讲,它是一个用TypeScript开发…