【ARM 嵌入式 编译系列 10.4 -- 生成二进制文件】

文章目录

    • 二进制文件生成
      • dd 命令copy文件
      • 使用16进制对二进制文件显示

二进制文件生成

在嵌入的工作中,经常会使用到二进制文件,那么我们如何自己生成一个二进制文件呢?接下来介绍如何将一个只包含将32位数据的文件转化为二进制文件,原文件如下(数据一共 64bytes):

unsigned int data[] ={0x11223344,0x11223344,0x11223344,0x11223344,0x11223344,0x11223344,0x11223344,0x11223344,0x55556666,0x55556666,0x55556666,0x55556666,0x55556666,0x55556666,0x55556666,0x55556666
};

我们使用gcc 对齐先进行编译然后再进行反汇编:

arm-none-eabi-gcc --help
Usage: arm-none-eabi-gcc [options] file...
Options:...-E                       Preprocess only; do not compile, assemble or link.-S                       Compile only; do not assemble or link.-c                       Compile and assemble, but do not link.-o <file>                Place the output into <file>....

具体命令如下:

arm-none-eabi-gcc -c data.c -o data.bin

通过上面命令会生成一个elf 格式的 data.bin文件,由于我们需要的是个纯二进制文件,所以我们需要将 elf 文件的头和其它部分去掉。那么我们看下头有多大:

arm-none-eabi-readelf -h data.bin
ELF Header:Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00Class:                             ELF32Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              REL (Relocatable file)Machine:                           ARMVersion:                           0x1Entry point address:               0x0Start of program headers:          0 (bytes into file)Start of section headers:          448 (bytes into file)Flags:                             0x5000000, Version5 EABISize of this header:               52 (bytes)Size of program headers:           0 (bytes)Number of program headers:         0Size of section headers:           40 (bytes)Number of section headers:         9Section header string table index: 8

可以看到头(Size of this header)的大小为52个字节,所接下来我们就需要跳过这52个字节,只保留我们想要的内容。

dd 命令copy文件

在 linux 中,dd 是一个用于转换和复制文件的命令行工具,它可以执行许多底层操作,包括从文件的特定位置开始读取数据。要从原文件data.bin的第52个字节开始读取64个字节,可以使用以下命令:

dd if=data.bin of=new.bin bs=1 skip=51 count=64 

这里是命令参数的解释:

  • if=data.bin: 指定输入文件(input file)的名称。
  • of=new.bin: 指定输出文件(output file)的名称。
  • bs=1: 设置块大小(block size)为1字节。
  • skip=51: 跳过输入文件的前51个字节(因为我们是从第0字节开始计数的,所以51会跳过到第52个字节)。
  • count=64: 读取64个字节的数据。

确保替换 data.bin 为您的源文件名。运行上述命令后,在当前目录下得到一个名为 new.bin 的文件,其中包含从 data.bin 文件的第52个字节开始的64个字节的数据。接下来我们看下如确认是否生成成功。

使用16进制对二进制文件显示

使用vim -b new.bin, 然后执行:%!xxd -e 可以看到如下内容:

00000000: 11223344 11223344 11223344 11223344  D3".D3".D3".D3".
00000010: 11223344 11223344 11223344 11223344  D3".D3".D3".D3".
00000020: 55556666 55556666 55556666 55556666  ffUUffUUffUUffUU
00000030: 55556666 55556666 55556666 55556666  ffUUffUUffUUffUU
00000040:       0a 

也可以使用xxd -p -c4 -e new.bin 直接在终端每行显示4个字节:

00000000: 11223344  D3".
00000004: 11223344  D3".
00000008: 11223344  D3".
0000000c: 11223344  D3".
00000010: 11223344  D3".
00000014: 11223344  D3".
00000018: 11223344  D3".
0000001c: 11223344  D3".
00000020: 55556666  ffUU
00000024: 55556666  ffUU
00000028: 55556666  ffUU
0000002c: 55556666  ffUU
00000030: 55556666  ffUU
00000034: 55556666  ffUU
00000038: 55556666  ffUU
0000003c: 55556666  ffUU

