2

Linux Kernel 3.10 と Busybox を実行している組み込みシステムがあります。

-static フラグのないプログラムをクロス コンパイルすると (buildroot によるツールチェーン ビルドなので uclibc を使用)。実行されません。

-/bin/sh: helloworld: not found

-static フラグを使用してコードをコンパイルした場合。通常は実行され、HelloWorld が出力されます。

何が起きてる?

4

3 に答える 3

1

上記に加えて、体が同じ問題に直面しているかどうかを明確にします..上記の質問で見たように..

If you compile busybox with statically.Then no need to worry about shared library. But if you compiled busy box with dynamically then your toolchain plays important role in rootfs. here you need to copy libraries of toolchain to rootfs /lib folder .

次のコマンドを入力するだけで、コピーする必要があるライブラリを知ることができます。

strings _install/bin/busybox | grep ^lib

rootfs の /lib に保持する必要があるライブラリのリストを示します。

このコマンドは、「ファイルからすべての文字列を取得し、lib で始まる行のみを表示する」ことを示しています。プログラム ldd は、プログラムがクロスコンパイルされており、開発ホストで実行されないため、使用できません。これらのファイルは、ツールチェーンの sysroot ディレクトリから取得する必要があります。最近のほとんどのツールチェーンは sysroot で構成されています。これは、ツールチェーンの対象となるシステムのルート ファイル システムに表示されるツールチェーンのファイルを含むディレクトリです。ツールチェーンが sysroot をサポートしているかどうかを確認するには、次のことを試してください。

$ arm-linux-gcc -print-sysroot

/arm-unknown-linux-gnueabi/bin/arm-linux-gcc これが有効なパスである場合、ここからファイルをコピーする必要があります。パスが表示されない場合は、find を使用して の sysroot ディレクトリを見つけるか、find を使用して libc.so を探します。

$ find . -name libc.solibc と libm を見つけたら、(rootfs)/lib ディレクトリを作成し、そこにコピーします。ファイルは他のファイルへのシンボリック リンクである可能性が高いため、すべてのファイルを収集してください。次に取得するファイルは、通常は ld-linux- と呼ばれるダイナミック ローダーで、これも libc.so.* とともに lib ディレクトリにあります。それを /lib ディレクトリにコピーします。システムにはすべての共有ライブラリとローダーが含まれているため、BusyBox を実行できます。

于 2013-09-22T09:07:42.080 に答える
0

この問題の解決策は、uClibc ライブラリをターゲット ファイル システムにコピーすることです。これは、次の手順に従って実行できます。

1.uClibc ライブラリは「buildroot/output/target/lib/」フォルダにあります。2.このフォルダからすべてのファイルをターゲット ファイル システムの「/lib」フォルダにコピーする必要があります。3.「scp」コマンドでコピーできます。sudo scp -r PATH_TO_BUILDROOT/output/target/lib/* TARGET_USERNAME@TARGET_IP:/lib

これを行うと、すべてのアプリケーションが適切に実行されます。

于 2014-02-23T18:12:27.680 に答える