Подробности о жалобе на доступ к памяти GDB - PullRequest
6 голосов
/ 25 ноября 2010

У меня есть объектный файл, скомпилированный с использованием как (из кода ассемблера).

Если я связываю его с использованием ld , когда я пытаюсь stepi (или nexti ) GDB жалуется на доступ к памяти по адресу 0x0.Если я связываю его с помощью gcc , все в порядке.

Я предполагаю, что проблема вызвана ld , который выдает меньше разделов по сравнению с результатом связывания НКУ .

Есть ли способ настроить GDB на более подробный, чтобы я мог выяснить, что не так с исполняемым файлом?

(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: исполняемый файл сам по себе работаеткак и ожидалось в обеих версиях.

Позднее редактирование: команды, которые я использовал для компиляции:

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

Ответы [ 2 ]

2 голосов
/ 04 декабря 2010

GDB имеет команду "show debug", предоставляющую различные внутренние параметры отладки.Например, «set debug target 1» включит трассировку взаимодействия GDB с целевым процессом.Возможно, вы захотите поэкспериментировать с каждым имеющимся у них флагом (их не так много).

1 голос
/ 04 декабря 2010

GCC на самом деле не выполняет связывание, он просто вызывает ld от вашего имени.Опции, которые он предоставляет, должны отличаться от тех, которые вы используете.

По этой теме:

Как получить команду компоновщика GCC?

Вы должны увидеть командную строку вызова ld, запустив gccпротивЭто должно рассказать вам, как изменить вашу командную строку ld, чтобы все работало на вас.

...