linking problem: i386:x86-64 architecture of input file *.o is incompatible with i386 output

24,951

Try this:

LDEMULATION="elf_x86_64"
ld -nostdlib -nodefaultlibs -T link.ld -o out.elf start.o main.o
Share:
24,951
prinzrainer
Author by

prinzrainer

Updated on May 18, 2020

Comments

  • prinzrainer
    prinzrainer almost 4 years

    I got a problem in linking when I moved my osdev to linux where it worked previously on gcc 3.5.* and binutils 2.18 (compiled to output x86_64-elf) running under cygwin.

    Here are the infos:

    gcc -v

    
    Using built-in specs.
    Target: i686-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
    Thread model: posix
    gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 
    



    ld -v

    
    GNU ld (GNU Binutils for Ubuntu) 2.20.51-system.20100908


    part of ld -help

    
    ....
    ld: supported targets: elf32-i386 a.out-i386-linux pei-i386 elf32-little elf32-big elf64-x86-64 pei-x86-64 elf64-l1om elf64-little elf64-big plugin srec symbolsrec verilog tekhex binary ihex trad-core
    ....




    The code:

    main.c
    
    void main(){
    /**some code here**/
    }


    start.asm
    
    [bits 64]
    global start
    extern main
    start:
    call main


    link.ld
    
    OUTPUT_FORMAT(elf64-x86-64);
    offset = 0x1000000;
    ENTRY(start);
    SECTIONS{
    . = offset;
    .text : AT(ADDR(.text) - offset){
    _code = .;
    *(.text)
    (.rodata)
    . = ALIGN(4096);}
    .data : AT(ADDR(.data) - offset){
    _data = .;
    *(.data)
    . = ALIGN(4096);}
    .bss : AT(ADDR(.bss) - offset){
    _bss = .;
    *(.bss)
    *(COMMON)
    . = ALIGN(4096);}
    _end = .;
    /DISCARD/ :
    {*(.comment)}
    }


    build.sh
    
    nasm -f elf64 -o start.o start.asm
    echo .
    echo .
    echo .
    gcc -m64 -ffreestanding -nostdlib -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow -c -o main.o main.c
    echo .
    echo .
    echo .
    ld -nostdlib -nodefaultlibs -T link.ld -o out.elf start.o main.o



    terminal output
    
    .
    .
    .
    .
    .
    .
    ld: i386:x86-64 architecture of input file 'start.o' is incompatible with i386 output
    ld: i386:x86-64 architecture of input file 'main.o' is incompatible with i386 output


    I don't understand why it displays 'incompatible with i386 output' when there's OUTPUT_FORMAT(elf64-x86-64); in my linker script specifying the targeted output..