编辑:已解决 - 应用于静态数据部分的链接器脚本属性“SUBALIGN(32)”完全符合我的要求,强制每个链接的目标文件与 32 字节边界对齐,并自动插入填充。
__bss_start = .;
.bss :
SUBALIGN(32)
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
SORT(CONSTRUCTORS)
. = ALIGN(32);
} = 0
. = ALIGN(32);
我正在缓存不连贯架构上构建多程序基准测试,该架构由重命名并链接在一起的 EEMBC 套件的多个实例组成。
问题是库在可写数据段中没有对齐缓存线,我在这里遇到数据损坏(通过连贯模拟中的缓存线抖动来证明)。
例如,0x7500 处的缓存行在 Viterb0 和 Viterb1 上运行的内核之间共享,映射输出表明这是库 0 运行到库 1 开始的缓存行的位置:
...
.bss 0x000068e8 0xc24 ../EEMBClib/libmark_0.a(renamed_renamed_viterb00_viterb00.o)
.bss 0x0000750c 0x4 ../EEMBClib/libmark_1.a(renamed_renamed_viterb00_bmark_lite.o)
...
我需要将各个数据段中链接的每个目标文件对齐到32字节的边界,我只知道如何对齐整个部分,当前的.bss部分是:
__bss_start = .;
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
SORT(CONSTRUCTORS)
. = ALIGN(32);
} = 0
. = ALIGN(32);
任何帮助在这里将不胜感激,使用填充重建库并不是我真正想要考虑的选项,因为我希望这个更强大的解决方案用于该平台上的未来链接目的。