2011-09-02 33 views
5

Çalışırken bir programın bölümlerini yamamak için çıplak işlevleri kullanıyorum. Bunu Windows'ta VC++ ile kolayca yapabilirim. Bunu Linux'ta yapmaya çalışıyorum ve gcc'nin çıplak işlevleri desteklemediği görülüyor. Çıplak işlevlerle kod derlemek bana şunu verir: uyarı: "çıplak" öznitelik yönergesi yoksayıldı. CentOS 5.5 i386 kapsamında derlenmiştir.Neden gcc çıplak işlevleri desteklemiyor?

+1

GCC'nin hangi sürümü var? –

+0

Bu, VC'nin belirli bir özelliği gibi gözüküyor: http://msdn.microsoft.com/en-us/library/21d5kd3a(v=vs.80).aspx – JohnTortugo

cevap

4

çıplak nitelik yalnızca docs uygun bazı platformlar (ARM, AVR Mcore, Rx ve SPU) GCC tarafından desteklenmektedir:

naked: Kullanıcıyı ARM, AVR Bu öznitelik , MCORE, RX ve SPU bağlantı noktaları için , belirtilen işlevin derleyici tarafından oluşturulan prolog/epilogue dizilerine ihtiyaç duymadığını belirtir. Bu dizileri 'a kadar programlayıcıdır. Çıplak işlevlerde bulunan güvenliğindeki tek ifadeler, işlenmeyen asm ifadeleridir. Bildirimler ve benzeri durumlarda yerel değişkenlerinin bildirimleri de dahil olmak üzere tüm diğer ifadelerden kaçınılmalıdır. Bir işlevinin gövdesini uygulamak için Çıplak işlevleri kullanılmalı ve derleyici, assembler için gerekli işlev bildirimini oluşturmaya izin vermelidir.

Neden emin değilim.

+0

Neden sadece "asm ifadelerini kullanmanız gerekiyor" işlenenler var mı? Hemen hemen tüm komutların işlenenleri yoktur (jmp'nin bir operandı alması gibi şeyler bile)? –

+4

@Seth: assembler kodunda kullanılan komutların işlenenleri olabilir, ancak bir "asm ifadesi" assembler komutu anlamına gelmez, tüm "asm" ("some insns": outputblah: inputblah: clobberblah); "Blah", asm ifadesinin işlenenleridir ve derleyici tarafından oluşturulan bir prologa sahip değilseniz, kullanamayacağınız şey budur. Assembler yazabilirsiniz, ancak C değişkenlerine bağlayamazsınız. –

+0

@Steve oh tamam anladım, teşekkürler. –

1

GCC yalnızca ARM ve diğer gömülü platformlarda çıplak işlevleri destekler. http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

Ayrıca, programınız çalışıyorsa yama uyguladığınız kodun yürütülmediğini garanti edemeyeceğinizden, yaptığınız işlem doğal olarak güvensizdir.

2

Bu çirkin bir çözümdür. Hedef mimariniz için bir .asm dosyasına bağlanın. bunun yerine küresel kapsamda asm kullanarak geçici bir çözüm bulabilirler x86 üzerinde

0

:

int write(int fd, const void *buf, int count);            

asm                    
(                    
".global write        \n\t"          
"write:         \n\t" 
"  pusha        \n\t"          
"  movl $4, %eax     \n\t"          
"  movl 36(%esp), %ebx    \n\t"          
"  movl 40(%esp), %ecx    \n\t"          
"  movl 44(%esp), %edx    \n\t"          
"  int $0x80      \n\t"          
"  popa        \n\t"          
"  ret        \n\t"          
);                    

void _start()                  
{                     
#define w(x) write(1, x, sizeof(x));            
    w("hello\n");                 
    w("bye\n");                 
}                     

Ayrıca nakedx86 function attributes arasında yer almaktadır, bu yüzden yeni gcc için çalıştığını varsayalım.

İlgili konular