3

私はこれを理解しましたが、新しい質問(「なぜ?」)を別の質問に分割する代わりに、この問題の解決策と説明を同じページに保持するのが最善だと思います.

でカーネル割り込みを使用して、開始してすぐに終了する基本的なアセンブリプログラムを作成していますint 0x80。私の現在のコードは次のとおりです。

/* Simple exit via kern-interrupt */

.globl start

start:
    pushl $0x0
    movl $0x1, %eax
    subl $4, %esp
    int $0x80

で組み立てた

as -arch i386 <file>.s

実行すると、1 行のエラーが発生します。

Illegal instruction

奇妙なことに、すべてをコメントアウトしてもIllegal instruction、指示がまったくないにもかかわらず、結果が返されます。linkingリンクするファイルが他にないのに、ステップが抜けているのでしょうか? はい、そうです

編集:私の質問を言い換えさせてください.ライブラリやリンクするものがないのに、なぜリンクする必要があるのですか?

4

2 に答える 2

3

実行可能ファイルを作成するには、リンクする必要があります。デフォルトでasは、オブジェクトファイルのみが提供されます。これは、実行可能ファイルに(他のオブジェクトファイルと一緒に、またはそれ自体で)リンクできるものですが、それ自体は有効な実行可能ファイルではありません。試す:

as -arch i386 -o file.o file.s
ld -o file file.o

あなたの質問への答えとして:

リンクするライブラリや何かがないのに、なぜリンクする必要があるのですか?

アセンブラは、他のものとリンクしないことを認識していないためです。

gcc特に指示がない限り(-cオプションを使用して)プログラムが必要であると想定するコンパイラとは異なり、asデフォルトでオブジェクトファイルが提供されます。マンページから:

"as""gcc"主に、リンカで使用するために GNU C コンパイラの出力をアセンブルすることを目的としています。"ld"

ワンステップ コマンドが必要な場合は、次のようなスクリプトを作成できますasld

as -arch i386 -o $1.o $1.s
ld -o $1 $1.o

を使用しますasld file

または、メイクファイルをセットアップして、面倒な作業をすべて行うこともできます。

于 2012-03-22T03:18:33.547 に答える
1

Cプログラムについても同じ議論をすることができます。私はライブラリを使用していません。なぜリンクする必要があるのですか。

それがツールチェーンの設計方法だからです。ツールの 1 つのセットは、ソース コード (任意の/多くの言語) から、ほとんどの場合不完全なオブジェクト ファイルに移動します。paxdiablo が示すように、オブジェクト ファイルのみを取得して実行可能ファイルにする場合でも、リンク ステージが必要です。他に何もなければ、(通常は) .text アドレスが必要であり、それはリンカー ステージから取得されます。

このようにすることは非常に理にかなっています。リンク段階はそのままでは十分に複雑です。その仕事を行い、その仕事を得意とする1つのツールを作成してください。システム エンジニアリングを行い、そのツールへのインターフェイスを定義します。言語ツールには複雑な仕事があり、その仕事を行うだけで、出力はオブジェクトファイルであり、リンカにならなくても解決できる限りです。

このツールチェーンを使用せず、1 つのコマンド ライン ステップでアセンブリからバイナリに直接移動できる nasm などを使用する場合。

于 2012-03-22T03:35:49.397 に答える