vitis2021.1 armr5-none-eabi-objcopy -O binary elf文件转bin文件变大

2024-02-10 14:32

本文主要是介绍vitis2021.1 armr5-none-eabi-objcopy -O binary elf文件转bin文件变大,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

把编译的程序文件尾缀elf变成bin文件,编译的是xilinx 4ev R5核的裸机程序。

本来是一件很简单的事情,输入下面命令即可。

armr5-none-eabi-objcopy -O binary c_project_r5_app0.elf c_project_r5_app0.bin

但是编译出来的bin文件无法运行,排查文件大小,发现bin文件变得非常大,比elf文件还大。

很明显这不对劲,理论来说,elf文件变成bin文件应该会变小的,现在反了。

后面创建了一个A53的工程,使用上述命令,居然是正常的,搞的我一度怀疑人生。

最后突然想起是不是程序编译成bin文件进行了数据填充。

在elf文件转化成bin文件的过程中,输出段与段之间如果有空隙的话,objcopy会用0来填充段与段之间的空隙,这将会导致bin文件比elf文件大很多的问题。

为什么出现分段空隙呢,排查R5程序和A53程序,最后发现问题了。

在R5程序的链接文件中发现,.vectors段放在的是r5_0_atcm中,而其他的段都在DDR上。 

而DDR与r5_0_atcm中有巨大的地址空间,那么此时编译成bin文件就会发现中间空隙地址的填充,导致编程的bin文件异常大。两个地址差了0x100000(1MB)。

把.vectors段分配到psu_r5_ddr_0_MEM_0空间就能解决该问题。

此时我们要把这两个段分别编译出两个bin文件。

armr5-none-eabi-objcopy -O binary -j .vectors ${ProjName}.elf ${ProjName}_vectors.bin;armr5-none-eabi-objcopy -O binary -R .vectors ${ProjName}.elf ${ProjName}_application.bin
参数-j:只把.vectors段的代码生成bin文件。

参数-R:把.vectors段的代码删除,其他段生成bin文件。
更多信息请看armr5-none-eabi-objcopy --help

全篇完。

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
感谢~!

这篇关于vitis2021.1 armr5-none-eabi-objcopy -O binary elf文件转bin文件变大的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697355

相关文章

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

226 Invert Binary Tree

//226 Invert Binary Tree//算法思路:主要使用递归算法public class Solution {public TreeNode invertTree(TreeNode root) {//1 出口 空节点if (root==null)return null;//2 递归 调用自己TreeNode left = root.left;TreeNode right = ro

Python: #!/usr/bin/python3 #!/usr/bin/env python3

只能放在第一行,第二行就没有效果了。 1. 路径不同 #!/usr/bin/python3&& #!/usr/bin/env python3写在脚本语言第一行的目的是 想要以什么可执行程序去运行这个文件中的代码。 #!/usr/bin/python3是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python3解释器; #!/usr/bin/env python3这种用法是为了

使用pyelftools把elf文件转换成s19文件

要使用pyelftools将ELF文件转换成S19文件格式,你需要首先安装pyelftools库,然后编写一个脚本来读取ELF文件,提取其中的代码和数据部分,并按照S19文件的格式生成对应的记录。 以下是一个简单的Python脚本示例,它演示了如何使用pyelftools将ELF文件转换为S19文件: import elftoolsfrom elftools.elf.elffile impo

出现 E: Sub-process /usr/bin/dpkg returned an error code (1) 解决方法 (全面分析)

目录 前言1. 问题所示2. 原理分析2.1 第一阶段2.2 第二阶段 3. 解决方法4. 彩蛋4.1 错误不提示,直接卸载4.2 卸载后还是无错误提示 前言 3年前遇到过一个类似的,但是轻松解决,推荐阅读:ubuntu:E: dpkg was interrupted, you must manually run ‘sudo dpkg --configure…解决方法 这回发

[LeetCode] 863. All Nodes Distance K in Binary Tree

题:https://leetcode.com/problems/all-nodes-distance-k-in-binary-tree/ 题目大意 求给树中,距给定 结点 指定长度的 所有结点的val 思路 tree -> graph 、 bfs 先遍历树,并用map记录每个结点的父结点 ,将树变为图,然后 bfs。 /*** Definition for a binary tree

LeetCode 67 Add Binary

题意: 两个二进制数相加,输出结果 思路: 各种模拟均可,比如先把A和B倒过来,再按位相加,最后把结果再倒回来。 不过为了快,我是这样做的——假设A比B长,那么我对位相加B的长度。这时如果没有进位,那么A长出B的部分就不会变了;如果有进位,那么继续往A的高位加,直到某一次进位为0,那么更高位的A就不变了;如果直到最后还有进位,那就最前面添加一个最高位1。 代码: cla

Matlab_learning_1(set(gcf,'MenuBar','none','Position',[X,Y,Z,W]))

一、首先举个例程: set(gcf,'MenuBar','none','Position',[X,Y,Z,W]);

Classical Binary Search

Find any position of a target number in a sorted array. Return -1 if target does not exist. Example Example 1: Input: nums = [1,2,2,4,5,5], target = 2Output: 1 or 2 Example 2: Input: nums = [1,