在链接器文件的.bss部分中对齐静态数组

时间:2009-10-14 01:03:13

标签: arrays embedded elf linker-scripts

我有一个功能:

void testfunction() {
 static char_t theChar1 = 1;
 static unsigned char smallArray[1];
 static unsigned char largeArray[135];
    ...
}

和链接器文件:

  . = ALIGN(4);
  _edata = . ;
  PROVIDE (edata = .);

  .bss (NOLOAD) :
  {
    __bss_start = . ;
    __bss_start__ = . ;
    *(.bss)
    *(.bss.*)
    *(COMMON)
    . = ALIGN(4);
  } > ramEXT

  . = ALIGN(4);
  __bss_end__ = . ;
  PROVIDE (__bss_end = .);

我需要静态数组(.bss数据)在4字节边界上对齐,但似乎数组拒绝这样做。结构和基元类型对齐很好(参见填充线),但阵列全部结束。这是我的地图文件:

 .data.firstTimeFlag.7295
                0xa000098c        0x4 output/file1.o
 .data.theChar1.5869
                0xa0000990        0x1 output/file2.o
 *fill*         0xa0000991        0x3 00
 .data.debounce
                0xa0000994      0x270 output/file3.o

...

 .bss.initialized.5826
                0xa000812c        0x1 output/file2.o
 *fill*         0xa000812d        0x3 00
 .bss.allocator.5825
                0xa0008130       0x34 output/file2.o
 .bss.largeArray.5869
                0xa0008164       0x87 output/file2.o
 .bss.smallArray.5868
                0xa00081eb        0x1 output/file2.o
 .bss.initialized.5897
                0xa00081ec        0x1 output/file2.o
 *fill*         0xa00081ed        0x3 00
 .bss.allocator.5896

任何人都知道如何对齐数组?

2 个答案:

答案 0 :(得分:2)

我不确定你能用链接器脚本做到这一点,我对你的目标感到困惑;附加到每个汇编器声明的alignment属性可能符合ABI和机器要求。您是否尝试提高缓存命中率?在源代码中补偿不合格类型的惩罚?

您可以“轻松”做的一件事是将gnu对齐扩展添加到C源。

static unsigned char smallArray[1] __attribute__ ((aligned (4)));

更新:嗯,一个大型的第三方宏库,它会生成明显不符合规范的代码? (如果它是符合标准的代码,它可能会正常工作。:-)好吧,这是一个可怕的kludge,但我几乎可以保证它“工作”,FSDO“工作”,而不需要调试宏库..你可以对编译器的汇编语言输出进行后期处理。局部静态bss符号不是布局敏感的,通常在单个.comm.lcomm指令中声明,最后一个参数可能是对齐量。

此参数是__attribute__更改的参数。您可以在构建期间使用某种脚本更改所有内容...

答案 1 :(得分:1)

在我研究过的系统中,可以控制链接器参数来设置每个部分开始的对齐 - 但不是部分中各个变量的对齐。各个变量的对齐由编译器根据变量的类型确定。

您当然可以使用某种编译器编译指示,特定于平台。

另一种方法是将数组定义为需要对齐的任何类型的数组,例如uint32_t。

我很想知道你想要实现什么 - 听起来好像你正在做一些不寻常和特定于平台的事情,如果你有这种对齐要求的话。当然,如果可能的话,最好创建与平台无关的代码。