web-dev-qa-db-ja.com

gccを使用してCをMIPSに変換する方法はありますか?

クラスのCからMIPSへの変換を完了しましたが、アセンブリと照合したいと思います。 Cコードをx86アーキテクチャ(私のコンピュータユーザーはIntel i5プロセッサ)ではなくMIPSアーキテクチャに変換して出力を出力できるようにgccを構成する方法があると聞きました。

Ubuntu(gccに付属)でターミナルを実行している場合、MIPSに変換するようにgccを構成するためにどのコマンドを使用しますか?インストールする必要があるものはありますか?

編集:明確にさせてください。これを読んで下さい。使用するコンパイラや、「クロスコンパイルは可能ですが、セットアップ方法の説明がない他のコンパイラを使用する必要があります」と言う人を探していません。

あなたがそれを投稿するつもりなら、少なくとも私に指示を参照してください。 GCCにはUbuntuが付属しています。コンパイラのインストール方法の経験がなく、GCC以外のオンラインチュートリアルを見つけるのは簡単ではありません。次に、私も知っておく必要のあるクロスコンパイルの場合があります。ありがとうございました。

16
Mike

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の空きディスク容量が必要になります。

30
Thomas Pornin

これは構成ではなく、MIPSにクロスコンパイルするバージョンのGCCが必要です。これには特別なGCCビルドが必要であり、セットアップにはかなり毛深いです(GCCのビルドは気弱な人向けではありません)。

これには [〜#〜] lcc [〜#〜] を使用することをお勧めします。 GCCよりもLCCでクロスコンパイルを行う方がはるかに簡単であり、現在のマシンではLCCの構築はほんの数秒です。

6
Fabian Giesen

ソースをbinutilsとgcc-coreにダウンロードし、../configure --target=mips ...のようなものでコンパイルする必要があります。特定のMIPSターゲットを選択する必要がある場合があります。次に、mips-gcc -Sを使用できます。

2
Ben Jackson

GCCをクロスコンパイルして、x86の代わりにMIPSコードを生成することができます。それは素晴らしい学習体験です。

迅速な結果が必要な場合は、MIPSをサポートするビルド済みのGCCを入手することもできます。 1つはCodeSourceryLiteツールチェーンです。これは無料で、多くのアーキテクチャ(MIPSを含む)に付属しており、LinuxおよびWindows用のバイナリを使用する準備ができています。

http://www.codesourcery.com/sgpp/lite/mips/portal/subscription?@template=lite

2

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-mipscrossbuild-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
    ...
1
Flux

クロスコンパイル可能な独自のバージョンのgccをコンパイルする必要があります。もちろん、これは簡単ではないので、別のアプローチを探すことができます。たとえば、 this SDKです。

1
Jack