8

Ubuntu 12.04でアプリを作成し、組み込みシステムで実行してみました。私apt-cache show libc6は(とりわけ)表示する開発マシンで実行しました

Package: libc6
Priority: required
Section: libs
Architecture: i386
Source: eglibc
Version: 2.15-0ubuntu10
Replaces: belocs-locales-bin, libc6-i386
Provides: glibc-2.13-1, libc6-i686

組み込みデバイスに存在するlibc6のバージョンは2.8.90です。デバイスの\libディレクトリに2つのライブラリがあります

libc-2.8.90.so
libc.so.6

アプリケーションを組み込みデバイスにコピーすると、次のエラーが発生します

/usr/lib/libc.so.6: version `GLIBC_2.15` not found (required by ./ServerSocketApp)

可能であれば、開発マシンでアプリケーションをビルドするときに、組み込みデバイスに存在するのと同じバージョンのlibc6にリンクするように強制する必要があることを知っています。私が抱えている問題は、これを行う方法がわからないことです。私が見つけた答えは、今のところ私には無意味です。これをバージョン2.8.90にリンクさせるためにg++に渡す必要があるオプションはありますか?

必死になって、開発マシンのlibcを、すでに存在するものの代わりに組み込みデバイスにコピーして、最高のものを期待することは可能だと思いますか?オンラインで、これについて簡単に説明しているドキュメントを見つけることができないようです。そのため、ここで髪の毛を引き裂いているので、アドバイスは本当に歓迎されます。

4

3 に答える 3

9

OK、ここにもう少し長い説明がありますが、注意して進めてください。組み込みデバイスで使用可能な環境と一致するようにchroot環境をセットアップし、ビルドプロセスの最終段階で使用することを強くお勧めします。

動的にリンクされたELF実行可能ファイルがどのようにロードおよび実行されるかを理解する必要があります。ダイナミックリンカとも呼ばれるランタイムリンクエディタ(RTLD)と呼ばれるものがあり、必要なすべてのダイナミックリンクライブラリのロード、再配置の修正などを処理します。ダイナミックリンカの名前は、/lib/ld-linux.so.232ビットLinuxシステムとglibc264/lib64/ld-linux-x86-64.so.2ビットLinuxシステムにあり glibc2ます。ダイナミックリンカはライブラリに非常に緊密に結合されておりglibc2、通常はそのライブラリの一致するバージョンのみを処理できます。また、そのパスはリンカーによって実行可能ファイルにハードコードされています(通常はld、リンクを実行するためにコンパイラによって暗黙的に呼び出されます)。最後のステートメントの有効性は、次のようにするだけで簡単に確認できますldd some_elf_executable。ランタイムリンクエディタがフルパスで表示されます。

$ ldd some_elf_executable
linux-vdso.so.1 =>  (0x00007fffab59e000)
libm.so.6 => /lib64/libm.so.6 (0x0000003648400000)
libc.so.6 => /lib64/libc.so.6 (0x0000003648800000)
/lib64/ld-linux-x86-64.so.2 (0x0000003648000000) <--- the RTLD

glibc2実行可能ファイルが実行されるシステムにインストールされているものとは異なるバージョンを使用する動的にリンクされた実行可能ファイルを生成するには、次のオプションのセットを使用してコードをリンクする必要がありldます。

  • -rpath=/path/to/newer/libs/path/to/newer/libs-これは、ライブラリの依存関係を解決しようとするときに最初に検索するようにダイナミックリンカに指示します。組み込みデバイスに/path/to/newer/libs新しいバージョンをコピーしたパスと一致する必要がありますglibc2
  • -rpath-link=/path/to/newer/libs-このオプションは、リンク時に共有ライブラリ間の依存関係を解決するときに使用するようにリンカー(ダイナミックリンカーではない)に指示します/path/to/newer/libs-これは通常、あなたの場合は必要ありません。
  • --dynamic-linker=/path/to/newer/libs/ld-linux.so.2-これは、実行可能ファイルに埋め込まれるRTLDへのパスをオーバーライドします

これらのオプションを提供する方法ldは、通常-Wl、GCCのオプションを使用することです。

-rpath=/path/to/newer/libs

になります:

-Wl,-rpath,/path/to/newer/libs

=(に置き換えられていることに注意してください,

--dynamic-linker=/path/to/newer/libs/ld-linux.so.2

になります:

-Wl,--dynamic-linker,/path/to/newer/libs/ld-linux.so.2

/lib/ld-linux.so.2開発システムから/path/to/newer/libs/組み込みデバイスにコピーする必要があります。また、実行可能ファイルによって使用される、または間接的にロードされる可能性のlibc.so.6ある数学ライブラリおよびその他すべてのライブラリをコピーする必要があります。とは、実際には。のような名前を持つ実際のライブラリへのシンボリックリンクであることにlibm.so.6注意してください。これらのライブラリファイルをコピーし、適切なシンボリックリンクを作成して、みんなを幸せにする必要があります。libc.so.6libm.so.6libc-2.<version>.so

于 2012-07-09T16:57:27.310 に答える
1

実行可能ファイルで使用できるシンボルを制限するLSBSDK( http://www.linuxfoundation.org/collaborate/workgroups/lsb/download )を使用してコンパイルすると、運が良かったかもしれません。

于 2012-07-09T15:16:52.557 に答える
1

これは根本的に正しくありません。古いlibcにリンクする方法を一緒にハックできるかもしれませんが、問題は環境のセットアップです。

組み込みシステム用のアプリケーションを開発する場合。あなたはホスト上でそうします。通常、ホストと組み込みデバイスは同じアーキテクチャ上にありません。たとえば、ホストは通常​​x86で実行されているデスクトップ/ラップトップであり、組み込みシステムはARM上にある場合があります。組み込みデバイスと同じアーキテクチャを使用している場合、それはまったくの偶然です。標準的な練習環境のセットアップは、引き続き従う必要があります。

  • ホストマシンには、アプリケーションを組み込みアーキテクチャにクロスビルドするためのツールチェーンセットアップが必要です。
  • ホストマシンには、組み込みデバイスに存在する完全なrootfsのコピーが必要です。これには、クロスツールが組み込みシステム用のアプリケーションをコンパイルするために使用するすべてのライブラリが含まれます

このように設定している場合。開発が容易になります。シンプルでクリーンなmakeファイルをセットアップしてアプリケーションを構築しscp、バイナリだけを組み込みシステムに渡して実行することができます。

于 2012-07-09T18:25:16.057 に答える