gcc 用GDB看不到我的汇编源代码[duplicate]

jljoyd4f  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(138)

此问题在此处已有答案

GDB does not load source lines from NASM(3个答案)
上个月关门了。
我开始编写linux x86_64汇编代码,因此我试图像普通C代码一样进行调试,例如,当我运行gdb -tui ./a.out时,我得到了我的源代码,然后我可以切换寄存器来查看发生了什么,并一步一步地进行调试,等等。
然而,当我用汇编二进制代码时,情况就不是这样了,我只是得到了[ No Source Available ]。然而,我可以看到寄存器和产生的汇编代码(假设我做的是layout next)。问题是,由于我在代码中间使用了C函数(主要是printf,以便简化IO过程,正如我的教授所指示的);我想看看我的原始汇编代码。目前我已经安装了:

  • 通用合同条款:(GCC)12.2.0
  • (GNU二进制文件)2.39.0
  • NASM版本2.15.05

编译并运行我运行的程序:

nasm -f elf64 -o hello.o hello.asm
gcc hello.o -o hello -no-pie 
gdb ./hello

这些是我的老师告诉我们要运行的命令。我在网上读到过,我可以将-g标志传递给gcc来调试我的代码;它编译得很好,但是我也看不到我的源代码。我也尝试过将-g传递给nasm(同样的问题,编译了但是没有源代码)
是否有我不能通过的标志/设置?

but5z9lq

but5z9lq1#

只需告诉NASM使用-g编译源代码以添加调试符号:

nasm -g -f elf64 -o hello.o hello.asm
gcc -m64 hello.o -o hello -no-pie
gdb hello

打开GDB后,您可以使用list显示源代码:

Reading symbols from hello...
(gdb) list
1           extern  printf          ; the C function, to be called
2   
3           section .data           ; Data section, initialized variables
4   msg:    db "Hello world", 0     ; C string needs 0
5   fmt:    db "%s", 10, 0          ; The printf format, "\n",'0'
6   
7           section .text           ; Code section.
8   
9           global main             ; the standard gcc entry point
10  main:                           ; the program label for the entry point

下面是一个source code示例:

; Declare needed C  functions
        extern  printf          ; the C function, to be called

        section .data           ; Data section, initialized variables
msg:    db "Hello world", 0     ; C string needs 0
fmt:    db "%s", 10, 0          ; The printf format, "\n",'0'

        section .text           ; Code section.

        global main             ; the standard gcc entry point
main:                           ; the program label for the entry point
        push    rbp             ; set up stack frame, must be aligned
    
        mov rdi,fmt
        mov rsi,msg
        mov rax,0               ; or can be  xor  rax,rax
        call    printf          ; Call C function

        pop     rbp             ; restore stack 

        mov rax,0               ; normal, no error, return value
        ret                     ; return

相关问题