上面使用dd 命令对 elf 文件进行拷贝,这样每次我们还需要去确认头文件的大小,那么有么有方法可以一步到位呢?
答案是肯定的,我们可以使用下面命令既可以一步到位:

arm-none-eabi-objcopy -O binary data.bin new.bin

这里是命令参数的解释:

  • data.bin: 源文件,即你的 ELF 格式目标文件。
  • new.bin: 输出文件,即去除文件头之后的纯二进制文件。
  • -O binary: 指定输出格式为纯二进制 (binary)。

运行这个命令后,new.bin 文件将只包含 data.bin 中的代码段和数据段的二进制数据,而不包含任何 ELF 格式的元数据或文件头信息。这在为嵌入式系统准备固件或加载文件到特定内存地址时非常有用。

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

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

相关文章

人工智能顶会CVPR2022《革新AI预训练:探索KDEP及其在知识蒸馏中的破局之道》论文解读

这里写目录标题 1.引言KDEP的核心概念&#xff1a;与传统知识蒸馏的区别&#xff1a; 2.KDEP方法KDEP的基本设置&#xff1a;KDEP的目标&#xff1a;非参数方法在特征尺寸对齐中的作用非参数对齐的工作原理&#xff1a;**SVD的工作原理**&#xff1a;PTS的基本思想&#xff1a;…

如何在 TypeScript 中遍历 Enum 的两种方案

背景 TypeScript 中有一个 JavaScript 中没有的声明关键字&#xff0c;即 enum ,在 TypeScript 项目开发过程中&#xff0c;我发现使用枚举enum的概率是极高的。枚举是一种特殊的数据类型&#xff0c;它允许开发者定义一个静态变量集合。枚举类型帮助开发者清晰的预设集合中的…

HarmonyOS4.0系统性深入开发04UIAbility组件详解(下)

UIAbility组件间交互&#xff08;设备内&#xff09; UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启…

DBeaver Community(社区版)下载及安装自用版

DBeaver Community&#xff08;社区版&#xff09;下载及安装自用版 数据库管理工具好用的都收费&#xff0c;收费的都好用。 DBeaver Community&#xff08;社区版&#xff09;免费&#xff0c;功能够用&#xff0c;性能可以&#xff0c;推荐。商业版的强大&#xff0c;收费&a…

网络知识点之-MPLS VPN

随着网络经济的发展&#xff0c;企业对于自身网络的建设提出了越来越高的要求&#xff0c;主要表现在网络的灵活性、经济性、扩展性等方面。在这样的背景下&#xff0c;VPN以其独有的优势赢得了越来越多企业的青睐。利用公共网络来构建的私有专用网络称为虚拟私有网络&#xff…

leetcode 面试题 17.19. 消失的两个数字 (hard)(优质解法)

链接&#xff1a;面试题 17.19. 消失的两个数字 代码&#xff1a; class Solution {public int[] missingTwo(int[] nums) {int lengthnums.length;int tmp0;//将完整数据以及 nums 中的数据都进行异或&#xff0c;得到的就是缺失的两个数字 a^b 的结果for(int i1;i<length…

vue3项目 - 使用 pnpm 包管理器来创建项目

创建项目 npm install -g pnpm pnpm create vue 输入项目名称、包名称、选择要安装的依赖&#xff0c;最后 pnpm install pnpm format #规范格式 pnpm dev #启动项目

jQuery的事件-动画-AJAX和插件

一、jQuery事件处理 1.认识事件&#xff08;Event&#xff09; Web页面经常需要和用户之间进行交互&#xff0c;而交互的过程中我们可能想要捕捉这个交互的过程&#xff1a; 比如用户点击了某个按钮、用户在输入框里面输入了某个文本、用户鼠标经过了某个位置&#xff1b;浏…

使用vite创建vue3项目

1、使用管理员身份打开命令行窗口&#xff0c;输入命令: npm create vuelatest TypeScript语法选择是&#xff0c;其他依次选择否&#xff0c;创建完毕。 2、 创建完毕后打开项目&#xff0c;vscode会提示安装开发相关的插件&#xff0c;选择install 3、打开vscode终端&#x…

【力扣】199.二叉树的右视图

