cad*_*luk 6 c x86 gcc ld memory-alignment
我有一个需要4-KiB对齐的数据结构.我可以使用强制执行此操作__attribute__ ((aligned (4096))).
问题是这种对齐要求会导致内存浪费.这是链接器放置符号的方式(pg_dir是对齐的数据结构):
00011000 <cursor_loc>:
00012000 <pg_dir>:
00013000 <idt>:
Run Code Online (Sandbox Code Playgroud)
cursor_loc只有四个字节.这会更好:
00011000 <pg_dir>:
00012000 <cursor_loc>:
00012008 <idt>:
Run Code Online (Sandbox Code Playgroud)
(这里idt必须是8字节对齐.)
您可以使用以下多个文件重现它:
test1.c:
char aligned[4096] __attribute__ ((aligned (4096)));
int i;
Run Code Online (Sandbox Code Playgroud)
test2.c:
int j;
int main(void) { }
Run Code Online (Sandbox Code Playgroud)
然后用它构建它
gcc test1.c test2.c
Run Code Online (Sandbox Code Playgroud)
并objdump -D a.out打印这个:
0000000000602004 <j>:
...
0000000000603000 <aligned>:
...
0000000000604000 <i>:
Run Code Online (Sandbox Code Playgroud)
如何移动GNU ld重新排列符号以减少空间浪费?我真的很想知道它为什么不自动完成.
有一些习惯用法要求对象按照命令行上指定的对象顺序排列(这就是为什么你的结果有点奇怪,可能是由于常见的符号),并且对象内定义不重新排序。要解决这个问题,您需要这样的东西:
gcc -fno-common -fdata-sections -Wl,--sort-section=alignment test1.c test2.c
Run Code Online (Sandbox Code Playgroud)
-fno-common禁用通用符号,-fdata-sections允许链接器对同一文件中的符号重新排序,-Wl,--sort-section=alignment最后启用按对齐方式排序。