5

C がシステム プログラミング言語であることを考えると、オペレーティング システムが存在しなくても呼び出すことができる生の x86 マシン コードに C コードをコンパイルするにはどうすればよいでしょうか? (IE:生のマシンコードをディスクからメモリにロードし、最初の命令に直接ジャンプするブートセクタがあると想定できます)。

ボーナス ポイントとして、Visual Studio 2010 のコンパイラを既に入手しているので、それを使用してコンパイルしたいと考えています。それに失敗した場合、多数の依存関係をインストールしたり、システム全体で大規模な構成変更を行ったりすることなく、タスクを達成するための最良の方法は何ですか? Windows 7でコンパイルします。

4

2 に答える 2

4

通常、そうではありません。代わりに、通常どおりにコードをコンパイルしてから、(リンカまたはその他のツールを使用して) オブジェクト ファイルから未加工のバイナリを抽出します。

たとえば、Linux では、このobjcopyツールを使用してオブジェクト ファイルを生のバイナリ ファイルにコピーできます。

$ objcopy -O binary object.elf object.binary
于 2013-10-14T18:22:33.433 に答える
1

まず、システム コール (printf、fopen、read など) を必要とするライブラリを使用しないでください。次に、C ファイルを通常どおりにコンパイルします。主な違いはリンカのステップです。C コンパイラにリンカを呼び出させる (または一部の GUI に実行させる) ことに慣れている場合は、何らかの形で手動で引き継ぐ必要がある可能性があります。具体的な解決策はツールによって異なります。いくつかのブートストラップ コード (C コンパイラとプログラマの想定をカバーし、C プログラムのエントリ ポイントを起動するために必要な少量のアセンブリ)、およびリンカー スクリプトまたはリンカーがバイナリのアドレス空間を制御し、オブジェクトをリンクするための適切なコマンド ライン オプション。次に、リンカーの出力形式によっては、他のバイナリ形式 (intel hex、srec、exe、com、coff、elf、

于 2013-10-16T23:55:42.947 に答える