LLVM Cpu0 新后端9 objdump readelf

 想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章:

LLVM 后端实践笔记

代码在这里(还没来得及准备,先用网盘暂存一下):

链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?pwd=vd6s 提取码: vd6s 

这一章介绍如何生成 ELF 文件,ELF 文件是一种通用的可执行文件、目标文件和共享库与核心转储文件标准,最早是由 System V 应用二进制接口发布,之后成为一种标准,并很快被类 Unix 操作系统接受。几乎所有支持编译的后端平台都需要生成一种可执行文件格式来执行代码,现在主流的三种可执行文件分别是 Linux 系统及裸机系统支持的 ELF 文件、Windows 系统支持的 COFF 文件以及 MacOS 系统支持的 Mach-O 文件格式。我们让 Cpu0 后端生成 ELF 文件格式。

之前章节我们介绍了 Cpu0 后端生成各种指令编码的代码,所以有关于指令编码的行为,是由 td 文件中的描述来确定的,LLVM 的公共部分已经帮我们生成了指令编码的功能。但目前还没有定义生成 ELF 文件的头部、段组成、重定位信息等内容,这一章主要实现这部分内容。

这一章,我们会使用二进制解析工具来检查 ELF 文件,比如 objdump 和 readelf 文件。LLVM 中有类似于 objdump 的工具,默认生成名称为 llvm-objdump,基本使用和 objdump 一致,我们这一章也会试用这个工具。

一、ELF文件的简单介绍

这一节只是简单介绍,有关于详细的学习材料,在网上可以找到很多。ELF 文件格式的支持是 LLVM 默认便已经完成的,不需要我们做更多的工作(少量工作在第 2 章中已经完成)。ELF 文件格式有两种视图,分别是目标文件视图和可执行文件视图。目标文件视图是为链接器服务的,它的划分标准是段(Section),不同的段有 .text 段存放代码内容、.data 段存放数据、.rodata 段存放只读数据等,这些段的索引保存在 ELF 文件末尾的段头部表(Section header table)中。链接器通过访问段头部表来检索到各段。

可执行文件视图是为执行服务的,它的划分标准是节(Segment),不同的节可能是多个段的组合,比如执行时,因为要关心数据的访问权限,.text 段和 .rodata 段会合并为一个只读数据的节。加载器会访问位于 ELF 文件开头文件头部表之后的节头部表(Segment header table),来访问各节。

二、工具的使用

2.1 llvm-objdump和llvm-readelf的工具选择

我一般反汇编用的llvm-objdump,读字段用llvm-readelf较多,主要看大家习惯。虽然readelf写着是读elf文件,但是llvm对于llvm-readelf进行了扩展,也能用来读取coff和macho文件。

选项有多个的情况是有缩写

2.2 llvm-objdump

2.2.1 --mattr=a1, +a2, -a3...

指定架构特殊的属性,与llc的选项类似。

2.2.2 --mcpu=cpu-name

指定一个cpu类型,与llc的选项类似。

2.2.3 --disassemble-options=options/-M <value>

使用目标架构特殊的反汇编器选项

2.2.4 --disassemble-symbols=<value>

反汇编某一个符号,例如:llvm-objdump --disassemble-symbols='_Z3fooSt6vectorIiSaIiEE' test.o

2.2.5 --disassemble/-d

对文件的执行字段进行反汇编,llvm-objdump -d test.o

2.2.6  --disassemble-all/-D

对文件的所有字段进行反汇编,llvm-objdump -D test.o

2.2.7 --dynamic-reloc/-R

打印文件的动态重定位信息,llvm-objdump -R test.so

2.2.8 --dynamic-syms/-T

打印文件的动态符号表

2.2.9 --syms/-t

打印文件的符号表

2.2.10 --file-headers/-f

打印文件头信息

2.2.11 --section-headers

打印各个section的概述信息

2.2.12 --headers/-h

打印section header信息,我看效果貌似跟--section-headers是差不多的

2.2.13 --all-headers/-x

打印可用的头信息,重定位信息和符号表。

2.2.14 --full-contents/-s

打印所有内容

2.2.15 --x86-asm-syntax

--x86-asm-syntax=att/intel,打印AT&T还是Intel风格的反汇编代码。

2.3 llvm-readelf

2.3.1 -program-headers/-l/--segments

打印segments信息

2.3.2 --section-headers/--sections/-S

打印sections headers信息

2.3.3 --section-details/-t

打印sections细节信息(不知道为啥说成细节,我觉得与-S类似)

2.3.4 --file-header/-h

打印文件头

2.3.5 --section-relocations/--sr

打印sections的重定位信息

