0

シンプルな「hello, world!」をコンパイルしてリンクしようとしています。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

これらのエラーの原因と、それらを修正するために何をする必要があるか教えてもらえますか?

前もって感謝します、

ライリーH

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渡すこともできます.sgcc

于 2012-11-10T09:44:42.520 に答える