我有一个需要4-KiB对齐的数据结构。我可以使用__attribute__ ((aligned (4096)))
来强制执行这个要求。
问题是,这种对齐要求会浪费内存。这是链接器放置符号的方式(pg_dir
是对齐的数据结构):
00011000 <cursor_loc>:
00012000 <pg_dir>:
00013000 <idt>:
cursor_loc
只有四个字节的大小。这样会更好:
00011000 <pg_dir>:
00012000 <cursor_loc>:
00012008 <idt>:
(此处必须将idt
调整为8字节对齐。)
您可以通过使用多个类似以下文件来重现它:
test1.c
:
char aligned[4096] __attribute__ ((aligned (4096)));
int i;
test2.c
:
int j;
int main(void) { }
然后使用以下命令构建:
gcc test1.c test2.c
执行objdump -D a.out
命令后,输出结果如下:
0000000000602004 <j>:
...
0000000000603000 <aligned>:
...
0000000000604000 <i>:
如何移动GNU ld以重新排列符号以最小化空间浪费?我真的很想知道为什么它不会自动完成。
-fno-common
和-fdata-sections
时,符号仍然出现在.bss
中,即使我使用objdump
查看它们。实际上,我需要它们在.bss
中,但我不明白为什么这些开关不能改变它们所属的部分。 - cadaniluk-Wl,--sort-common
,但是没有得到期望的效果。 - Florian Weimer