2016-06-19 15 views
4

私は、Dockerコンテナ(thewtex/cross-compiler-linux-armv7)を使用して、Fedora 23 x86_64シンプルな "Hello World" Linuxユーザー空間Cプログラムをクロスコンパイルしています。ターゲットシステムは、ARMv7組み込みシステム(特に、ストックファームウェアを搭載したKobo Aura HD e-reader)です。ARM Linux実行ファイルがx86_64で不思議に動作する

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    printf("Hello World!\n"); 
    return 0; 
} 

私が生成したシェルスクリプトが何らかの理由

docker run thewtex/cross-compiler-linux-armv7 > ./dockcross.sh 
chmod +x dockcross.sh 

次のコマンドセットを使用してコンパイラを呼び出し、次のように

プログラム(hello_world.c)のソースコードでありますバギー、私は手動で/cross-compiler-base/cross-compiler-linux-armv7//:build/:build:z/dockcross.shに置き換えなければならない。今、私は

hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=317a9ea164931f614b24e98dec743050e2d7f900, not stripped 

予想に反して結果hello実行可能な程度

./dockcross.sh arm-linux-gnueabihf-cc hello_world.c -static -o hello 

file戻り、次の情報を実行して、私は、ホストシステム上で生成される実行可能ファイルを実行することができます。

[email protected]:~/tmp/test$ uname -a && ./hello 
Linux andreas-pc 4.5.5-201.fc23.x86_64 #1 SMP Sat May 21 15:29:49 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 
Hello World! 

だけでなく、ターゲットデバイス上で

[[email protected](none) onboard]# uname -a && ./hello 
Linux (none) 2.6.35.3-850-gbc67621+ #1038 PREEMPT Thu Apr 25 15:48:22 CST 2013 armv7l GNU/Linux 
Hello World! 

これについて何か説明がありますか?

+3

誰かが[binfmt_misc](https://en.m.wikipedia.org/wiki/Binfmt_misc)をあなたのために設定し、それをarm実行ファイルがqemuを実行するように設定している可能性があります。 –

+0

ありがとう、binfmt_miscは確かにこの魔法を可能にする仕組みです。私はこの質問に答えるつもりです。 –

答えて

8

binfmt_miscというLinuxカーネルには、任意のインタプリタを実行可能ファイルにマジックバイトシーケンスまたは特定のファイル拡張子を使用して関連付けることができるメカニズムがあります。インタプリタは、/proc/sys/fs/binfmt_misc/ファイルシステムインタフェースを使用して登録されます。

Fedoraでは、systemd-binfmtサービスが通訳者の登録を担当します。 /usr/lib/binfmt.dディレクトリから一連の構成ファイルを読み込み、sysfsに必要な書き込みを実行します。上記の質問の文脈では、qemuエミュレータスイートをインストールすると、対応する登録ファイルがこのディレクトリに配置されます。 ARMアーキテクチャの場合、このファイルはqemu-armと呼ばれ、以下の内容がありますされています

enabled 
interpreter /usr/bin/qemu-arm 
flags: 
offset 0 
magic 7f454c4601010100000000000000000002002800 
mask ffffffffffffff00fffffffffffffffffeffffff 

これは透過的にLinux上で静的にリンクされたARM実行可能ファイルを実行することができます。この機構を指摘してくれたMark Plotnickに感謝します。

関連する問題