Segmentaion Fault Assembly NASM

时间:2016-07-08 15:13:41

标签: assembly segmentation-fault nasm

我有一个简单的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

1 个答案:

答案 0 :(得分:1)

您的asm正在提供_start符号,而不是main

gcc正在尝试将其作为C程序进行链接,因此它提供了自己的设置代码(使用它自己的_start标签),并查找main开始你的代码。

将标签更改为main并使用完全类似C的初始化,或使用gcc -m32 first.o -o first -nostdlib在链接期间省略stdlib启动代码。