みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ubuntuで作ったアプリを他のLinuxで動作

Ubuntu Linuxなどでgccのコンパイラを使用して作成したアプリケーションの実行ファイルを他のLinuxでも実行させることなどは可能でしょうか?

いまBeagleBone BlackというAngstrom Linuxというのが実装されている基板でのアプリケーションを作成しているのですが、

自分のPCにUbuntu Linuxがインストールされていたので、こちらでHello worldのプログラムを作ってgccコンパイルしてできた実行ファイルをBeagleBone Blackに移して、コマンドラインで


./hello_a.out


これで実行してみたのですが、

./hello_a.out:cannot execute binary file


このようなエラーがでて実行することができません。



どなたかご教授頂きますよう、お願い致します。

投稿日時 - 2014-04-14 13:37:50

QNo.8554131

すぐに回答ほしいです

質問者が選んだベストアンサー

ライブラリとか適合できれば動作するでしょう。
当たり前ですが、CPUがバイナリ互換でないと駄目です。

>自分のPCにUbuntu Linuxがインストールされていたので、こちらでHello worldのプログラムを作ってgccコンパイルしてできた実行ファイルをBeagleBone Blackに移して、

「ARM CPUの乗ったPC」ですよね?
Intel CPUやAMDのCPUだった場合、できあがったバイナリはBeagleBone Blackでは動作しませんよ?

http://beagleboard.org/Products/BeagleBone+Black
>Processor: AM335x 1GHz ARM® Cortex-A8


file hello_a.out
とやったらどう出力されますかね?

CentOS5.xでの例。
[user@localhost ~]$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped
[user@localhost ~]$

「Intel 80386」とある通り、ARMじゃ動きません。


SheevaPlugにDebian 6.0.9の例
user@localhost:~$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
user@localhost:~$

投稿日時 - 2014-04-14 13:57:09

お礼

回答いただきありがとうございます。
PCのLinuxでコンパイルを行った実行ファイルを


file hello_a.out


このコマンドを行ったところ、次のように出てきました。


hello_a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x83e82685fc650120a21f7e7fa9c2123634daa72b, not stripped


この実行ファイルはBeagle Bone Blackでは動作できません。



それで、Beagle Bone Blackでソースコードをgccコンパイラでコンパイルしてできた実行ファイルでは



root@beaglebone:/home# file a.out
a.out: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped




このように出てきました。

この実行ファイルはBeagle Bone Blackボードで動作できました。


私はてっきりLinuxのコマンドプログラムなら、どのLinuxのPCのGCCでコンパイルしてできた実行ファイルはどこでも実行可能なのかなとか思ってました。


実行ファイル出力される際は、ビルドコンパイルしたそのPCのCPUのアセンブラ結果などによるということで、それごとにビルドが必要なのですね。


クロスコンパイラという言葉は聞いたことがあるのですが、それとかに関係あるのですね。勉強になります。

投稿日時 - 2014-04-20 18:14:43

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

Wr5

>Intel CPUやAMDのCPUだった場合、できあがったバイナリはBeagleBone Blackでは動作しませんよ?

クロスコンパイルしている場合はその限りではありません。
# もちろん、クロスコンパイルでできあがったバイナリをホストで動かすことはできないでしょうけど。

クロスコンパイル環境+debパッケージ作成な環境構築、結構大変なのよねぇ。
# というか成功したこと無い。
# x86のDebian 7.xでARMのDebian 7.x向け作りたいんだけど……。


まぁ、クロスコンパイルとか知っていたらこんな質問が出ることもないと思われますが…。

投稿日時 - 2014-04-14 14:02:58

ANo.1

ソースがあるなら、なぜそれぞれコンパイルしないの?
関連ファイルを含めて、なぜパッケージにしないの?

投稿日時 - 2014-04-14 13:48:43

お礼

回答頂きありがとうございます。


PCのLinuxでコンパイルしたものをBeagleBone Blackボードで動作させることはできないことがわかりました。

ソースコードファイルをBeagleBone Blackボードに移動してコンパイルをしたところ、起動することができました。


gccコンパイルは搭載しているCPUによってコンパイルが必要になることがあるんですね。

投稿日時 - 2014-04-20 18:28:34

あなたにオススメの質問