ld如何决定节的对齐方式?

问题描述 投票:0回答:1

我使用

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
gcc arm ld cortex-m memory-alignment
1个回答
0
投票

输入对象可以具有对齐约束。链接器将选择链接器脚本或输入对象中最大的一个。

© www.soinside.com 2019 - 2024. All rights reserved.