Linux 如何在NASM中不发射本地符号,从而使GDB disas获胜';你不能停下来吗?

Linux 如何在NASM中不发射本地符号,从而使GDB disas获胜';你不能停下来吗?,linux,assembly,linker,nasm,elf,Linux,Assembly,Linker,Nasm,Elf,我正在尝试在linux上使用nasm编写一些汇编程序。一切都很好,但我大量使用了本地符号(.loop、.else等),这在调试时是一件痛苦的事情,因为这些符号被发送到符号表中,例如: [BITS 32] global main section .text main: do stuff .else: do other stuff 将生成如下所示的分解: <main>: 00000000 do stuff <main.else>: 00000000

我正在尝试在linux上使用nasm编写一些汇编程序。一切都很好,但我大量使用了本地符号(.loop、.else等),这在调试时是一件痛苦的事情,因为这些符号被发送到符号表中,例如:

[BITS 32]
global main
section .text
main:
    do stuff
.else:
    do other stuff
将生成如下所示的分解:

<main>:
00000000      do stuff
<main.else>:
00000000      do other stuff
:
00000000做事情
:
00000000做其他事情
这有点烦人,因为gdb会认为这些都是独立的函数,所以当我“disas”时,它只会在遇到另一个标签并停止之前分解几个指令


有没有一种方法可以禁止在linux下使用nasm将这些符号发送到ELF符号表?

我还没有找到一种直接使用
nasm
的方法,但是如果您将对象链接到
ld
,那么您可以使用一个非常方便的开关。 引自劳工处:

-x—放弃所有 删除所有本地符号

-X—丢弃局部变量 删除所有临时本地符号。(这些符号以 系统特定的本地标签前缀,通常为ELF的.L 系统或L用于传统a.out系统。)

例如,如果您有:

section.data
你好:db‘你好,世界!’,10
海伦:你好
嗨:db‘嗨!’,10
希伦:你好
第节.案文
全球启动
_开始:
mov-eax,4
mov-ebx,1
莫夫·埃克斯,你好
海伦,请看电影
int 80h
.在那里:
mov-eax,4
mov-ebx,1
莫夫·埃克斯,你好
mov-edx,希伦
int 80h
(完)
mov-eax,1
mov-ebx,0
int 80h
然后像这样构建、链接(并运行):

$ 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    $0x4,%eax
   0x08048085 <+5>: mov    $0x1,%ebx
   0x0804808a <+10>:    mov    $0x80490b8,%ecx
   0x0804808f <+15>:    mov    $0xd,%edx
   0x08048094 <+20>:    int    $0x80
   0x08048096 <+22>:    mov    $0x4,%eax
   0x0804809b <+27>:    mov    $0x1,%ebx
   0x080480a0 <+32>:    mov    $0x80490c5,%ecx
   0x080480a5 <+37>:    mov    $0x4,%edx
   0x080480aa <+42>:    int    $0x80
   0x080480ac <+44>:    mov    $0x1,%eax
   0x080480b1 <+49>:    mov    $0x0,%ebx
   0x080480b6 <+54>:    int    $0x80
End of assembler dump.
(gdb)
$gdb prog
.....
从程序中读取符号…完成。
(gdb)disas_启动
函数_start的汇编程序代码转储:
0x0804800:mov$0x4,%eax
0x08048085:mov$0x1,%ebx
0x080408A:mov$0x80490b8,%ecx
0x0804808f:mov$0xd,%edx
0x08048094:int$0x80
0x08048096:mov$0x4,%eax
0x0804809b:mov$0x1,%ebx
0x080480a0:mov$0x80490c5,%ecx
0x080480a5:mov$0x4,%edx
0x080480aa:int$0x80
0x080480ac:mov$0x1,%eax
0x080480b1:mov$0x0,%ebx
0x080480b6:int$0x80
汇编程序转储结束。
(gdb)

本地符号不再妨碍反汇编。

也找不到任何控制符号属性的选项。看起来NASM不如GAS灵活。我几乎可以肯定在NASM中会有一些隐藏的选项,但我的搜索没有结果。不管怎样,ld似乎能胜任这项工作。@robert mason谢谢。很高兴我能帮上忙。@CiroSantilli新疆改造中心法轮功六四事件 - 你是如何使用汽油的?找到了: