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

2025-10-14

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.hskmm.com/?act=detail&tid=31295

相关文章:

  • MySQL笔记---表的约束 - 实践
  • 新买的笔记本电脑如何将旧笔记本数据迁移完整迁移克隆过来?买了新电脑,旧电脑大量数据如何迁移?
  • 反射型XSS与自反型XSS深度解析
  • Markdown 是一种「用肉眼就能看懂」标记语言
  • Java 与智慧能源:分布式能源与智能电网管理
  • PHP 真异步 TrueAsync SAPI 与 NGINX Unit 集成
  • GitHub Spark引领Vibe编程与AI技术新趋势
  • 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 xFusion 超聚变 定制版
  • [AI] AI深度伪造欺诈防范
  • [AI/AI中台] AI应用开发平台:Coze、Dify、阿里百炼、N8N、FastGPT
  • 【GitHub每日速递 251015】爆火, 20k star!小智 AI 聊天机器人多端控制+70 多个开源硬件支持,大模型应用新玩法
  • Voice Agent 开发者第一课:成为进阶语音 AI 玩家,你需要了解这些丨Convo AIRTE2025
  • C++内存管理的那些坑与经验
  • .NET 10 Release Candidate 2(RC2)发布
  • 字节开源 MineContext:截屏+理解上下文;OpenAI 宣布自研 AI 芯片丨日报
  • 读技术之外:社会联结中的人工智能10读后总结与感想兼导读
  • 另一个角度看运放
  • 何时无需AI:数学与统计的实用价值
  • 云防护栏理论:应对云配置错误的安全防护策略
  • 乐理 -07 音程
  • VBA批量设置单元格值和数据有效性
  • 一个关于结构体性能和内存分配的问题
  • 乐理 -07 五线谱
  • CentOS 7.6 环境下基于 Docker 部署 PaddleOCR 源码的实践指南
  • 罗马机场 落地过关 取行李 坐私家车接机攻略
  • LGP10838 [FLA R1] 庭中有奇树 学习笔记
  • 解决Pregenerating ConTeXt MarkIV format. This may take some time...卡死问题
  • 日期相关函数、方法