无法用gcc编译asm hello world

时间:2017-07-05 20:00:00

标签: gcc assembly gas

这是 hello.s

中的代码
.data                         

hello_str:                    
    .string "Hello, world!\n"


    .set hello_str_length, . - hello_str - 1

.text                         

.globl  main                  

.type   main, @function       


main:
    movl    $4, %eax      

    movl    $1, %ebx     

    movl    $hello_str, %ecx  

    movl    $hello_str_length, %edx 

    int     $0x80        

    movl    $1, %eax      
    movl    $0, %ebx      
    int     $0x80         

    .size   main, . - main   

我运行 gcc hello.s -o hello 并收到此错误:

/usr/bin/ld: /tmp/cc6ILJpd.o: relocation R_X86_64_32 against '.data' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output

collect2:错误:ld返回1退出状态

然后我尝试运行 gcc hello.s -fPIC -o hello ,但它没有做任何事情,错误是一样的。

我做错了什么? Ubuntu 17.04,GCC 6.3.0。

1 个答案:

答案 0 :(得分:1)

您正试图在amd64模式下编译i386代码,但这并不起作用。试试这个:

gcc -m32 hellos. -o hello

...强制使用i386模式。

编辑:我认识到了这一点,因为我知道i386和amd64代码是什么样的,但更好的线索在于重定位名称R_X86_64_32。 X86_64是amd64架构的另一个名称;所以这就是说它是X86_64架构的32位重定位。鉴于您没有为该架构编写代码,这是一个合理的信号,表明它是错误的编译器。