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
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 [〜#〜]。
再び 同じ答え から引用して、gcc
自体が実行されるアーキテクチャとは異なるターゲットアーキテクチャでgcc
をコンパイルすることは、クロスコンパイルツールチェーンの準備として知られています。または、素人の言葉で言えば、このクロスコンパイルツールチェーンは、ディーゼルエンジンを実行するためにガソリンエンジンを微調整することに似ています。
ただし、クロスコンパイルツールチェーンの設定はかなり手間がかかるため、設定方法を説明するのではなく、ネイティブMIPSコンパイラをMIPS仮想マシンにインストールする方法を説明します。これには、VMのエミュレーターをセットアップし、その環境にOSをインストールする追加の手順が含まれますが、クロスコンパイラーをコンパイルするのではなく、ビルド済みのネイティブコンパイラーを使用できます。
最初にqemu
をインストールして、システムで仮想化されたオペレーティングシステムを実行できるようにします。先ほどリンクした回答で提案されているように、クロスコンパイルされたツールチェーンを ここで説明 および buildrootを使用 としてインストールするなど、いくつかのアプローチがあります。
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 [〜#〜]固有です。
X86_64で実行され、mipsバイナリを出力するクロスツールチェーン、gcc(+ binutils)が必要です。
あなたはそれを自分でゼロからビルドすることを試みることができます(例としてグーグル:クロスツールチェーンをビルドする)またはビルド済みのものをダウンロードします(- Codesourcery など)
または、 crosstool-ng のようなツールの助けを借りて独自に構築することもできます
buildroot のようなシステムも独自のクロスツールチェーンを構築(またはダウンロード)します(OpenWRTもそうです)。
emdebian プロジェクトは cross toolchains に対していくつかの作業を行いました。
これらのパッケージは非常にひどく腐敗しているので、メーリングリストまたはIRCを介して、emdebianプロジェクトに現在のステータスを問い合わせます。