2010-11-25 23 views
6

(derleyici kodundan) kullanılarak derlenmiş bir nesne dosyasına sahibim.gdb bellek erişimi şikayeti hakkında ayrıntılar

ben stepi (veya nexti) gdb adresi 0x0 en bellek erişimi şikayetçi çalıştığımda o ld kullanarak bağlantı varsa. gcc kullanarak bağlantı kurarsam, her şey yolunda. Sorunu tahmin ediyorum

gcc bağlanması sonucu ile karşılaştırıldığında daha az bölümleri üretir ld, kaynaklanır.

Gdb'yi daha ayrıntılı olacak şekilde yapılandırmanın bir yolu var mı? Bu nedenle, yürütülebilir dosyada neyin yanlış olduğunu anlayabiliyorum.

(gdb) b main 
Breakpoint 1 at 0x100000f8e 
(gdb) r 
Breakpoint 1, 0x0000000100000f8e in main() 
(gdb) x/10i $pc 
0x100000f8e <main>: fbld 0x6c(%rip)  # 0x100001000 <data1> 
0x100000f94 <main+6>: fimul 0x7a(%rip)  # 0x100001014 <data2> 
0x100000f9a <main+12>: fbstp 0x60(%rip)  # 0x100001000 <data1> 
0x100000fa0 <main+18>: mov0x0 $0x2000001,%rax 
0x100000fa7 <main+25>: mov $,%rdi 
0x100000fae <main+32>: syscall 
(gdb) si 
Cannot access memory at address 0x0 
0x0000000100000f94 in main() 

Not: her iki versiyonda da beklendiği gibi çalıştırılabilir kendisi çalışır.

Sonra düzenleme: komutlar i derlemek için kullandım:

as -arch x86_64 src.s -o src.o 
ld -e _main -arch x86_64 src.o -o src 
gcc -o src src.o 
+0

Kayıtları (bilgi yazmaçları) veya yığmayı daha önce ve "stepi" komutundan sonra farklı olarak atmayı denediniz mi? Yürütülebilirlik düzgün çalışıyorsa neden umurundasınız? – AlastairG

+0

Kayıtları "stepi" nin öncesine ve sonrasına dökebilirim ama ilgili hiçbir şey göremiyorum. Umrumda değil çünkü açıklanamayan davranışlardan hoşlanmıyorum. – diciu

+0

'ld' ve 'gcc' (ve elbette 'olarak') nasıl çağırdınız? Hangi bayrakları kullandın? – Bart

cevap

2

gdb çeşitli iç hata ayıklama ayarlarını veren bir "şov hata ayıklama" komutu vardır. Örneğin. "hata ayıklama hedefi 1'i ayarla", gdb'nin hedef süreçle etkileşimi için izlemeyi etkinleştirir. Sahip oldukları her bayrakla deneme yapmak isteyebilirsiniz (o kadar değil).

+0

teşekkürler. Şimdi problemi görüyorum - frame_register_unwind ld tarafından oluşturulan ikilide 0x0 için bir çağrı. Neden olduğunu bilmiyorum ama bu iyi bir başlangıç. – diciu

1

GCC aslında bağlantıyı yapmaz, sadece sizin adınıza ld çağırır. Verdiği seçenekler, kullanmakta olduğunuzlardan farklı olmalıdır. Bu konuya Başına

:

How to get GCC linker command?

Sen gcc -v çalıştırarak ld çağırma komut satırını görmek gerekir. Bu, ld komut satırınızı nasıl değiştireceğiniz konusunda size bilgi vermeli, böylece işler sizin için işe yarayacaktır.

+0

Cevabınız için teşekkürler, gerçekten bu şekilde toplanan ekstra argümanlarla ld'yi kullanarak bağlantı kurabilirim. – diciu