是否有针对ld的调试选项?

4

我写了一个汇编程序,仅用于测试目的,只是退出。代码如下:

section .text
  _global start
_start:
  mov    eax, 1
  mov    ebx, 0
  int    0x80

这个程序显然是32位的,但是我使用的是一个64位的处理器和操作系统,所以我用nasm编译并链接它,如下:

nasm -f elf exit.asm
ld -m elf_i386 -s -o exit exit.o

使用gdb调试程序时,由于没有调试符号,无法列出代码。

(gdb) list
No symbol table is loaded.  Use the "file" command.

在使用gcc时,您可以使用选项-ggdb在编译c文件时加载符号。但是,由于我不知道如何使用gcc为64位机器编译32位汇编(我已经搜索过了,但找不到解决方案),所以我被迫使用ld。我能否使用ld加载调试符号?抱歉问题有点长,并且包含了一些多余的信息。谢谢。


除非由于某些原因在32位代码中无法工作,否则您可以通过使用“nasm -felf -g -l exit.lst exit.asm”来强制nasm导出调试符号。 - rosghub
@fuz nasm -g -F dwarf -f elf exit.asm 没有起作用。 - Dark Eagle
@DarkEagle “没用”不是一个错误描述。到底发生了什么?错误在哪里? - fuz
@jefferson 使用 nasm -felf -g -l exit.lst exit.asm 也不起作用。 - Dark Eagle
@fuzz,仍然没有调试符号。gdb无法加载它们。 - Dark Eagle
显示剩余3条评论
2个回答

8

当你传递 -g 参数时,nasm 会生成调试信息。此外,你还需要指定所需的调试信息类型(通常为dwarf),这可以通过 -F 开关完成。因此,要汇编您的文件,请输入以下命令:

nasm -f elf -F dwarf -g file.asm

然后链接时不要加-s选项,以保留符号表和调试信息:

ld -m elf_i386 -o file file.o

简而言之,您可以运行 nasm -felf -gdwarf -o file.o file.asm,因为 -gformat 等同于 -g -F format,请参考 man nasm - Ko Ga

3
-s开关告诉ld要“剥离”调试信息。请去掉它!

等一下,使用 nasm -g -F dwarf -f elf exit.asm 然后移除 -s 参数就可以了。非常感谢! - Dark Eagle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接