作成する必要がありますMeapsCプログラムを実行すると、私のコンピュータに特定のコードがあります。走っているとき、
gcc -O2 -S -c hello.c
私のシステムでは、hello.s
いくつかのアセンブリコードを生成しているようですが、そうではありません。Meaps特定のコード。ファイルの内容は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
どのように生成できますか?Meaps私のコンピュータに特定のコードがありますか?
私のコンピュータの詳細は次のとおりです。
arch
x86_64
答え1
基本を学ぶ
~からウィキペディアMIPSアーキテクチャのエントリポイントは次のとおりです。
MIPS(もともとはInterlocked Pipeline Stagesのないマイクロプロセッサ)は、MIPS Technologies(旧MIPS Computer Systems, Inc.)が開発したRISC(Reduced Instruction Set Computer)ISA(コマンドセット)です。
~からウィキペディアx86-64のエントリは次のように記述されます。
x86-64(x64、x86_64、およびAMD64とも呼ばれます)は、x86命令セットの64ビットバージョンです。
したがって、arch
質問の結果に基づいて、x86_64私が作ろうとしているマシンMeapsコンパイラを実行した後のアーキテクチャ固有のコードですgcc
。
これは次のようになります。ガソリンエンジンでディーゼル車を運転してみてください。。いくら努力してもガスエンジンをチューニングしないとガスエンジンでディーゼル車を運行することはできません。
技術的な用語で説明する、gcc
次のような幅広いアーキテクチャのアセンブリコードを生成できます。Meaps。ただし、特定のインスタンスgcc
のターゲットアーキテクチャはgcc
コンパイル時に決定されます。 Ubuntuシステムのプリコンパイル済みバイナリについては、こちらをご覧ください。x86(おそらく32ビットモードと64ビットモードの両方)しかしそうではありませんMeaps。
CプログラムをMIPSアセンブリコードにコンパイルする方法
再引用同じ答え、基本的に実行されるアーキテクチャgcc
とは異なるターゲットgcc
アーキテクチャにコンパイルすることをクロスコンパイルツールチェーンの準備といいます。それとも平信徒の言葉で、このクロスコンパイルツールチェーンは、ディーゼル車を操作するためにガソリンエンジンを調整するのと似ています。。
しかし、クロスコンパイルツールチェーンを設定するのはかなり面倒な作業なので、設定方法ではなく、デフォルトのMIPSコンパイラをMIPS仮想マシンにインストールする方法について説明します。これには、仮想マシン用のエミュレータを設定し、オペレーティングシステムをその環境にインストールする追加の手順が含まれますが、クロスコンパイラをコンパイルする代わりに、事前に構築されたネイティブコンパイラを使用できます。
qemu
まず、システムで仮想化されたオペレーティングシステムを実行するようにインストールします。繰り返しますが、クロスコンパイルされたツールチェーンをインストールするなど、いくつかの方法があります。ここで議論してくださいそしてビルドルートの使用以前にリンクした回答で提案したとおり。
- tar パッケージのダウンロードゲームここから。
tar ballをダウンロードしたら、次のコマンドを実行します。
bzip2 -d qe* tar -xvf qe* ./configure make make install
qemu
これで、コンピュータにインストールした後、提案されているようにDebian OS用の複数のネットワーク起動方法を試しました。ここそして ここ。ただし、残念ながら正しいイメージがないため、ネットワークブートを使用してDebian OSをインストールすることはできません。
MIPSアーキテクチャ用のDebianイメージを取得しました。
ここ上記のリンクから画像をダウンロードし、以下の手順に従いました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
これでgcc
、qemuのMIPS Debian仮想マシンで完璧に動作し、Cプログラムを次のようにコンパイルするデフォルトのコンパイラがあります。Meaps特定のアセンブリコード。
テスト
私の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
上記のコマンドはhello.s
私のファイルを生成するファイルを生成しました。Meapsスキーマコード。
.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"
しかし、上記で生成されたコードが次のようになるかどうかはどうすればわかりますか?Meaps組み立てコード?
このarch
コマンドの出力はマシンのアーキテクチャを伝えます。私のDebianコンピュータで生成される出力は次のようになり、コンピュータにクロスコンパイラツールチェーンがインストールされていませ mips
ん。binutils
したがって、生成されたアセンブリコードは次のようになります。Meaps特定の。
答え2
x86_64 で実行されますが、mips バイナリを出力するクロスツールチェーン gcc(+binutils) が必要です。
最初から自分で構築したり(たとえば、google:Build cross toolchain)、事前に構築されたツールチェーンをダウンロードできます(例:コードソース)
または、次のツールを使用できます。クロスツール-ng
このようなシステムもあります。ルートディレクトリの構築独自のクロスツールチェーンを構築(またはダウンロード)します(OpenWRTも私の考えではそうです)。
答え3
これエンデビアンプロジェクトでいくつかの作業が完了しました。クロスツールチェーン。
これらのパッケージはbitrotの影響を受けやすいので、メーリングリストやIRCを介してemdebianプロジェクトに現状を問い合わせるようにします。