linux链接程序集与gcc会产生很多错误

时间:2012-11-10 09:39:17

标签: gcc assembly x86 nasm

我正在尝试编译并链接一个简单的“你好,世界!” GCC计划。该程序使用“printf”C函数。我遇到的问题是终端会抛出多个错误。我正在运行Archlinux,与NASM一起编译,与GCC连接。这是我的代码:

; ----------------------------------------------------------------------------
; helloworld.asm
; 
; Compile: nasm -f elf32 helloworld.asm
; Link: gcc helloworld.o
; ----------------------------------------------------------------------------
SECTION .data
    message db "Hello, World",0
SECTION .text
    global  main
    extern  printf

    section .text
_main:
    push    message
    call    printf
    add     esp, 4
    ret

我收到的错误如下:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/libgcc.a     when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
collect2: error: ld returned 1 exit status

有人可以告诉我导致这些错误的原因以及我需要做些什么来修复它们?

提前致谢,

RileyH

1 个答案:

答案 0 :(得分:0)

对于这些事情,您应该首先了解gcc到底在做什么。所以使用

 gcc -v helloworld.o -o helloworld

并且发生的事情是你有一个64位Linux并在其中链接一个32位对象。所以试试

 gcc -m32 -v helloworld.o -o helloworld

但我认为你应该避免今天编写程序集(优化编译器做的工作比你合理做的更好)。如果您绝对需要一些汇编指令,请在C代码中添加一些asm

BTW,您可以使用gcc -fverbose-asm -O -wall -S helloworld.c进行编译,并查看生成的helloworld.s;您还可以将.s个文件传递给gcc