linux下使用gdb调试nasm程序

3 篇文章 0 订阅
3 篇文章 0 订阅


nasm -f elf  name.asm
ld -m elf_i386 -o name name.o  -Ttext 0x1000
gdb name

nasm -f elf64  name.asm
ld -o name name.o  -Ttext 0x1000
gdb name

nasm -f elf64  name.asm -g -F stabs
gcc -o name name.o -g
gdb name

        昨天刚接触nasm,按网上的资料,编译、连接和调试代码用的是第一种方式(因为系统是x86_64架构的)。后来又看了nasm和ld指令的参数描述,改用第二种方式,编译时直接生成elf64格式的object文件。

        可用gdb断点调试时发现没有符号表(No symbol table is loaded),仔细看时,才发现刚运行gdb时已经有提示了(Reading symbols from /home/wmy/桌面/t...(no debugging symbols found)...done.)。查阅资料发现:nasm好像确实不能像gas 那样,在生成的目标代码中包含符号表(gas加上参数--gstabs,同时ld不使用参数 -s 就行了)。

        又在网上查阅各种关于调试nasm的资料,终于发现了上面的第三种方式,不过之前用ld连接时,指定入口函数的格式如下:

                    global _start        

                          _start:

                                     ……

                                     ……

        否则,提示错误   “cannot find entry symbol _start”(真有一种java中找不到或无法加载主类的感觉),而这样的代码用gcc编译,又会出现“对‘main’未定义的引用” 的错误提示。所以,此时又要将  _start 修改成main。这样用gdb调试时就有符号表了(Reading symbols from /home/wmy/桌面/t...done)。






  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值