在连接文件的.bss段对齐静态数组
-
21-09-2019 - |
题
我有一个函数:
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
任何人都知道如何对齐阵列?
解决方案
我不知道,你可以用链接脚本做到这一点,我很困惑的是你的目标;连接到每个汇编声明对准属性推测符合ABI和机的要求。你们是不是要提高缓存命中率是多少?补偿在源代码中的非贴合型双关?
一两件事就可以“容易”做是GNU对准扩展添加到C源。
static unsigned char smallArray[1] __attribute__ ((aligned (4)));
更新:嗯,这产生明显较大的第三方宏库不符合要求的代码? (如果是符合标准的代码,它大概会很好地工作。:-)好吧,这是一个可怕的杂牌,但我几乎可以保证,将“工作”,FSDO“工作”,而不是需要调试宏lib中。 。你可以后处理,编译器的汇编语言输出。局部静态BSS符号不敏感布局,并在单个.comm
或.lcomm
指令,为此,最后一个参数是可能的对准量通常声明。
此参数是什么__attribute__
变化。你可以使用某种类型的脚本的构建过程中改变他们... ...
其他提示
在我制作系统,所述接头参数可以被控制来设置每个部分的开始的对准 - 但不是部分内的各个变量的对准。单个变量的取向是由编译器根据变量的类型来确定。
您可能能够使用某种编译器编译,当然特定平台的。
另一种方法是定义阵列的需要的任何类型的对准,如uint32_t的阵列。
我很好奇,想知道你想达到什么样的 - 这听起来好像你正在做的事情有点不寻常和特定于平台的,如果你有这样的对齐要求。最好在所有可能建立的过程独立于平台的代码,如果,
不隶属于 StackOverflow