2010-11-25 6 views
6

Ich habe eine Objektdatei kompiliert mit als (aus Assembler-Code).Details auf gdb Speicherzugriff Beschwerde

Wenn ich verknüpfen es mit ld, wenn ich stepi versuchen (oder WEITERi) GDB beschwert sich über Speicherzugriff auf Adresse 0x0. Wenn ich es mit gcc verknüpfen, ist alles in Ordnung.

ich das Problem bin zu raten, wird durch ld verursacht, die, wenn sie auf das Verknüpfungsergebnis von gcc im Vergleich weniger Abschnitte erzeugt.

Gibt es eine Möglichkeit, gdb ausführlicher zu konfigurieren, damit ich vielleicht herausfinden kann, was mit der ausführbaren Datei nicht stimmt?

(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() 

PS: Die ausführbare Datei selbst läuft wie in den beiden Versionen erwartet.

Später bearbeiten: Befehle, die ich habe zu kompilieren verwendet:

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

Haben Sie versucht, die Register (Info-Register) oder den Stack vor und, falls unterschiedlich, nach dem "stepi" -Befehl auszugeben? Warum interessiert es dich, ob die ausführbare Datei in Ordnung ist? – AlastairG

+0

Ich kann die Register vor und nach dem "stepi" ablegen, aber ich sehe nichts relevantes. Ich sorge mich, weil ich ungeklärtes Verhalten nicht mag. – diciu

+0

Wie hast du 'ld' und 'gcc' (und 'wie' natürlich) aufgerufen? Welche Flaggen hast du benutzt? – Bart

Antwort

2

gdb hat eine "Show debug" Befehl, verschiedene interne Debug-Einstellungen geben. Z.B. "set debug target 1" aktiviert die Suche nach der Interaktion von gdb mit dem Zielprozess. Vielleicht möchten Sie mit jeder Flagge experimentieren, die sie haben (es gibt nicht so viele).

+0

danke für die Antwort. Jetzt sehe ich das Problem - ein Aufruf von frame_register_unwind auf der von ld erstellten Binärdatei gibt 0x0 zurück. Ich habe keine Ahnung warum, aber es ist ein guter Anfang. – diciu

1

GCC führt die Verknüpfung nicht durch, es ruft nur ld in Ihrem Namen an. Die angebotenen Optionen müssen sich von denen unterscheiden, die Sie verwenden.

Per diesem Thema:

How to get GCC linker command?

Sie sollten durch Ausführen von gcc -v Befehlszeile ist der ld Aufruf sehen können. Das sollte Ihnen sagen, wie Sie Ihre LD-Befehlszeile ändern, so dass die Dinge für Sie arbeiten.

+0

danke für die Antwort, ich kann tatsächlich mit ld mit den zusätzlichen Argumente auf diese Weise gesammelt verbinden. – diciu