Ç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?
cevap
çı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.
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)? –
@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. –
@Steve oh tamam anladım, teşekkürler. –
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.
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
:
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 naked
x86 function attributes arasında yer almaktadır, bu yüzden yeni gcc için çalıştığını varsayalım.
- 1. Microsoft.NETCore.App neden netstandard1.6 desteklemiyor?
- 2. Neden wsHttpBinding destek akışını desteklemiyor?
- 3. çıplak yıldız: def f (*)
- 4. gcc (g ++) altında gcc
- 5. Neden Firefox'tan başka tarayıcılar animasyonlu PNG'leri desteklemiyor?
- 6. Neden niçin statik kitaplıkları desteklemiyor? IO
- 7. Neden Carthage iOS 7'yi desteklemiyor?
- 8. Java neden baskı ve otomatik kutulamayı desteklemiyor?
- 9. Perl neden çift tırnaklarda karmaların enterpolasyonunu desteklemiyor?
- 10. std :: ratio neden karşılaştırma operatörlerini desteklemiyor?
- 11. std :: queue neden clear() işlevini desteklemiyor?
- 12. Neden Cassandra, sayaç tablolarındaki koşullu güncellemeleri desteklemiyor?
- 13. Neden WCF hizmet tarafı zaman aşımlarını desteklemiyor?
- 14. Neden Objective-C yöntemi aşırı yüklemeyi desteklemiyor?
- 15. Neden gcc statik kütüphanemi bulamıyor?
- 16. Neden clang gcc kurulumunu seçer?
- 17. C++ (GCC) 'deki Dörtlü Hassasiyet
- 18. GCC, PowerPC
- 19. Yayınları desteklemiyor
- 20. GCC
- 21. gcc
- 22. Parantez olmadan işlevleri kullandığımda C++ derleyicisi neden şikayet etmiyor?
- 23. 'Çıplak nerede yan tümce' nedir?
- 24. heroku godaddy çıplak etki alanı
- 25. Git ls dosyaları çıplak depoda
- 26. Neden parenscript işlevleri tüm küçük harflere değiştirildi?
- 27. Sigmoid işlevleri neden Sinir Ağları'nda çalışır?
- 28. Neden "getUTSeconds" ve "getUTCMilliseconds" işlevleri var?
- 29. Neden gcc, hata ayıklamayan yapıya semboller ekliyor?
- 30. GCC ve Clang neden cvtss2sd [memory] kullanıyor?
GCC'nin hangi sürümü var? –
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