我有两个源文件:
我使用以下命令编译和链接文件:
nasm -f elf -g -F stabs main3.asm
nasm -f elf -g -F stabs prt_dec.asm
ld -m elf_i386 main3.o prt_dec.o
我使用以下命令运行gdb:
gdb ./a.out
一切都很好。没有编译或链接错误,程序返回所需的结果。但是,我想通过gdb逐步完成该程序,以更好地理解内部和调试工具本身。我遇到的问题是:
尽管gdb调用外部定义的子例程prt_dec,但它似乎无法访问定义它的源代码。例如,如果在gdb中使用以下命令:
(gdb) list main3.asm:1
我得到main3.asm源代码文件的前10行。但是,当我尝试在其他源代码文件上使用相同的命令时:
(gdb) list prt_dec.asm:1
我收到错误"没有名为prt_dec.asm的源文件"
这里发生了什么?为什么gdb不能查看链接的其他文件的源代码?
如果有帮助,我已在下面添加了源代码文件(两个文件都已缩短,并删除了不相关的代码):
main3.nasm:
SECTION .data ; initialized data section
lf: db 10 ; just a linefeed
SECTION .text ; Code section.
global _start ; let loader see entry point
extern prt_dec
_start:
push dword 42
call prt_dec
add esp, 4
mov eax, 4 ; write message
mov ebx, 1
mov ecx, lf
mov edx, 1 ; LF is a single character
int 080h
exit: mov eax, 1 ; exit function
mov ebx, 0 ; exit code, 0=normal
int 080h ; ask kernel to take over
prt_dec.asm:
[section .data]
digits: db "0123456789" ; decimal digits lookup table
[section .bss]
outputBuffer: resb 10 ; largest 32-bit value represented in decimal
; is 10 digits (2^32)
[section .txt]
global prt_dec
prt_dec:
; code here takes 32-bit value on stack when
; subroutine was called, converts and stores the decimal
; representation of the 32-bit value in outputBuffer,
; and writes the result to stdout
ret