2.3.6 --relocations/--relocs/-r

打印重定位信息

2.3.7 --symbols/--syms/-s

打印符号表,包括动态符号表

2.3.8 --dynamic-table/--dynamic/-d

打印dynamic section信息

2.3.9 --dyn-symbols/--dyn-syms/--dt

打印动态符号表

2.3.10 --dyn-relocations

打印动态重定位信息。

2.3.11 --headers/-e

相当于--file-header, --program-headers, --section-headers

2.3.12 --all/-a

打印所有信息,相当于--file-header, --program-header, --section-headers, --symbols, --relocations, --dynamic-table, --notes, --verson-info, --unwind, --section-groups and --histogram

三、修改前的效果

我们使用llvm-objdump -d打印我们编出的cpu0架构的目标文件的反汇编试一下:

会提示我们cpu0架构没有反汇编器,这是我们这一章要适配的内容。

四、修改部分

4.1 新增的文件

4.1.1 Disassembler/Cpu0Disassembler.cpp

在这个反汇编文件中,实现了 td 文件中所有反汇编函数引用的函数,即 DecoderMethod 关键字指定的函数,尤其是对应一些特殊操作数的反汇编,比如内存引用的反汇编,因为这种特殊操作数格式是我们自定义的 td 类来定义的,所以也需要指定其反汇编方法。

4.2 修改的文件

4.2.1 Cpu0InstrInfo.td

对一些基本类添加反汇编函数的引用。这里添加了 JumpFR 类的引用。

五、修改后的效果

能正确打印出反汇编的内容。

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

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

相关文章

C-Linux: 题集

1 C语言 1 简述 全局变量 和 局部变量的区别: 存储位置:全局变量存储在静态区,局部变量存储在栈上 作用范围:全局变量对整个程序可见,局部变量仅对其定义的函数可见 生命周期:全局变量在程序执行过程中都存在,局部变量的生命周期仅在其所在函数执行期间存在 2 死锁…

EE trade:如何在A股市场中有效设定止盈止损点

A股市场充满机遇和风险&#xff0c;很多投资者在这里实现了财富增长&#xff0c;也有投资者在这里遭受损失。如何在波动性较大的市场中&#xff0c;控制风险&#xff0c;保护利润和本金?止盈止损是关键。 什么是止盈止损? 止盈止损是指在交易中&#xff0c;根据预先设定的条…

【人工智能】AIGC是什么?

AIGC是“人工智能生成内容”&#xff08;Artificial Intelligence Generated Content&#xff09;的缩写&#xff0c;它指的是利用人工智能技术自动创建文本、图像、音频、视频等不同类型的内容。AIGC技术的发展&#xff0c;使得计算机能够模拟人类的创作过程&#xff0c;生成具…

如何稳定高效地进行 TiDB 数据导入导出?

对于在数据库行业中摸爬滚打多年的老鸟 DBA 来说&#xff0c;TiDB 可是一点也不陌生&#xff0c;作为 PingCAP 公司自主研发的真开源分布式数据库&#xff0c;其先进的设计理念以及丰富的生态工具&#xff0c;可算得上是业界自主创新和性能领先的代名词。 TiDB 是谁&#xff1…

python一点通: Async异步函数很好,但是如何有效执行阻塞任务?

当使用 asyncio.create_task(function1) 和 asyncio.create_task(function2) 时&#xff0c;你正在创建两个将在同一个事件循环中并发运行的异步任务。这些任务运行是否高效取决于它们本身的性质。 理解异步任务 如果 function1 和 function2 是异步函数&#xff08;即&#…

探索PostgreSQL的多模型世界:灵活存储,无限可能

在数据库的世界里&#xff0c;有一种神器&#xff0c;它以其无与伦比的灵活性和强大的功能&#xff0c;赢得了全球开发者的青睐。它就是——PostgreSQL&#xff0c;一个真正的多模型数据库管理系统。 为什么选择PostgreSQL&#xff1f; 可靠性和稳定性&#xff1a;PostgreSQL…

Rust anyhow 简明教程

anyhow 是 Rust 中的一个库&#xff0c;旨在提供灵活的、具体的错误处理能力&#xff0c;建立在 std::error::Error 基础上。它主要用于那些需要简单错误处理的应用程序和原型开发中&#xff0c;尤其是在错误类型不需要被严格区分的场景下。 以下是 anyhow 的几个关键特性&…

MAVEN架构项目管理工具

1、什么是maven Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建&#xff0c;依赖管理和项目信息管理。 2、maven的目标&#xff1a;Maven的主要目标是为了使开发人员在最短的时间内领会项目的所有状态 3、使用maven不需要考虑各个依赖的版本&#xff0c;因…

