クラスのCからMIPSへの変換を完了しましたが、アセンブリと照合したいと思います。 Cコードをx86アーキテクチャ(私のコンピュータユーザーはIntel i5プロセッサ)ではなくMIPSアーキテクチャに変換して出力を出力できるようにgccを構成する方法があると聞きました。
Ubuntu(gccに付属)でターミナルを実行している場合、MIPSに変換するようにgccを構成するためにどのコマンドを使用しますか?インストールする必要があるものはありますか?
編集:明確にさせてください。これを読んで下さい。使用するコンパイラや、「クロスコンパイルは可能ですが、セットアップ方法の説明がない他のコンパイラを使用する必要があります」と言う人を探していません。
あなたがそれを投稿するつもりなら、少なくとも私に指示を参照してください。 GCCにはUbuntuが付属しています。コンパイラのインストール方法の経験がなく、GCC以外のオンラインチュートリアルを見つけるのは簡単ではありません。次に、私も知っておく必要のあるクロスコンパイルの場合があります。ありがとうございました。
GCCcanは、MIPSを含む多数のアーキテクチャ用のアセンブリコードを生成できます。ただし、GCC自体がコンパイルされるときに、特定のGCCインスタンスがターゲットとするアーキテクチャが決定されます。 Ubuntuシステムにあるプリコンパイルされたバイナリは、x86(32ビットモードと64ビットモードの両方)については知っていますが、MIPSについては知りません。
GCC自体が実行されるアーキテクチャとは異なるターゲットアーキテクチャでGCCをコンパイルすることは、クロスコンパイルツールチェーンの準備として知られています。これは実行可能ですが、かなりのドキュメントを読むことと忍耐力が必要です。通常、最初にクロスアセンブラとクロスリンカー(GNU binutils)を構築してから、クロスGCC自体を構築する必要があります。
buildroot の使用をお勧めします。これは、完全なクロスコンパイルツールチェーンとユーティリティの作成を支援するために設計されたスクリプトとメイクファイルのセットです。一日の終わりには、ターゲットシステム用の完全なOSと開発ツールを入手できます。これには、あなたが求めているクロスコンパイラが含まれます。
もう1つのまったく異なる解決策は、 [〜#〜] qemu [〜#〜] を使用することです。これは、MIPSシステムを含むさまざまなプロセッサおよびシステム用のエミュレータです。これを使用して、MIPSプロセッサを搭載した仮想マシンを実行し、そのマシン内にMIPS用のオペレーティングシステムをインストールできます。 Debian 、Linuxディストリビューション。このようにして、nativeGCC(MIPSシステムで実行されMIPSのコードを生成するGCC)を取得します。
QEMUの方法は少し簡単かもしれません。クロスコンパイルを使用するには、いくつかの毛深い詳細をある程度理解する必要があります。いずれにせよ、約1GBの空きディスク容量が必要になります。
これは構成ではなく、MIPSにクロスコンパイルするバージョンのGCCが必要です。これには特別なGCCビルドが必要であり、セットアップにはかなり毛深いです(GCCのビルドは気弱な人向けではありません)。
これには [〜#〜] lcc [〜#〜] を使用することをお勧めします。 GCCよりもLCCでクロスコンパイルを行う方がはるかに簡単であり、現在のマシンではLCCの構築はほんの数秒です。
ソースをbinutilsとgcc-coreにダウンロードし、../configure --target=mips ...
のようなものでコンパイルする必要があります。特定のMIPSターゲットを選択する必要がある場合があります。次に、mips-gcc -S
を使用できます。
GCCをクロスコンパイルして、x86の代わりにMIPSコードを生成することができます。それは素晴らしい学習体験です。
迅速な結果が必要な場合は、MIPSをサポートするビルド済みのGCCを入手することもできます。 1つはCodeSourceryLiteツールチェーンです。これは無料で、多くのアーキテクチャ(MIPSを含む)に付属しており、LinuxおよびWindows用のバイナリを使用する準備ができています。
http://www.codesourcery.com/sgpp/lite/mips/portal/subscription?@template=lite
Ubuntuリポジトリからクロスコンパイラをインストールする必要があります。リポジトリには4つのGCCMIPSCクロスコンパイラが用意されています。必要に応じて選択してください。
gcc-mips-linux-gnu
- 32ビットのビッグエンディアン。gcc-mipsel-linux-gnu
- 32ビットのリトルエンディアン。gcc-mips64-linux-gnuabi64
- 64ビットビッグエンディアン。gcc-mips64el-linux-gnuabi64
- 64ビットのリトルエンディアン。(Debianユーザーへの注意:通常、build-essential
パッケージを使用して通常のコンパイラーをインストールしたい場合は、crossbuild-essential-mips
、crossbuild-essential-mipsel
、およびcrossbuild-essential-mips64el
の存在を知りたいと思うでしょう)
次の例では、32ビットのリトルエンディアンバージョン(Sudo apt-get install gcc-mipsel-linux-gnu
)を選択したと仮定します。他のMIPSバージョンのコマンドも同様です。
システムのネイティブアーキテクチャの代わりにMIPSを処理するには、gcc
の代わりにmipsel-linux-gnu-gcc
コマンドを使用します。たとえば、mipsel-linux-gnu-gcc -fverbose-asm -S myprog.c
は、MIPSアセンブリを含むファイルmyprog.s
を生成します。
MIPSアセンブリを表示する別の方法:mipsel-linux-gnu-gcc -g -c myprog.c
を実行して、デバッグ情報を含むオブジェクトファイルmyprog.o
を生成します。次に、mipsel-linux-gnu-objdump -d -S myprog.o
を使用してオブジェクトファイルの逆アセンブリを表示します。たとえば、myprog.c
がこれである場合:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
printf("The answer is: %d\n", a + b);
return 0;
}
また、mipsel-linux-gnu-gcc -g -c myprog.c
を使用してコンパイルされている場合、mipsel-linux-gnu-objdump -d -S myprog.o
は次のように表示されます。
myprog.o: file format elf32-tradlittlemips
Disassembly of section .text:
00000000 <main>:
#include <stdio.h>
int main() {
0: 27bdffd8 addiu sp,sp,-40
4: afbf0024 sw ra,36(sp)
8: afbe0020 sw s8,32(sp)
c: 03a0f025 move s8,sp
10: 3c1c0000 lui gp,0x0
14: 279c0000 addiu gp,gp,0
18: afbc0010 sw gp,16(sp)
int a = 1;
1c: 24020001 li v0,1
20: afc20018 sw v0,24(s8)
int b = 2;
24: 24020002 li v0,2
28: afc2001c sw v0,28(s8)
printf("The answer is: %d\n", a + b);
2c: 8fc30018 lw v1,24(s8)
30: 8fc2001c lw v0,28(s8)
34: 00621021 addu v0,v1,v0
38: 00402825 move a1,v0
3c: 3c020000 lui v0,0x0
40: 24440000 addiu a0,v0,0
44: 8f820000 lw v0,0(gp)
48: 0040c825 move t9,v0
4c: 0320f809 jalr t9
50: 00000000 nop
54: 8fdc0010 lw gp,16(s8)
return 0;
58: 00001025 move v0,zero
}
5c: 03c0e825 move sp,s8
60: 8fbf0024 lw ra,36(sp)
64: 8fbe0020 lw s8,32(sp)
68: 27bd0028 addiu sp,sp,40
6c: 03e00008 jr ra
70: 00000000 nop
...
クロスコンパイル可能な独自のバージョンのgccをコンパイルする必要があります。もちろん、これは簡単ではないので、別のアプローチを探すことができます。たとえば、 this SDKです。