我有一个功能:
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
任何人都知道如何对齐数组?
答案 0 :(得分:2)
我不确定你能用链接器脚本做到这一点,我对你的目标感到困惑;附加到每个汇编器声明的alignment属性可能符合ABI和机器要求。您是否尝试提高缓存命中率?在源代码中补偿不合格类型的惩罚?
您可以“轻松”做的一件事是将gnu对齐扩展添加到C源。
static unsigned char smallArray[1] __attribute__ ((aligned (4)));
更新:嗯,一个大型的第三方宏库,它会生成明显不符合规范的代码? (如果它是符合标准的代码,它可能会正常工作。:-)好吧,这是一个可怕的kludge,但我几乎可以保证它“工作”,FSDO“工作”,而不需要调试宏库..你可以对编译器的汇编语言输出进行后期处理。局部静态bss符号不是布局敏感的,通常在单个.comm
或.lcomm
指令中声明,最后一个参数可能是对齐量。
此参数是__attribute__
更改的参数。您可以在构建期间使用某种脚本更改所有内容...
答案 1 :(得分:1)
在我研究过的系统中,可以控制链接器参数来设置每个部分开始的对齐 - 但不是部分中各个变量的对齐。各个变量的对齐由编译器根据变量的类型确定。
您当然可以使用某种编译器编译指示,特定于平台。
另一种方法是将数组定义为需要对齐的任何类型的数组,例如uint32_t。
我很想知道你想要实现什么 - 听起来好像你正在做一些不寻常和特定于平台的事情,如果你有这种对齐要求的话。当然,如果可能的话,最好创建与平台无关的代码。