我使用
arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi
交叉编译 Cortex M 微控制器
.bss
有2KB对齐
obj转储:
Idx Name Size VMA LMA File off Algn Flags
[...]
6 .data 0000354c 20001000 3008f614 00091000 2**3 CONTENTS, ALLOC, LOAD, DATA
7 .dataNonCacheable 00000000 20000d00 20000d00 00094550 2**3 CONTENTS
8 .data_OCRAM 00000000 20200000 20200000 00094550 2**0 CONTENTS
9 .bss 00033d3c 20004800 20004800 00000800 2**11 ALLOC
10 .bssNonCacheable 00000d00 20000000 20000000 00001000 2**6 ALLOC
11 .bss_OCRAM 00029558 20200000 20200000 00001000 2**3 ALLOC
[...]
读自己:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[...]
[ 7] .data PROGBITS 20001000 091000 00354c 00 WA 0 0 8
[ 8] .dataNonCacheable PROGBITS 20000d00 094550 000000 00 W 0 0 8
[ 9] .data_OCRAM PROGBITS 20200000 094550 000000 00 W 0 0 1
[10] .bss NOBITS 20004800 000800 033d3c 00 WA 0 0 2048
[11] .bssNonCacheable NOBITS 20000000 001000 000d00 00 WA 0 0 64
[12] .bss_OCRAM NOBITS 20200000 001000 029558 00 WA 0 0 8
[13] .textFlash PROGBITS 30002348 003348 0627c8 00 AX 0 0 8
[...]
但是,我的链接器脚本不强制执行这样的对齐方式:
.bss : ALIGN(8)
{
*(.bss*)
*(COMMON)
. = ALIGN(4) ;
} > SRAM_DTC
所以我怀疑是编译器设置了 2KB 的最小对齐方式。但是,我分析了每个 .o 文件,但没有找到任何具有
.bss
且对齐高于 1: 的 .o
for f in `find FW/build/ -type f -name *.o` ;do echo $f; /opt/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-readelf -S -W $f; done | grep " .bss " | awk '{ if ($NF > 1) print $0 }'
所以它必须是链接器任意决定 2KB 对齐方式。
我想了解为什么以及如何避免这种情况
编辑2024-08-30
我修改了命令行,因为之前的命令行不起作用:
for f in `find FW/build/ -type f -name *.o
do
echo $f
/opt/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-readelf -S -W $f
done | grep " .bss" | \
awk 'strtonum($6) > 0 {print $NF, $0}' | \
sort -n | \
cut -d' ' -f2-
所以我找到了强制2KB对齐的变量:
[...]
[172] .bss.txFrameInfoArray_1.0 NOBITS 00000000 0012c0 000048 00 WA 0 0 64
[173] .bss.txDataBuff_1.1 NOBITS 00000000 0012c0 001200 00 WA 0 0 64
[176] .bss.txFrameInfoArray_0.4 NOBITS 00000000 0012c0 000048 00 WA 0 0 64
[177] .bss.txDataBuff_0.5 NOBITS 00000000 0012c0 001200 00 WA 0 0 64
[121] .bss._dcd_data NOBITS 00000000 001800 000600 00 WA 0 0 2048
输入对象可以具有对齐约束。链接器将选择链接器脚本或输入对象中最大的一个。