0

我的平台是 ubuntu i686(32 位)

如果我使用带有调试选项的 gcc 驱动程序编译程序集源:

gcc -nostartfiles -g -o toupper toupper.s 

我使用 emacs 编辑器上集成的 gdb 调试器打开 toupper 可执行文件

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

我在第一个指令上生成了一个断点

(gdb) b _start
(gdb) run

当我使用 run 命令开始执行时,调试器正确地停止在 _start 标签上。

如果我用 as assembler 编译相同的源 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 案例上显示了详细步骤,并使用 as/ld 案例再次尝试,但结果相同

¿ 在 gcc 案例中有一些默认选项与 as/ld 案例不匹配?

提前致谢

4

1 回答 1

1

当您使用 构建时gcc -nostartfiles -g ...,GCC(至少是我在 Linux 系统上的 GCC)传递-gdwarf2as. as如果您添加-v到 gcc 的调用中,您可以看到实际的命令。

当您as -g ...直接构建时,您不会通过-gdwarf2.

我猜就是解释行为差异的原因。我不确定-g您的 . 版本意味着什么as,或者它为什么重要。

于 2012-01-30T05:45:40.017 回答