gpt4 book ai didi

assembly - GDB 不从 NASM 加载源代码行

转载 作者:行者123 更新时间:2023-12-05 01:23:14 24 4
gpt4 key购买 nike

我正在使用 NASM 在 Ubuntu 上组装一个 x86-64 程序:

nasm -f elf64 -g -F dwarf -o foo.o foo.asm
ld -o foo foo.o

来源:

section .text
global _start
_start:
mov rax, 60 ;SYS_exit
mov rdi, 0 ;EXIT_SUCCESS
syscall

使用 GDB 调试程序不会显示指令来自哪个文件或行号。例如,break _start 显示“0x401000 处的断点 1”而不是“0x400080 处的断点 1:文件 foo.asm,第 4 行”。如图所示 blog post .切换到 layout regs 会显示“没有可用的源代码”,而不是在源代码中找到当前指令的位置。 list 确实显示了源代码,但它会在进入下一条指令时切换回“无可用源代码”。

objdump -g foo 似乎显示所需的调试信息在那里:

foo:     file format elf64-x86-64
...
The File Name Table (offset 0x1c):
Entry Dir Time Size Name
1 0 0 0 foo.asm

Line Number Statements:
[0x00000028] Extended opcode 2: set Address to 0x401000
[0x00000033] Special opcode 8: advance Address by 0 to 0x401000 and Line by 3 to 4
[0x00000034] Special opcode 76: advance Address by 5 to 0x401005 and Line by 1 to 5
[0x00000035] Special opcode 76: advance Address by 5 to 0x40100a and Line by 1 to 6
[0x00000036] Advance PC by 2 to 0x40100c
[0x00000038] Extended opcode 1: End of Sequence

Ubuntu 22.04、NASM 2.15.05、GDB 12.09

最佳答案

我设置了一个 Ubuntu 22.04 虚拟机,发现我可以重现您在那里看到的问题,但是,在我的本地机器上,我无法重现该问题。

我注意到在我的本地机器上我使用的是 nasm 2.14.02,而在 Ubuntu 机器上我使用的是 2.15.05。

如果我们检查两个可执行文件的 objdump -g 输出,这是我从工作可执行文件中看到的部分内容:

Contents of the .debug_info section (loaded from foo):

Compilation Unit @ offset 0x0:
Length: 0x45 (32-bit)
Version: 3
Abbrev Offset: 0x0
Pointer Size: 8
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
<c> DW_AT_low_pc : 0x401000
<14> DW_AT_high_pc : 0x40100c
<1c> DW_AT_stmt_list : 0x0
<20> DW_AT_name : foo.asm
<28> DW_AT_producer : NASM 2.14.02
<35> DW_AT_language : 32769 (MIPS assembler)
<1><37>: Abbrev Number: 2 (DW_TAG_subprogram)
<38> DW_AT_low_pc : 0x401000
<40> DW_AT_frame_base : 0x0 (location list)
<1><44>: Abbrev Number: 0

这是损坏的可执行文件中的相同部分:

Contents of the .debug_info section (loaded from foo):

Compilation Unit @ offset 0x0:
Length: 0x45 (32-bit)
Version: 3
Abbrev Offset: 0x0
Pointer Size: 8
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
<c> DW_AT_low_pc : 0x401000
<14> DW_AT_high_pc : 0x401000
<1c> DW_AT_stmt_list : 0x0
<20> DW_AT_name : foo.asm
<28> DW_AT_producer : NASM 2.15.05
<35> DW_AT_language : 32769 (MIPS assembler)
<1><37>: Abbrev Number: 2 (DW_TAG_subprogram)
<38> DW_AT_low_pc : 0x401000
<40> DW_AT_frame_base : 0x0 (location list)
<1><44>: Abbrev Number: 0

关键的区别是 DW_AT_high_pc,这在 2.15.05 nasm 中似乎是错误的。我手动进入并编辑了这个值,突然之间,我可以很好地调试之前损坏的可执行文件。

这似乎是 nasm 2.15.05 的回归,您应该考虑降级 nasm(我认为 2.15.05 是当前的最新版本),或者提交一个 nasm 错误。

关于assembly - GDB 不从 NASM 加载源代码行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72694342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com