Linux 如何在NASM中不发射本地符号,从而使GDB disas获胜';你不能停下来吗?
我正在尝试在linux上使用nasm编写一些汇编程序。一切都很好,但我大量使用了本地符号(.loop、.else等),这在调试时是一件痛苦的事情,因为这些符号被发送到符号表中,例如: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
[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新疆改造中心法轮功六四事件 - 你是如何使用汽油的?找到了: