2012-11-10 34 views
0

我想编译并链接一个简单的“你好,世界!”与GCC合作。该程序使用“printf”C函数。我遇到的问题是终端抛出多个错误。我运行Archlinux,与NASM编译,与GCC链接。这里是我的代码:linux链接汇编与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

回答

0

对于这样的事情,你应该先了解究竟gcc在做什么。因此,使用

gcc -v helloworld.o -o helloworld 

和什么是碰巧的是,你有一个64位的Linux和链接一个32位的对象。因此,尽量使用

gcc -m32 -v helloworld.o -o helloworld 

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

顺便说一句,你可以用gcc -fverbose-asm -O -wall -S helloworld.c编译,看看里面生成的helloworld.s;你也可以通过.s文件到gcc

+0

它输出一大堆垃圾(文件路径和什么不是),然后我最初发布相同的错误信息。 – Progrmr

+1

您可能需要在系统上安装'lib32gcc1'和'gcc-4.7-multilib'软件包。为什么不在你的64位系统上编译x86-64汇编代码(不是x86 32位汇编)? –

+0

我会怎么做终端?对不起,我只是第一次新安装了Archlinux,而且我对Linux一般都不太了解。 – Progrmr