2016-09-19 23 views
1

私は、この作品、なぜソースコードを実行したい:なぜオブジェクトファイルを実行できないのですか?

gcc test.c -o test.o 

その後、

./test.o 

が、これは動作しません:

gcc -c test.c 

その後、

./test.o 

このメッセージあなただけ名前-oを使用して、結果のファイルtest.o、それを組み立ててリンクされてコンパイルされた最初のケ​​ースで

bash: ./test.o: Permission denied 
+0

オブジェクトファイルは機械命令ではありません。それは実行するつもりはありません。これはリンクされることを意図しています。 'gcc test.c -o test'を使うべきです。次に、 'test'という実行可能なファイルがあります。 –

+0

'man ld'をよく見て、最終的なelf実行ファイルを作成する際にどのような目的があるのか​​を見て、下記のように答えを表示してください。 –

+4

'gcc test.c -o test.o'の後に、' test.o'という名前の実行可能ファイルを作成しました。これはオブジェクトファイルではありません。 –

答えて

5

まず、あなたは、オブジェクトファイルを作成しますがされていません実行可能ファイル。オブジェクトファイルは、実行ファイルを作成するリンカの入力ファイルとして使用される中間ファイルです。 .oという接尾辞を付けて名前を付けても問題ありません。

第2に、出力ファイル名を-oオプションで指定しないと、コンパイラのフロントエンドプログラムとリンカーはa.outという名前の実行可能ファイルを作成します。

しかし、これはすべてではありません。第2の例では実際に実際のオブジェクトファイルを作成しており、実行可能ではないためです。上記のように、実行可能ファイルを作成するには、これらを別のリンクステップに渡す必要があります。

次のいずれかの実行可能ファイルを作成する必要があります:あなたが実行可能ファイルにオブジェクトファイルをリンクする必要があり

gcc test.c 
./a.out 

またはを:

gcc -c test.c   # Create object file 
gcc test.o -o test  # Use object file to create executable file 
./test     # Run the executable file 
1

を取得します。

2番目のケースでは、単にコンパイルして組み立てるだけで、リンクせずに実行することはできません。

-c

コンパイルまたはソースファイルをアセンブルするが、をリンクしていない:-cためgcc --hまたはOverall options for gccを参照してください。 リンクステージは単に行われません。最終的な出力は、各ソースファイルのオブジェクトファイルの形式です。 デフォルトでは、ソースファイルのオブジェクトファイル名は、接尾辞 '.c'、 '.i'、 '.s'などを '.o'に置き換えることで作成されます。あなたはそれをリンクし、それを実行する必要があり

Unrecognized input files, not requiring compilation or assembly, are ignored. 

(重点鉱山)

:すべての

gcc -o a.out test.o 
3

コンパイラは「doesnのため、あなたはそのメッセージを取得します実行可能ではないため、オブジェクトファイルの実行可能ビットを設定しないでください。実行可能ビットを手動で設定して実行しようとすると、「未知の実行可能形式」のようなものが得られます。

これは単なるフォーマット上の問題ではなく、オブジェクトファイルは実際に実行できるものを得るための作業の半分に過ぎないということです。特に、リンクステップがありません。リンカは未解決の参照を見つけて、標準ライブラリのように明示的に指定しないものを含め、他のオブジェクトファイルのアドレスでそれらを修正し、適切な実行可能ファイルを生成します。カーネルがロードして実行する方法を知っていること。

0

オブジェクトファイルを実行することはできません。これは実行可能ではなく、実行可能になるようにリンクする必要があります。

gcc -o test test.cを試してみて、これはgccのでは根本的な問題である./test.out

0

を使用して実行します。あなたは、単一のコマンドで実行可能ファイルを取得したいとき、決してパラメータ-cを使用していないあなたは、次のコマンドに-cと実行可能ファイルを取得することができます.But

gcc -c xx.c yy.c -o new 

など

gcc -c xx.c yy.c 
gcc xx.o yy.o -o new 

それは同等です。注〜

gcc xx.c yy.c -o new 
関連する問題