当我们将从arm-gcc工具链生成的.elf文件转换为.bin文件时,其大小从40 kB增加到1.1Gb。
对于转换,我们使用:./arm-none-eabi-objcopy -O binary test.elf test.bin
这可能是因为非连续内存Map和内存区域之间的间隙正好被零填充。
在objcopy中可以使用哪些选项?或者是否有其他转换方法?
以下是小精灵的信息:
- 标记CPU名称:“Cortex-M7”标记_CPU_arch:v7E-M
标记CPU架构配置文件:微控制器Tag_THUMB_伊萨_用途:拇指-2
标签_FP_arch:适用于ARMv 8的FPv 5/FP-D16标签_ABI_PCS_wchar_t:4
标记_ABI_FP_非规格化:所需的Tag_ABI_FP_异常:需要
标签_ABI_FP_编号_型号:IEEE 754需要标签ABI对齐:8字节
标记ABI枚举大小:小标记_ABI_VFP_参数:VFP寄存器
标签_ABI_优化_目标:主动调试
标记CPU未对齐访问:第六版
ELF文件中包含的节的列表是-有25个节标题,从偏移量0x 3e 982 c开始:
Section Headers:
[Nr] Name
Type Addr Off Size ES Lk Inf Al
Flags
[ 0]
NULL 00000000 000000 000000 00 0 0 0
[00000000]:
[ 1] .flash_config
PROGBITS 60000000 020000 000200 00 0 0 4
[00000002]: ALLOC
[ 2] .ivt
PROGBITS 60001000 021000 000030 00 0 0 4
[00000002]: ALLOC
[ 3] .interrupts
PROGBITS 60002000 022000 000400 00 0 0 4
[00000002]: ALLOC
[ 4] .text
PROGBITS 60002400 022400 312008 00 0 0 16
[00000006]: ALLOC, EXEC
[ 5] .ARM
ARM_EXIDX 60314408 334408 000008 00 4 0 4
[00000082]: ALLOC, LINK ORDER
[ 6] .init_array
INIT_ARRAY 60314410 334410 000004 04 0 0 4
[00000003]: WRITE, ALLOC
[ 7] .fini_array
FINI_ARRAY 60314414 334414 000004 04 0 0 4
[00000003]: WRITE, ALLOC
[ 8] .interrupts_ram
PROGBITS 20200000 380000 000000 00 0 0 1
[00000001]: WRITE
[ 9] .data
PROGBITS 20200000 340000 014bd0 00 0 0 8
[00000007]: WRITE, ALLOC, EXEC
[10] .ncache.init
PROGBITS 20214bd0 354bd0 011520 00 0 0 4
[00000003]: WRITE, ALLOC
[11] .ncache
NOBITS 20226100 366100 0021d8 00 0 0 64
[00000003]: WRITE, ALLOC
[12] .bss
NOBITS 20229000 369000 077ce8 00 0 0 4096
[00000003]: WRITE, ALLOC
[13] .NVM_TABLE
PROGBITS 20000000 010000 00000c 00 0 0 4
[00000003]: WRITE, ALLOC
[14] .heap
NOBITS 2000000c 01000c 000404 00 0 0 1
[00000003]: WRITE, ALLOC
[15] .stack
NOBITS 20000410 01000c 000400 00 0 0 1
[00000003]: WRITE, ALLOC
[16] .NVM
PROGBITS 60570000 370000 010000 00 0 0 1
[00000003]: WRITE, ALLOC
[17] .ARM.attributes
ARM_ATTRIBUTES 00000000 380000 00002e 00 0 0 1
[00000000]:
[18] .comment
PROGBITS 00000000 38002e 00004c 01 0 0 1
[00000030]: MERGE, STRINGS
[19] .debug_frame
PROGBITS 00000000 38007c 001174 00 0 0 4
[00000000]:
[20] .stab
PROGBITS 00000000 3811f0 0000cc 0c 21 0 4
[00000000]:
[21] .stabstr
STRTAB 00000000 3812bc 0001b9 00 0 0 1
[00000000]:
[22] .symtab
SYMTAB 00000000 381478 046620 10 23 13540 4
[00000000]:
[23] .strtab
STRTAB 00000000 3c7a98 021cb2 00 0 0 1
[00000000]:
[24] .shstrtab
STRTAB 00000000 3e974a 0000df 00 0 0 1
[00000000]:
2条答案
按热度按时间w46czmvw1#
所以
so.ld
建筑物
从阅读
现在这样。ld
实际上是.bss在这里发挥了作用,这是一些其他的研究项目,我本可以从.C文件开始,但尝试了asm...
现在它是可能需要的6个字节,没有填充,但是当然你必须在链接器脚本中添加标签,并在引导代码中使用它们来将.data移动到ram和zero.bss等。
请注意,现在物理地址位于0x00000000范围内,它位于. text使用的空间的末尾,但虚拟地址(它希望驻留的位置,需要驻留的位置,不要认为这里是mmu或类似的东西,只要认为是两个地址空间(在闪存上和使用的位置))。
如果这一点不清楚:
objcopy从定义的最低(可加载)地址(而非零)开始二进制文件...文件大小是最低寻址字节和最高寻址字节的差值(包括最低寻址字节和最高寻址字节)。
efzxgjgh2#
我也遇到了同样的问题,最后我发现不是objcopy的问题,我只是改变了我的编译命令,它就工作了。一开始,我只是使用gcc,我像你一样面对问题,然后我尝试使用gcc -c和ld(只是分开这两个步骤),文件神奇地变小了。所以可能问题是在gcc,而不是objcopy。你可以像我一样尝试,我现在的编译命令是:
希望它能帮助你...