2009-05-19 21 views
7

私は恐らく何か間違ったことをしています。初心者です。私を助けてもらえますか?私はC言語で簡単なHello Worldのプログラムを書いたGNUリンカの使用中に「ファイルが認識されません」

はhello.cのと呼ばれ、次のコマンドを実行しました:

gcc -S hello.c 

hello.sを生産しました。それから私は、GNUアセンブラ、asと、そのファイルを使用:

as hello.s 

まだリンクされる必要がある非実行a.outを、生産、私は理解できますか?

私はそうのように、ldを使用して、それをリンクしよう:

ld a.out 

しかし、次のエラーを取得:

a.out: file not recognized: File truncated 

そしてldが私のファイルを削除します。

これはx86 Ubuntuシステムです。私は間違って何をしていますか?どうもありがとう!

答えて

6

私の最初の質問は次のようなものです:コードを組み立てる理由は何ですか?あなたがアセンブラコードを欲しいなら、是非、gcc -Sを使ってください(表示するために、私は推測します)。

しかし、あなたが続けるためにasを通じてそれを実行する必要はありません、だけで使用します。最初のステップは、実行可能ファイルに直接Cソースをオンにします

gcc -o hello hello.c 
gcc -S hello.c 

こと、第二は、あなたのアセンブラソースを与えます。

具体的な問題は、ldが出力をa.outに書き込もうとしている可能性があります。これも入力ファイルであれば、ldの実行中に破棄されている可能性があります。 ldコマンドを実行する前にa.outからa.inに名前を変更してみてください:ld a.inここで

+1

あなたの質問に答えるために、私は彼がアセンブリを学ぼうとしていると推測しています... – Zifre

+1

私はそれを認識しますが、gccとは独立してldとして使いたいと思います。私はx86アセンブリを学んでいます。 gcc -Sの出力は、gccがさまざまなCプログラムをどのように組み立てているかを見るのに役立ちます。次に、そのアセンブリコードを変更して再生し、最後にasとldを使用して自分でアセンブルしてリンクすることができます。私はgccがこれらのファイルをアセンブルしてリンクすることができますが、私の代わりにasとldを使用するだけです。私はasとldを直接使用したい。 –

3

EDIT:大丈夫、私はシステムでこれをすべて試しました。問題の内容を知っていると思います。 ldは、同じ時刻にそれを読む間にa.out(デフォルト出力ファイル)に書き込んでいます。

ld a.out -o myprog 
+0

'a.out'はどのタイプのファイルでもかまいません。 '-S'フラグをつけて' gcc'を呼び出すことで、人間が読めるアセンブリコードだけが出力されます。それはアセンブルもリンクもしません。 'as'はそれをリンクしてはいけません。これは' ld'の仕事です。'-o'フラグは、その結果が何であれ、結果のファイル名だけを変更することができます。 –

+0

はい。でも、ldの出力ファイル名を指定しないと、最初にa.outが切り捨てられます。次に、入力ファイルを調べます。それらのうちの1つがa.outである場合、それは切り捨てられて失敗することがわかります。次に、不完全な出力ファイルa.outを削除します。 -oをasに使用し、ldに与えます。 ldは異なる入力ファイルと出力ファイルを必要としますが、 "その場で"リンクすることはできません。 – pjc50

5

は、私はそれを行う方法です。

> gcc -S forums.c 
> as forums.s -o forums.o 
> gcc forums.o -o forums 
> ./forums 
test 

はなぜgccの代わりldを呼び出すのですか?なぜならGCCはCランタイムをリンクし、他のインプリメンテーション依存のものを処理するからです。とにかくすることができます

> gcc --verbose forums.o -o forums 
Using built-in specs. 
Target: i686-pc-linux-gnu 
Configured with: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++ --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic 
Thread model: posix 
gcc version 4.4.0 (GCC) 
COMPILER_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/ 
LIBRARY_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../:/lib/:/usr/lib/ 
COLLECT_GCC_OPTIONS='-v' '-o' 'forums' '-mtune=generic' 
/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o forums /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crt1.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtbegin.o -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../.. forums.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtend.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crtn.o 
1

再インストールのglibc-develのを、それが動作するかどうかを確認:あなたはそれを見たい場合は、--verboseオプションを使用します。このプロセスは私の仕事です。

関連する問題