看到这个题目的一瞬间&#xff0c;我想递归&#xff0c;必须用递归。最近被递归折磨的有点狠&#xff0c;但是我感觉我快要打败它了&#xff0c;就是现在稍稍有点处于劣势。不过没关系&#xff0c;来日方长不是。 法一&#xff1a;递归 题解&#xff1a; 之前想的就是先递归&…

2024哪款洗地机最值得入手?热门洗地机推荐

近年来&#xff0c;洗地机的被大家熟悉&#xff0c;越来越多的家庭购置洗地机来清洁家里的卫生&#xff0c;集吸、拖、洗为一体的三重清洁方式&#xff0c;为经常打扫卫生的宝妈脱离了做家务的困境&#xff0c;不用再经历繁琐的清洁步骤(扫地→拖地→拖干)&#xff0c;一拖一拉…

做APP小程序软件开发需要注意哪些细节?

随着移动互联网的快速发展&#xff0c;APP和小程序已成为我们日常生活中不可或缺的一部分。然而&#xff0c;在开发过程中&#xff0c;许多细节常常被忽视&#xff0c;导致用户体验不佳、软件漏洞频发等问题。本文将探讨在APP和小程序开发中需要注意的细节&#xff0c;帮助开发…

华为数通方向HCIP-DataCom H12-831题库(多选题:221-240)

第221题 在割接项目的项目调研阶段需要对现网硬件环境进行观察,主要包括以下哪些内容? A、设备的位置 B、ODF位置 C、接口标识 D、光纤接口对应关系 答案:ABCD 解析: 在项目割接前提的项目调研阶段,需要记录下尽可能详细的信息。 第222题 以下哪些项能被正则表达式10*成…

2024年山东省安全员B证证考试题库及山东省安全员B证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年山东省安全员B证证考试题库及山东省安全员B证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

SQL server 数据库练习题及答案(练习2)

使用你的名字创建一个数据库 创建表&#xff1a; 数据库中有三张表&#xff0c;分别为student,course,SC&#xff08;即学生表&#xff0c;课程表&#xff0c;选课表&#xff09; 问题&#xff1a; --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…

JBoss JMXInvokerServlet 反序列化漏洞 CVE-2015-7501 已亲自复现

JBoss JMXInvokerServlet 反序列化漏洞 CVE-2015-7501 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 漏洞名称 漏洞描述 在Oracle Rapid Planning 12.1/12.2.2中发现了一个被归类为“严重”的漏洞。受到影响的是一些未知的组件处理中间层。升…

【Spark-HDFS小文件合并】使用 Spark 实现 HDFS 小文件合并

【Spark-HDFS小文件合并】使用 Spark 实现 HDFS 小文件合并 1&#xff09;导入依赖2&#xff09;代码实现2.1.HDFSUtils2.2.MergeFilesApplication 需求描述&#xff1a; 1、使用 Spark 做小文件合并压缩处理。 2、实际生产中相关配置、日志、明细可以记录在 Mysql 中。 3、…

JAVA日志

日志 Slf4j slf4j 的全称是 Simple Loging Facade For Java&#xff0c;即它仅仅是一个为 Java 程序提供日志输出的统一接口&#xff0c;并不是一个具体的日志实现方案&#xff0c;就比如 JDBC 一样&#xff0c;只是一种规则而已。所以单独的 slf4j 是不能工作的&#xff0c;…

如何使用 Matplotlib 绘制 3D 圣诞树

系列文章目录 前言 转自&#xff1a;How to draw a 3D Christmas Tree with Matplotlib | by Timur Bakibayev, Ph.D. | Analytics Vidhya | Mediumhttps://medium.com/analytics-vidhya/how-to-draw-a-3d-christmas-tree-with-matplotlib-aabb9bc27864 因为我们把圣诞树安装…

Sql 动态行转列

SELECT ID, Name, [Month],auth FROM dbo.Test3 数据列表&#xff1a; 1.静态行专列 Select auth, MAX( CASE WHEN [Month] 一月 then Name else null end) 一月, MAX( CASE WHEN [Month] 二月 then Name else null end) 二月, MAX( CASE WHEN…