可以創建任意大小的二進制文件,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
打開文件,字節添加到末尾,關閉它,你可以有一個奇怪的長文件,那麼怎麼看的工具很多突破,當您嘗試使用它... –