2017-03-19 17 views
1

Iアームのlinux-gnueabi-GCCとのクロスコンパイルのhello.carm-linux-xxx-gccでコンパイルしたユーザープログラムは、x86マシン上で動作しますか?

>arm-linux-gnueabi-gcc -static -o hello hello.c -g 

私は./helloの形式をチェックしました、それは腕のユーザプログラムです!

>file ./hello 
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=d56f37000fa4ae28889f3c785ed55b1dd48bdda7, not stripped 

、およびQEMU-アームは、なぜ私は./hello

>./hello 
hello, world 

なぜ、どのようにこれが起こってハロー直接実行することができ、その後./hello

>qemu-arm ./hello 
hello, world 

を実行することができます?


2017年3月19日編集:

私はx86_64版のユーザプログラムはQEMU-アームとrunableされていないことをテストしてみた

> gcc -o hello_x86 hello.c 
> qemu-arm hello_x86 
hello_x86: Invalid ELF image for this architecture 

2017年3月19日に編集:

この記事ではgdbの部分を削除しました。 gdbはここで正しく機能していません。そして、私が見たアセンブリは、このプログラムからではありません。

+0

あなたは[binfmt_misc]で演奏されている(https://でエン.wikipedia.org/wiki/Binfmt_misc)? 'file hello'はまだARMを表示していますか? 'pwd'を実行し、あなたのパスがまだあなたが思うところにいることを確認してください。 –

+1

あなたがそれを言及するまで私はbinfmt_miscについて何も知らない。 elfにx86とarmが同時に存在する可能性はありますか? –

+0

あなたのシステムは(おそらく[binfmt_misc](https://en.wikipedia.org/wiki/Binfmt_misc)...)ARMのすべてのELFファイルで 'qemu-arm'を実行するように設定されているかもしれません。 –

答えて

0

QEMUエミュレータは特にLinuxのゲストシステムをエミュレートするために実際にはホストコンピュータ上でゲストコードを実行するために、アドレス0x0010000のソフトウェアをリンクする必要がありました。このため、起動手順は具体的に実装されています。-kernelオプションは、アドレス0x00010000から始まるシステムメモリ内にバイナリファイル(通常はLinuxカーネル)をロードします。エミュレータは、アドレス0x00000000のに実行を開始し、私たちは

は私がこのtutorialに従う正しいアドレスに弊社のバイナリを配置する必要があり、それは私の作品

関連する問題