2016-04-10 13 views
0

kod bölümüne yazarken SIGSEGV sinyali aldım Program received signal SIGSEGV hata mesajı alıyorum.
eax numaralı telefonda ve argümandaki yeni bir değerde (0xb7fb773a) çağrı bağımsız değişkeninin adresini (0x8048579 adresi) saklıyorum. Anlama talimatım uyarınca mov %edx,(%eax) bunu yapmalıdır, ancak başarısız olur.
Neyi yanlış yapıyorum?
Bu benim üniversite görevinin bir parçasıdır, bu nedenle gerçek bir sistem :-)Program, çağrı talimatının adresini geçersiz kılmaya çalışırken

Kod zarar ediliyor:

0x08048566 <+35>: mov -0x8(%ebp),%edx 
    0x08048569 <+38>: mov -0x4(%ebp),%eax 
=> 0x0804856c <+41>: mov %edx,(%eax) // Fails here. 
    0x0804856e <+43>: movl $0x0,(%esp) 
    0x08048575 <+50>: call 0x8048370 <[email protected]> 

Defterler:

eax   0x8048579 134514041 
edx   0xb7fb773a -1208256710 

Hatası:

Program received signal SIGSEGV, Segmentation fault. 
0x0804856c in foo (argv=0x58575655) at my_code.c:34 

// Güncelleştirme 1: CPU bilgisi:

Architecture:   i686 
CPU op-mode(s):  32-bit, 64-bit 
Byte Order:   Little Endian 
CPU(s):    1 
On-line CPU(s) list: 0 
Thread(s) per core: 1 
Core(s) per socket: 1 
Socket(s):    1 
Vendor ID:    GenuineIntel 
CPU family:   6 
Model:     69 
Stepping:    1 
CPU MHz:    2306.609 
BogoMIPS:    4613.21 
L1d cache:    32K 
L1d cache:    32K 
L2d cache:    6144K 

cevap

5

Talimat mov %edx,(%eax) gerçekten EAX tarafından işaret bellek adresine EDX register değerini kaydeder.

Bu kod başarısız oluyor, çünkü Linux'ta ELF yürütülebilir kod bölümü (.text) yazılabilir değil. Bu nedenle, bu bölüme yazmak OS'den SIGSEGV sinyaline neden olur. How can I make GCC compile the .text section as writable in an ELF binary?

+0

kontrol için bir yol var mı: Bu soru için cevaplar ilginizi çekebilir

? – Tigran

İlgili konular