4-KiB hizalanmış olması gereken bir veri yapısına sahibim. Bunu __attribute__ ((aligned (4096)))
kullanarak uygulayabilirim. Sorun, bu hizalama gereksiniminin belleğin boşa gitmesine neden olmasıdır. Bu (pg_dir
hizalanmış veri yapısı) Bağlayıcı sembolleri yerleştirir nasıl:Minimal Uzay Kullanımı için Hizalanmış Nesnelerin Düzenlenmesi Sırası
00011000 <cursor_loc>:
00012000 <pg_dir>:
00013000 <idt>:
cursor_loc
boyutu sadece dört bayttır. Bu daha iyi olurdu:
00011000 <pg_dir>:
00012000 <cursor_loc>:
00012008 <idt>:
(idt
burada hizalanmış 8 bayt olmalıdır.)
Böyle birden fazla dosya kullanarak üretebileceği:
test1.c
:
char aligned[4096] __attribute__ ((aligned (4096)));
int i;
test2.c
:
0000000000602004 <j>:
...
0000000000603000 <aligned>:
...
0000000000604000 <i>:
nasıl minimum uzay atığı sembollerini yeniden düzenlemek için GNU ld taşıyabilirsiniz:
int j;
int main(void) { }
O zaman bu
gcc test1.c test2.c
ve objdump -D a.out
baskılar inşa? Neden otomatik olarak yapılmadığını merak ediyorum.
Bu düzgün çalışıyor, teşekkürler. Ben sadece '-fno-common' ve '-fdata-section'ları kullanmama rağmen sembollerin niçin' .bss 'içinde olduklarını hala merak ediyorum. Aslında benim amaçlarım için .bss içinde olmalarına ihtiyacım var, aslında bu anahtarların ait oldukları bölümü neden değiştirmediklerini anlamıyorum. – Downvoter
Evet, '.bss' hakkında kafam karışmıştı. Bir başlatıcı belirttiğinizde sıfır başlatılmış sembolleri yalnızca .bss'den alabilirsiniz ve eğer hala sıfır ise, '-fno-zero-initialized-in-bss '(' .bss' optimizasyonunu engellemek için) derleyin. . Yine de '.bss' sembollerine ihtiyacın olduğuna sevindim. –
Yapamaz mı -Wl, - sıra-common' da çalışır? – Hasturkun