2016-07-10 21 views
1

私はBuildrootとRaspberry Pi(Raspbianを実行中)で私の最初のステップをやっています。しかし、どういうわけか、私はクロスコンパイルに間違ったことをしているようです。アプリケーションは、これは私が何をしたかであるCで書かれた最も簡単なHello Worldのプログラムです:クロスコンパイルされたアプリケーションは、ラズベリーパイで実行されません

  1. はbuildroot
  2. make raspberrypi2_defconfig
  3. make toolchain

をダウンロードしてインストールそれから私は小さなアプリケーションを書き、次のMakefile:

CROSS_BIN := /home/me/raspi/buildroot-2016.05/output/host/usr/bin 
SYSROOT := /home/me/raspi/buildroot-2016.05/output/host/usr/arm-buildroot-linux-uclibcgnueabihf/sysroot 
PATH := $(CROSS_BIN):$(PATH) 

CC := arm-linux-gcc 
CFLAGS := --sysroot=$(SYSROOT) 

app: app.c 
    $(CC) $(CFLAGS) -o [email protected] $< 

コンパイル済みアプリをダウンロードしてラズベリーにコピーしました。私はそれを実行しようとしたとき、RPIはファイルを見つけることができないと訴えます。バイナリタイプは私にとっては大丈夫だと思われ、CPUに適合しなければなりません:

[email protected]:~ $ ./app 
-bash: ./app: No such file or directory 

[email protected]:~ $ ls -l app 
-rwxr-xr-x 1 pi pi 4916 Jul 10 11:07 app 

[email protected]:~ $ file app 
app: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, not stripped 

[email protected]:~ $ lscpu 
Architecture:   armv7l 
Byte Order:   Little Endian 
CPU(s):    4 
On-line CPU(s) list: 0-3 
Thread(s) per core: 1 
Core(s) per socket: 4 
Socket(s):    1 
Model name:   ARMv7 Processor rev 5 (v7l) 
CPU max MHz:   900.0000 
CPU min MHz:   600.0000 

私が間違っていることを誰かに教えてもらえますか?アプリをネイティブでコンパイルして開発ホスト上で実行すると、問題なく実行されます。

+1

'ldd。/ app'と' readelf -l ./app | grep interpreter'を試して、あなたのRiOSに必要なプログラムインタプリタがあることを確認してください。 – osgx

+0

ヒントのおかげで、非常に便利なコマンドです。 Ishayが推測したように、uClibcが見つからない: '[プログラムのインタプリタを要求しています:/lib/ld-uClibc.so.0] –

+0

ありがとうございました。それが解決策でした。glibcでうまく動作します。他のすべてのヒントの後、私は実際に自分自身を考え出しました - ちょうどまだ投稿しませんでした。 –

答えて

1

、RPIは、それがファイルを見つけることができないと文句を言い。

シェルは、プログラムを実行するためにファイルを見つけることができず、ファイルを見つけることができないと訴えています。
straceコマンドを使用して、見つからないファイルを特定します。
おそらく、動的ライブラリの問題があります。あなたはuClibcツールチェーンで構築しましたが、あなたのルートファイルシステムはglibcを持っています。

二つの一般的な解決策:

(A)静的リンクを使用してプログラムを構築する(ので、それはもはや、ターゲットシステムのインストールされたライブラリに依存していること)。

$(CC) $(CFLAGS) -o -static [email protected] $< 

(B)Buildrootツールチェーンを再構築して、RPiに既にインストールされているライブラリと一致させます。すなわち、uClibcツールチェインの代わりに、バージョン番号が一致するglibcツールチェーンを構築します。

4

私のお金は/lib/ld-uClibc.so.0あなたのRasperryから逃しています。私は正しい?

このライブラリはダイナミックローダーであり、実行時にダイナミックライブラリを読み込む責任があります。必要な共有ライブラリをプロセスのアドレス空間にロードし、メモリに適切なパーミッションを設定します(読み取り専用、読み取り書き込み、および実行ファイル)。

クロスコンパイラには、RPiにインストールされているイメージとクロスコンパイル環境(sysroot)が一致していないため、存在しないローダーが必要です。

修正する方法はいくつかあります。動作するバイナリを調べて、まずfile /bin/lsを試して、ここに動的ローダーを投稿してみましょう。例えば

:私はそれを実行しようとしたとき(それは確かにそこに実行可能だが)

$ file /bin/ls 
/bin/ls: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=5e052e8de057d379ab51d4af510ad9318fe77b46, stripped 
+0

100%右、ありがとうございます。今、このライブラリをインストールする方法の "ベストプラクティス"は何ですか?私はそれがoutput/build/uclibc-1.0.14/libでコンパイルされていることを発見し、手動で必要と思われるすべてのファイルをボードにコピーできます。しかし、もっと良い方法があると思いますか? Buildrootは何かを提供していますか? –

+0

何もコピーしないでください、問題はローダーが間違っているので、私はそれをガイドします –

+0

あなたの努力に感謝します。別のコメントに書かれているように、私は 'uClibc'を' glibc'に変更することによって動作するようにしました。 –