2017-07-16 71 views
6

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.

cevap

2

Sipariş nesnelerinde komut nesnelerinde yer almasını gerektiren bazı deyimler komut satırında belirtilmiştir (bu nedenle sonuçlarınız biraz tuhaftır, belki de ortak sembollerden kaynaklanmaktadır) ve nesne içi tanımlar tanımlanmıştır. yeniden düzenlenmedi.

gcc -fno-common -fdata-sections -Wl,--sort-section=alignment test1.c test2.c 

-fno-common ortak semboller devre dışı bırakır

, -fdata-sections bağlayıcı Aynı dosyadan sembolleri yeniden düzenlemek için izin verir ve -Wl,--sort-section=alignment nihayet hizalama göre sıralama sağlar: Bu geçici bir çözüm için, böyle bir şey gerekiyor.

+0

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

+0

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. –

+0

Yapamaz mı -Wl, - sıra-common' da çalışır? – Hasturkun