Search code examples
gccassemblygnu-assembler

Can't compile asm hello world with gcc


This is the code in 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   

I run gcc hello.s -o hello and get this error:

/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: error: ld returned 1 exit status

Then I've tried running gcc hello.s -fPIC -o hello, but it didn't do anything, the error is the same.

What am I doing wrong? Ubuntu 17.04, GCC 6.3.0.


Solution

  • You're trying to compile i386 code in amd64 mode, which doesn't work. Try this instead:

    gcc -m32 hellos. -o hello
    

    ...to force i386 mode.

    Edit: I recognised this because I know what i386 and amd64 code looks like, but a better clue is in the relocation name, R_X86_64_32. X86_64 is another name for the amd64 architecture; so what this is saying is that it's a 32 bit relocation for the X86_64 architecture. Given that you're not writing code for that architecture, that's a reasonable sign that it's the wrong compiler.