Follow Carl To Grow|【LeetCode】530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先

【LeetCode】530.二叉搜索树的最小绝对差 题意&#xff1a;给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 思路&#xff1a;中序遍历拿到递增序列&#xff0c;然后求相邻…

【将xml文件转yolov5训练数据txt标签文件】连classes.txt都可以生成

将xml文件转yolov5训练数据txt标签文件 前言一、代码解析 二、使用方法总结 前言 找遍全网&#xff0c;我觉得写得最详细的就是这个博文⇨将xml文件转yolov5训练数据txt标签文件 虽然我还是没有跑成功。那个正则表达式我不会改QWQ&#xff0c;但是不妨碍我会训练ai。 最终成功…

UE5中在地形中加入湖、河

系统水资产添加 前提步骤123 完成 前提 使用版本 UE5.0.3,使用插件为UE内置的Water和water Extras. 步骤 1 记得重启 2 增加地形&#xff0c;把<启用编辑图层>勾选 如果地形没有勾选上编辑图层&#xff0c;那么就会导致湖、河等水景象无法融入地形。 如果忘记勾选…

Hive知识体系保姆级教程

一. Hive概览 1.1 hive的简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务进行运算&#xff0c;底层由HDFS来提供数据的存储&#xff0c;说白了h…

如何从 Android 图库中恢复误删除的照片

如果您正在阅读这篇文章&#xff0c;那么您肯定意外地从 Android 设备中删除了照片。并且您正在寻找一种简单的方法来恢复 Android 图库中已删除的照片。 从图库恢复已删除的照片 随着技术的进步&#xff0c;现在使用单个设备&#xff08;即 Android 手机&#xff09;&#xf…

【Python】 了解二分类:机器学习中的基础任务

我已经从你的 全世界路过 像一颗流星 划过命运 的天空 很多话忍住了 不能说出口 珍藏在 我的心中 只留下一些回忆 &#x1f3b5; 牛奶咖啡《从你的全世界路过》 在机器学习和数据科学领域&#xff0c;分类问题是最常见的任务之一。分类问题可以分为多类分…

使用贝塞尔曲线实现一个iOS时间轴

UI效果 实现的思路 就是通过贝塞尔曲线画出时间轴的圆环的路径&#xff0c;然后 使用CAShaper来渲染UI&#xff0c;再通过 animation.beginTime [cilrclLayer convertTime:CACurrentMediaTime() fromLayer:nil] circleTimeOffset 来设置每个圆环的动画开始时间&#xff0c; …

探索ChatGPT-4在解决化学知识问题上的研究与应用

1. 概述 近年来&#xff0c;人工智能的发展主要集中在 GPT-4 等大型语言模型上。2023 年 3 月发布的这一先进模型展示了利用广泛知识应对从化学研究到日常问题解决等复杂挑战的能力。也开始进行研究&#xff0c;对化学的各个领域&#xff0c;从化学键到有机化学和物理化学&…

【设计模式】行为型设计模式之 备忘录模式(快照模式)

介绍 备忘录应用场景明确并且有限&#xff0c;一般用来数据的防丢失、撤销和恢复。对大对象的备份和恢复&#xff0c;备忘录模式能有效的节省时间和空间开销。 定义 备忘录模式&#xff1a;也称为快照模式&#xff0c;在不违背封装原则的前提下&#xff0c;捕获一个对象的内…

BFS实现图的点的层次-java

加强对广度优先搜索的理解&#xff0c;其实就是主要的3个步骤&#xff0c;外加数组模拟单链表是基础&#xff0c;要搞懂。 目录 前言 一、图中点的层次 二、算法思路 1.广度优先遍历 2.算法思路 三、代码如下 1.代码如下&#xff08;示例&#xff09;&#xff1a; 2.读入…

探索基于订阅式的电视App:Android TV 端强大的开源视频播放器

探索基于订阅式的电视App&#xff1a;Android TV 端强大的开源视频播放器 在智能电视和流媒体日益普及的今天&#xff0c;一款强大的视频播放器是家庭娱乐的重要组成部分。正是这样一款为Android TV设计的开源视频播放器。本文将深入探讨电视盒子OSC的技术特点、使用方法以及其…

在Java中类中的成员变量和成员方法在jvm中如何协调调用及优化

第一部分&#xff1a; 在Java中类中的成员变量和成员方法在jvm中如何协调调用 在Java中&#xff0c;类的成员变量和成员方法在JVM&#xff08;Java虚拟机&#xff09;中的表现方式有一定的规则和结构。以下是对成员变量和成员方法在JVM中的一些关键点的解释&#xff1a; 成员…