2012-01-29 3 views
0

Моя платформа Ubuntu i686 (32 бита)НКУ против как-ЛД для отладки цели, не попал в БГД точки останова

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

gcc -nostartfiles -g -o toupper toupper.s 

Я открываю TOUPPER исполняемый с помощью GDB отладчик интегрирован в Emacs редактор

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

Я генерировал контрольную точку на первой Instrucción с

(gdb) b _start 
(gdb) run 

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

Если я компилирую тот же источник toupper.s с, как ассемблер и связь с Л.Д. линкера:

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

Теперь шаги для отладки соответствует ССАГПЗ случай.

$ 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 ¿? 

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

Я дисплей де многословные шаги по ССАГПЗ случае и попробовал снова, как/LD случае, но результат тот же

¿Существует некоторый вариант по умолчанию на GCC случае, не соответствовал как/Л.Д. случай?

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

+0

Проблема в том, что отладчик не останавливается на точке останова? –

+0

И, кстати, зачем использовать -nostartfiles? Он компилируется в любом случае. –

ответ

0

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

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

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

+0

Спасибо. Не имеет значения -g или -gdwarf2 для ассемблера. Разница между процессом компоновки gcc front-end и ld (компоновщик binutils) заключается в том, что gcc-ссылка с программой collect2. Если вы выполняете сборку collect2 после того, как в качестве ассемблера результат будет правильным, но если вы выполните фазу связывания с ld, пошаговое пошаговое отключение будет выполнено. Ему нужно установить ld-компоновщик с некоторыми опциями для соответствия компоновщику collect2 equale. Который? , Благодарю. – candido

+0

@candido В Linux 'collect2' просто выполняет' ld'. Насколько я вижу, он не добавляет никаких новых параметров. Вы можете увидеть фактическую команду 'ld', которую' collect' вызывает, запустив 'strace -v -fe trace = execve collect2 ... rest..of..collect2..args'. –

+0

@ При использовании русского языка, линкер ld нуждается в ссылке с общими библиотеками, такими как 'libgcc.so' и' libc.so' для разрешения символа таблицы. Я не знаю, почему. Таким образом, следующие варианты - это решение: 'ld -dynamic-linker /lib/ld-linux.so.2 -L/usr/lib/gcc/i486-linux-gnu/4.4.3 -lgcc -as-needed - lgcc_s --no-as-needed -lc -o toupper toupper.o' – candido