如何不在 NASM 中发出局部符号,以便 GDB disas 不会停在它们上面?

How to not emit local symbols in NASM so that GDB disas won't stop at them?

我正在尝试使用 linux 上的 nasm 编写一些汇编程序。一切都很好,但我大量使用局部符号(.loop、.else 等),这在调试时很痛苦,因为这些符号被发射到符号 table,例如:

[BITS 32]
global main
section .text
main:
    do stuff
.else:
    do other stuff

将生成如下所示的反汇编:

<main>:
00000000      do stuff
<main.else>:
00000000      do other stuff

这有点烦人,因为 gdb 会认为这些都是独立的函数,所以当我 'disas' 它只会在遇到另一个标签并停止之前反汇编几条指令。

有没有办法使用 linux 下的 nasm 来抑制将这些符号发射到 ELF 符号 table?

我还没有找到直接用 nasm 来完成它的方法,但是如果你 link 你的对象用 ld,那么你就有了一个非常方便的开关. 引用自 ld 的 man page:

-x --discard-all Delete all local symbols.

-X --discard-locals Delete all temporary local symbols. (These symbols start with system-specific local label prefixes, typically .L for ELF systems or L for traditional a.out systems.)

所以如果你有,例如,这个:

section .data
    hello:     db 'Hello world!',10
    helen:     equ $-hello           
    hi:        db 'Hi!',10
    hilen:     equ $-hi
section .text
    global _start
_start:
    mov eax,4            
    mov ebx,1            
    mov ecx,hello        
    mov edx,helen                        
    int 80h
.there:
    mov eax,4
    mov ebx,1   
    mov ecx,hi
    mov edx,hilen
    int 80h
.end:
    mov eax,1
    mov ebx,0
    int 80h

然后构建,link(和 运行)像这样:

$ nasm -g -f elf32 prog.asm && ld -x prog.o -o prog && ./prog
Hello world!
Hi!

然后,当您在 gdb 中加载它时,您会得到:

$ gdb prog
.....
Reading symbols from prog...done.
(gdb) disas _start
Dump of assembler code for function _start:
   0x08048080 <+0>: mov    [=12=]x4,%eax
   0x08048085 <+5>: mov    [=12=]x1,%ebx
   0x0804808a <+10>:    mov    [=12=]x80490b8,%ecx
   0x0804808f <+15>:    mov    [=12=]xd,%edx
   0x08048094 <+20>:    int    [=12=]x80
   0x08048096 <+22>:    mov    [=12=]x4,%eax
   0x0804809b <+27>:    mov    [=12=]x1,%ebx
   0x080480a0 <+32>:    mov    [=12=]x80490c5,%ecx
   0x080480a5 <+37>:    mov    [=12=]x4,%edx
   0x080480aa <+42>:    int    [=12=]x80
   0x080480ac <+44>:    mov    [=12=]x1,%eax
   0x080480b1 <+49>:    mov    [=12=]x0,%ebx
   0x080480b6 <+54>:    int    [=12=]x80
End of assembler dump.
(gdb)

反汇编不再受本地符号的阻碍。