Ana()

2015-11-23 15 views
9

'un prologunda amacın amacı nedir? main işlevinin (basit bir oyuncak programın) prologunda, 64 bit makinede gcc -g -o program -m32 program.c (ubuntu 14.04 çalıştırılıyor) kullanılarak derlenmiştir. aşağıdaki sökme:Ana()

eğitimin amacı nedir
dump of assembler code for function main: 
    0x08048e24 <+0>: push %ebp 
    0x08048e25 <+1>: mov %esp,%ebp 
    0x08048e27 <+3>: and $0xfffffff0,%esp 
    ... 

< 3 at>? Bu nedenle, neden $esp 16 hizalanmış bir adrese işaret etmelidir?

cevap

9

Sistem V AMD64 ABI (x86-64 ABI) 16 baytlık yığın hizalaması gerektirir. double, 8 bayt hizalama gerektirir ve SSE uzantıları 16 bayt hizalama gerektirir. -mpreferred-stack-boundary seçeneği için belgelerinde

gccdocumentation noktası o:

-mpreferred-yığın sınır = num 2'ye hizalanmış istif sınır tutmak için

Denemesi num bayt sınırının yükseltilmiş . -mpreferred-stack-border belirtilmemişse, varsayılan 4'dür (16 bayt veya 128 bit).

Uyarı:, -mpreferred-yığın sınır = 3 8 bayt sınırının hizalanmış istif sınır tutmak için kullanılabilir devre SSE uzantılı x86-64 mimarisi için kod oluşturma. X86-64 ABI, 16 byte yığın hizalaması gerektirdiğinden, bu ABI uyumsuzdur ve yığın alanının önemli bir sınırlama olduğu kontrollü ortamda kullanılmak üzere tasarlanmıştır. Bu seçenek, 16 baytlık yığın hizalaması (standart kitaplıktaki işlevler gibi) ile derlenmiş işlevler yanlış hizalanmış yığınla çağrıldığında yanlış kodlara neden olur. Bu durumda, SSE talimatları yanlış hizalanmış hafıza erişim tuzaklarına yol açabilir. Ayrıca, değişken argümanlar yanlış sonuçlara yol açan 16 bayt hizalanmış nesne (x87 uzun çift ve __int128 dahil) için yanlış şekilde işlenir. Tüm modülleri, herhangi bir kitaplık dahil olmak üzere -mpreferred-stack-boundary = 3 ile oluşturmalısınız. Bu sistem kütüphaneleri ve başlangıç ​​modülleri içerir.

+1

-m32 bayrağıyla derlediğimde hala duruyor? – Bush

+0

@Bush Sanırım SSE'den dolayı 16 bitlik -m32 ile kullanıyorlar. – ouah

+0

Her x86-64 ABI bunu yapmaz, bu yüzden insanlar sadece bir tane ve sadece x86-64 ABI olduğunu varsayarsam, biraz tahriş olurum. Bu durumda, Ubuntu bağlamında, ABI'nın kastedildiği açıktır, ancak bu her zaman böyle değildir. –