web-dev-qa-db-ja.com

X86マシンでMIPSアーキテクチャアセンブリコードを生成する

Cプログラムを実行するときに、マシンに特定のコード[〜#〜] mips [〜#〜]を生成する必要があります。走るだけで

gcc -O2 -S -c hello.c

私のシステムでは、いくつかのアセンブリコードを生成しているように見えるhello.sを取得していますが、それは[〜#〜] mips [〜#〜]特定のコードではないようです。 hello.sファイルの内容は以下の通りです。

    .file   "hello.c"
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "Hello world"
    .text
    .p2align 4,,15
.globl main
    .type   main, @function
main:
.LFB11:
    .cfi_startproc
    movl    $.LC0, %edi
    xorl    %eax, %eax
    jmp printf
    .cfi_endproc
.LFE11:
    .size   main, .-main
    .ident  "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)"
    .section    .note.GNU-stack,"",@progbits

どうすればマシンで[〜#〜] mips [〜#〜]特定のコードを生成できますか?

私のマシンの詳細は以下の通りです。

Arch
x86_64
5
Ramesh

基本を理解する


MIPSアーキテクチャの wiki エントリから、次のように説明されています。

MIPS(元々はInterlocked Pipeline StagesのないMicroprocessorの頭字語)は、MIPS Technologies(以前のMIPS Computer Systems、Inc.)によって開発された縮小命令セットコンピュータ(RISC)命令セット(ISA)です。

X86-64の wiki エントリから、次のように記述されます。

x86-64(x64、x86_64、およびAMD64とも呼ばれます)は、x86命令セットの64ビットバージョンです。

したがって、質問のArch出力に従って、x86_64マシンがあり、[〜#〜] mips [〜#〜]gccコンパイラを実行した後のアーキテクチャ固有のコード。

これは、ガソリンエンジンでディーゼル車を試して実行することと似ています。どんなに頑張っても、ガスエンジンをいじらないと、ガソリンエンジンでディーゼル車を走らせることはできませんでした。

技術的に説明するにはgccは多数のアーキテクチャ用のアセンブリコードを生成できます[〜#〜] mips [〜 #〜]。ただし、特定のgccインスタンスがターゲットとするアーキテクチャは、gcc自体がコンパイルされるときに決定されます。 Ubuntuシステムで見つかるプリコンパイル済みバイナリは、x86(おそらく32ビットモードと64ビットモードの両方)を認識していますが、[〜#〜] mips [〜#〜]


CプログラムをMIPSアセンブリコードにコンパイルする方法


再び 同じ答え から引用して、gcc自体が実行されるアーキテクチャとは異なるターゲットアーキテクチャでgccをコンパイルすることは、クロスコンパイルツールチェーンの準備として知られています。または、素人の言葉で言えば、このクロスコンパイルツールチェーンは、ディーゼルエンジンを実行するためにガソリンエンジンを微調整することに似ています

ただし、クロスコンパイルツールチェーンの設定はかなり手間がかかるため、設定方法を説明するのではなく、ネイティブMIPSコンパイラをMIPS仮想マシンにインストールする方法を説明します。これには、VMのエミュレーターをセットアップし、その環境にOSをインストールする追加の手順が含まれますが、クロスコンパイラーをコンパイルするのではなく、ビルド済みのネイティブコンパイラーを使用できます。

最初にqemuをインストールして、システムで仮想化されたオペレーティングシステムを実行できるようにします。先ほどリンクした回答で提案されているように、クロスコンパイルされたツールチェーンを ここで説明 および buildrootを使用 としてインストールするなど、いくつかのアプローチがあります。

  • ここから qem のtarボールをダウンロードします。
  • Tarボールをダウンロードしたら、次のコマンドを実行します。

     bzip2 -d qe*
     tar -xvf qe*
     ./configure
     make
     make install
    
  • 次に、qemuをマシンにインストールした後、 here および here で提案されているように、debian OSのネットブートのいくつかの方法を試しました。しかし、残念ながら、正しいミラーが利用できなかったため、ネットブートを使用してdebian OSのインストールを実行できませんでした。

MIPSアーキテクチャをターゲットとするdebian用のイメージを here から取得し、kernelおよびqemuイメージと上記のリンクからダウンロードして、以下の手順を実行しました。

  • 以下のようにqemuを起動しました。

    qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda 
    debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"
    
  • Debianシステムが立ち上がった後、以下のようにgccコンパイラをインストールしました。

    apt-get update && apt-get upgrade
    apt-get install build-essential
    

これで、qemuのMIPS debian仮想マシン内に完全に機能するネイティブgccコンパイラーがあり、Cプログラムを[〜#〜] mips [〜#〜]にコンパイルします特定のアセンブリコード。


テスト中


私のdebianマシン内では、サンプルのC hello worldプログラムを挿入して、以下のようにhello.cとして保存しました。

#include<stdio.h>
int main()
{
    printf("Hello World");
}

Hello.cプログラムのMIPSアーキテクチャコードを生成するために、gccコンパイラを使用してCプログラムを実行しました。

gcc -O2 -S -c hello.c

上記のコマンドは、my[〜#〜] mips [〜#〜]アーキテクチャコードを生成するhello.sファイルを生成しました。

    .file   1 "hello.c"
    .section .mdebug.abi32
    .previous
    .gnu_attribute 4, 1
    .abicalls
    .section    .rodata.str1.4,"aMS",@progbits,1
    .align  2
$LC0:
    .ascii  "Hello World\000"
    .text
    .align  2
    .globl  main
    .set    nomips16
    .ent    main
    .type   main, @function
main:
    .frame  $sp,0,$31       # vars= 0, regs= 0/0, args= 0, gp= 0
    .mask   0x00000000,0
    .fmask  0x00000000,0
    .set    noreorder
    .set    nomacro

    lui $28,%hi(__gnu_local_gp)
    addiu   $28,$28,%lo(__gnu_local_gp)
    lui $4,%hi($LC0)
    lw  $25,%call16(printf)($28)
    nop
    jr  $25
    addiu   $4,$4,%lo($LC0)

    .set    macro
    .set    reorder
    .end    main
    .size   main, .-main
    .ident  "GCC: (Debian 4.4.5-8) 4.4.5"

しかし、上記の生成されたコードが[〜#〜] mips [〜#〜]アセンブリコードであるかどうかはどうすればわかりますか?

Archコマンドの出力は、マシンのアーキテクチャーを示します。私のdebianマシンでは、出力はmipsとして生成されます。また、マシンにbinutilsまたはクロスコンパイラツールチェーンがインストールされていません。

したがって、生成されたアセンブリコードは[〜#〜] mips [〜#〜]固有です。

11
Ramesh

X86_64で実行され、mipsバイナリを出力するクロスツールチェーン、gcc(+ binutils)が必要です。

あなたはそれを自分でゼロからビルドすることを試みることができます(例としてグーグル:クロスツールチェーンをビルドする)またはビルド済みのものをダウンロードします(- Codesourcery など)

または、 crosstool-ng のようなツールの助けを借りて独自に構築することもできます

buildroot のようなシステムも独自のクロスツールチェーンを構築(またはダウンロード)します(OpenWRTもそうです)。

3
Alex

emdebian プロジェクトは cross toolchains に対していくつかの作業を行いました。

これらのパッケージは非常にひどく腐敗しているので、メーリングリストまたはIRCを介して、emdebianプロジェクトに現在のステータスを問い合わせます。

1
Simon Richter