gcc против as-ld для целей отладки, а не для точек останова gdb - PullRequest
0 голосов
/ 29 января 2012

Моя платформа - Ubuntu i686 (32 бита)

Если я компилирую источник сборки с драйвером gcc с параметрами отладки:

gcc -nostartfiles -g -o toupper toupper.s 

Я открываю исполняемый файл toupper с интегрированным отладчиком gdbemacs editor

$ emacs toupper.s-> M-x gdb -> M-x gdb-many-windows

Я сгенерировал точку останова при первой инструкции с

(gdb) b _start
(gdb) run

Когда я запускаю выполнение с командой run, отладчик останавливается на метке _start, правильно.

Если я скомпилирую тот же исходный toupper.s с помощью ассемблера и сошлюсь с линкером ld:

as -g -o toupper.o toupper.s
ld -o toupper toupper.o

Теперь шаги для отладки соответствуют случаю gcc.

$ emacs toupper.s -> M-x gdb -> M-x gdb-many-windows
(gdb) b _start   -> mark with a red point the _start line
(gdb) run -> DONT HIT THE _start LINE ¿?

Я вижу, чтотаблица символов правильная, точки останова отмечают, что она правильная, но выполнение НЕ пошаговое.

У меня есть подробные шаги отображения для случая gcc, и я снова попробовал его в случае как / ld, но в результате получаетсято же самое

on В случае gcc есть опция по умолчанию, которая не соответствует регистру as / ld?

Заранее спасибо

1 Ответ

0 голосов
/ 30 января 2012

При сборке с gcc -nostartfiles -g ... GCC (по крайней мере, мой GCC в системе Linux) передает -gdwarf2 в as. Вы можете увидеть фактическую команду as, если добавите -v к вызову gcc.

Когда вы строите с as -g ... напрямую, вы не передаете -gdwarf2.

Я предполагаю , что - это то, что объясняет разницу в поведении. Я не уверен, что -g означает для вашей версии as, или почему это должно иметь значение.

...