QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1691|回复: 5

求助---nasm 生成的目标文件链接除错

[复制链接]
发表于 2006-8-20 20:24:24 | 显示全部楼层 |阅读模式
一个简单的 Hello Wrold 程序.

[code:1]
  ; hello.asm  

section .data            ; 数据段声明         

msg db "Hello, world!", 0xA     ; 要输出的字符串         

len equ $ - msg                 ; 字串长度  

section .text            ; 代码段声明

global _start            ; 指定入口函数  

_start:                  ; 在屏幕上显示一个字符串         

mov edx, len     ; 参数三:字符串长度         

mov ecx, msg     ; 参数二:要显示的字符串         

mov ebx, 1       ; 参数一:文件描述符(stdout)         

mov eax, 4       ; 系统调用号(sys_write)         

int 0x80         ; 调用内核功能                           

; 退出程序         

mov ebx, 0       ; 参数一:退出代码         

mov eax, 1       ; 系统调用号(sys_exit)         

int 0x80         ; 调用内核功能 [/code:1]

把上面的程序保存为test02.asm

[sihan@localhost test]$ nasm -f elf test02.asm
[sihan@localhost test]$ ls
test02.asm  test02.o
[sihan@localhost test]$ gcc -o test02 test02.o
test02.o(.text+0x0): In function `_start':
: multiple definition of `_start'
/usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o(.text+0x0): first defined here
/usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o(.text+0x1: In function `_start':
: undefined reference to `main'
collect2: ld returned 1 exit status

请问这是什么错误??

(2)
怎么加入调试信息? 是用 GDB 调试吗??
发表于 2006-8-20 22:05:17 | 显示全部楼层
这个最好不要用 gcc 链接,直接用 ld 。

asm 还有什么调试信息,直接调试就是了。
回复

使用道具 举报

 楼主| 发表于 2006-8-21 13:02:53 | 显示全部楼层
[quote:4512ff2c0f="VirusCamp"]这个最好不要用 gcc 链接,直接用 ld 。

asm 还有什么调试信息,直接调试就是了。[/quote]

可是我在网上看到一些资料里说:
======================================
Linux 下调试汇编代码既可以用 GDB、DDD 这类通用的调试器,也可以使用专门用来

调试汇编代码的 ALD(Assembly Language Debugger)。
======================================
这是怎么回事???  你说的直接调试用什么工具调试啊??
回复

使用道具 举报

发表于 2006-8-21 19:56:52 | 显示全部楼层
是说不用加什么调试信息,直接用 gdb 调试,ald 也许也可以。
回复

使用道具 举报

 楼主| 发表于 2006-8-21 20:22:36 | 显示全部楼层
[quote:90dc766e03="VirusCamp"]是说不用加什么调试信息,直接用 gdb 调试,ald 也许也可以。[/quote]
[code:1]
[sihan@localhost test]$ gdb test02
GNU gdb Red Hat Linux (5.3.90-0.20030710.41rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(no debugging symbols found)...Using host libthread_db library "/lib/tls/libthread_db.so.1".

(gdb) b 2
No symbol table is loaded.  Use the "file" command.
[/code:1]

    (1) 不能调试啊??? 编译的时候就没有加入调试信息, 怎么可能用 GDB 调试啊?

    (2) 如果要加调试信息, 怎么加? 加入后用什么调试? 还是 GDB ?

补充一下, 我是这样编译的:
[code:1]
[sihan@localhost test]$ nasm -f elf test02.asm
[sihan@localhost test]$ ld -o test02 test02.o
[sihan@localhost test]$ ./test02
Hello, world!
[/code:1]
回复

使用道具 举报

发表于 2006-9-12 00:06:48 | 显示全部楼层
是不是这篇文章?
http://www-128.ibm.com/developerworks/cn/linux/l-assembly/

里面有句话,意思似乎是 nasm 不带符号表,不好调试

从调试的角度来看,使用 GAS 的好处是可以在生成的目标代码中包含符号表(symbol table),这样就可以使用 GDB 和 DDD 来进行源码级的调试了。要在生成的可执行程序中包含符号表,可以采用下面的方式进行编译和链接:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 08:29 , Processed in 0.055760 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表