6
我有一個數據結構需要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
:
0000000000602004 <j>:
...
0000000000603000 <aligned>:
...
0000000000604000 <i>:
我怎樣才能移動GNU LD重新排列爲最小的空間浪費符號:
int j;
int main(void) { }
然後用
gcc test1.c test2.c
和objdump -D a.out
打印此建呢?我真的很想知道爲什麼它不能自動完成。
這工作整齊,謝謝。我只是想知道爲什麼當我objdump時它們仍然出現在'.bss'中,儘管我使用了'-fno-common'和'-fdata-sections'。實際上,我需要它們在'.bss'中,這只是我不明白爲什麼這些開關不會更改它們所屬的部分。 – Downvoter
是的,我對'.bss'感到困惑。如果你指定了一個初始化方法,你只能從'.bss'中得到零初始化的符號,如果它仍然爲零,編譯'-fno-zero-initialized-in-bss'(來禁止'.bss'優化) 。很高興你需要'.bss'符號。 –
不會「-Wl, - sort-common」也起作用嗎? – Hasturkun