0

我正在尝试编译和链接一个简单的“你好,世界!” 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

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

提前致谢,

莱利

4

1 回答 1

0

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

 gcc -v helloworld.o -o helloworld

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

 gcc -m32 -v helloworld.o -o helloworld

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

顺便说一句,您可以编译gcc -fverbose-asm -O -wall -S helloworld.c并查看生成的helloworld.s; 你也可以将.s文件传递给gcc

于 2012-11-10T09:44:42.520 回答