2012-11-10 36 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