我有一个简单的hello world程序的分段错误。我目前正在运行64位Ubuntu x86_64 arch .. uname-a:
Linux ubuntu 4.4.0-28-generic #47-Ubuntu SMP Fri Jun 24 10:09:13 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
这是我的代码:
section.data ;Constant
msg: db "Hello World!"
msg_L: equ $-msg ; Current - msg1
section.bss ;Varialble
section.text ; Code
global _start:
_start:
mov eax,4
mov ebx,1; Where to wrte it out. Terminal
mov ecx, msg
mov edx, msg_L
int 80h
mov eax, 1 ; EXIT COMMAND
mov ebx,0 ; No Eror
int 80h
我使用命令运行它: nasm -f elf64 first.asm ld -elf_x86_64 -o first first.o
结果我得到了常见的错误分段错误。这有什么不对吗?帮助将不胜感激!
尝试:
sudo apt-get install libc6-dev-i386
nasm -f elf32 first.asm
gcc -m32 first.o -o first
当我做gcc它给了我:
first.o: In function `section.bss':
first.asm:(.text+0xc): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib32/crt1.o:(.text+0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib32/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: error: ld returned 1 exit status
答案 0 :(得分:1)
您的asm正在提供_start
符号,而不是main
。
gcc正在尝试将其作为C程序进行链接,因此它提供了自己的设置代码(使用它自己的_start
标签),并查找main
开始你的代码。
将标签更改为main
并使用完全类似C的初始化,或使用gcc -m32 first.o -o first -nostdlib
在链接期间省略stdlib启动代码。