2011-07-19 20 views
6

私は、IntelアーキテクチャのLinuxアセンブリで小さなプログラムをコンパイルしようとしています。私はCライブラリのいくつかの機能を使いたいがリンクしていない。Linux上のアセンブリコードからCライブラリを呼び出す方法は?

はここに私のアセンブリプログラムである:

.text 
.globl main 

main: 
    pushl $512 
    call malloc 
    addl $4, %esp 

    mov $1, %eax 
    mov $0, %ebx 
    int $0x80 

私はここに

as --32 -o output.o output.asm 

してコンパイルしてる、すべてが正常になります。

(.textセクションは+ 0x1b8):未定義の参照_Unwind_Resume' /usr/lib32/libc.a(iofclose.o):(.eh_frame+0x167): undefined reference toに__gcc_personality_v0' /usr/lib32/libc.a(iofflushそして私は

ld -static -m elf_i386 -o a.out output.o -lc 

とリンクしていたとき、私はこれらのエラーを得ました.o)は:関数で fflush': (.text+0xd7): undefined reference to _Unwind_Resume」 /usr/lib32/libc.a(iofflush.o):(.eh_frame+0xdf): __gcc_personality_v0' /usr/lib32/libc.a(iofputs.o): In function fputsに未定義の参照:(の.text +た0x108)に未定義の参照_Unwind_Resume' /usr/lib32/libc.a(iofputs.o):(.eh_frame+0xdf): undefined reference to __gcc_personality_v0 '/usr/lib32/libc.a(iofwrite.o):機能中 `fw儀式 ':

(私は別のエラーをしましたが、私が思うに、問題を参照してくださいするのに十分である)

私はいくつかのソリューションは、私が-lgccとリンクすべきであることを示しているが、自分のコンピュータ上のライブラリを見てが見つかりません...

誰かがアイデアを持っていますか?

+3

ld – Lyke

答えて

4

glibcでは、実行可能ファイルに静的にリンクするための特定の初期化コードが必要です。これを行う最も簡単な方法は、GCCを使用してリンクすることです:

gcc -static -o a.out output.o 

あなたが同様gcc-vを渡すことでリンクされている正確に何を見ることができます。

+0

の代わりにgccとリンクするとうまくいきます。ありがとうございました:)私は64ビットマシンでコンパイルするために-m32オプションを追加しましたが、それは素晴らしいことです。 –

+0

+1は-vオプションです。これを指摘してくれてありがとう - 新しい私。 – dwerner

1

私は通常、ldを直接使うのではなく、gccに任せます。あなたがオブジェクトを持っていたら、ちょうどgcc object.o -o executable

3

私は同じ問題を持っていたので、私は私に含める内容についての情報を与えた

# gcc -static -o a.out hello.o -v 

は、その後、私は、LDを使用してリンクすることができなかった:

# ld -static -o hello -L`gcc -print-file-name=` /usr/lib/gcc/x86_64-linux-gnu/4.4.7/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/../../../x86_64-linux-gnu/crti.o hello.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/../../../x86_64-linux-gnu/crtn.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/crtbeginT.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/crtend.o --start-group -lc -lgcc -lgcc_eh --end-group 
関連する問題