我有一个需要 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 以重新排列符号以最小化空间浪费?我真的很奇怪为什么它没有自动完成。
最佳答案
有一些习语要求对象按照命令行指定对象的顺序排列(这就是为什么你的结果有点奇怪,可能是由于常用符号),并且对象内定义不是重新排序。要解决这个问题,您需要这样的东西:
gcc -fno-common -fdata-sections -Wl,--sort-section=alignment test1.c test2.c
-fno-common
禁用公共(public)符号,-fdata-sections
允许链接器对同一文件中的符号重新排序,-Wl,--sort -section=alignment
最终启用对齐排序。
关于c - 重新排列对齐对象的顺序以最小化空间使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45128717/