可以创建任意大小的二进制文件,4字节对齐只是为了方便。每个人都这样做,每个人都期待它。
对齐在链接描述文件中强制执行。如果您在*.ld
文件的项目看,你会发现有很多的
. = ALIGN(4);
语句。他们命令链接器将当前的输出地址到所以我已经创建了一个空的项目由4
是整除的值,并删除了大部分从链接脚本的ALIGN
行:
ENTRY(Reset_Handler)
__stack = 0x20014000;
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 80K
}
SECTIONS
{
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector))
. = ALIGN(4);
} >FLASH
.text :
{
*(.text)
*(.text*)
} >FLASH
.rodata :
{
*(.rodata)
*(.rodata*)
} >FLASH
_sidata = LOADADDR(.data);
.data :
{
_sdata = .;
*(.data)
*(.data*)
_edata = .;
} >RAM AT> FLASH
.bss :
{
_sbss = .;
*(.bss)
*(.bss*)
*(COMMON)
_ebss = .;
} >RAM
}
最小的程序:
void Reset_Handler(void) {
while(1)
;
}
编译和链接-nostartfiles -nodefaultlibs -nostdlib
它,离开了所有的标准库的东西。结果是
arm-none-eabi-size --format=berkeley "unaligned.elf"
text data bss dec hex filename
320 0 0 320 140 unaligned.elf
被四等分整除。然后,我添加了一个char变量,并做了一些与它:
volatile char c = 0x42;
void Reset_Handler(void) {
while(1)
c+=1;
}
这就造成了
Invoking: Cross ARM GNU Print Size
arm-none-eabi-size --format=berkeley "unaligned.elf"
text data bss dec hex filename
336 1 0 337 151 unaligned.elf
Finished building: unaligned.siz
指令对齐到16位。
像STM32系列这样基于Cortex-M的MCU使用Thumb2指令集,它是16位和32位指令的混合。事实证明,我们的第一个程序恰好有一个可以被四整除的长度。我已经添加单个nop
指令
void Reset_Handler(void) {
asm("nop");
while(1)
;
}
和尺寸增加了两个字节,比原来的:
Invoking: Cross ARM GNU Print Size
arm-none-eabi-size --format=berkeley "unaligned.elf"
text data bss dec hex filename
322 0 0 322 142 unaligned.elf
Finished building: unaligned.siz
为什么地球上你想要二进制的大小不是4的倍数? –
这里你的目标是什么?编译器可能会填充您的结构以确保内存访问清晰。如果你想要突破这个问题,我不知道你希望达到什么目的。 – tadman
打开文件,字节添加到末尾,关闭它,你可以有一个奇怪的长文件,那么怎么看的工具很多突破,当您尝试使用它... –