4

ARM 組み込みデバイス (DD-WRT を実行する Asus RT-AC68U ルーター) 用の小さな Hello World プログラムをクロスコンパイルしました。

# arm-linux-gnueabi-g++ hello.cpp -mcpu=cortex-a9 -s -o hello

ファイルは問題ないようです:

# file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.32, 
BuildID[sha1]=5099693c31154cdd7f04c16ced5b80b1e35e625b, stripped

いくつかのライブラリに依存します:

# readelf -d hello

Dynamic section at offset 0xf08 contains 26 entries:
Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]
(...)

ターゲット システムでファイルを実行しようとすると、次のようになります。

# ./hello
-sh: ./hello: not found

ld-linux.so.3他のパラメーターなしで実行を開始すると、すべてが機能します。

# /opt/lib/ld-linux.so.3 ./hello
Hello, world.

ライブラリを一覧表示すると、ファイルは /lib フォルダ内のライブラリを検索しているようです (そこにはありません。/opt/lib にあります)。

# /opt/lib/ld-linux.so.3 --list ./hello
    libstdc++.so.6 => /lib/libstdc++.so.6 (0x76dfb000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x76de0000)
    libc.so.6 => /opt/lib/libc.so.6 (0x76cb2000)
    libc.so => /lib/libc.so (0x76c35000)
    /lib/ld-linux.so.3 => /opt/lib/ld-linux.so.3 (0x76f20000)

エラーは、実行可能ファイルを単独で起動したときに必要な共有ライブラリが見つからないことが原因であると推測しています。必要なライブラリはすべて /opt/lib フォルダーにあり、このフォルダーは LD_LIBRARY_PATH 環境変数に含まれています。

# echo $LD_LIBRARY_PATH
/lib:/usr/lib:/jffs/lib:/jffs/usr/lib:/jffs/usr/local/lib
:/mmc/lib:/mmc/usr/lib:/opt/lib:/opt/usr/lib

適切な場所でライブラリを見つけるために実行可能ファイルを取得するにはどうすればよいですか?

編集:実行可能ファイルでライブラリを静的にリンクしようとしましたが、プログラムはターゲットプラットフォームで正常に動作します。しかし、それは私がやりたいことに対する実行可能な解決策ではありません。

4

1 に答える 1

5

ld-linux.so.3は標準外の場所 ( /opt/lib) にあるようgccです。別のプログラム インタープリターを指定している可能性があります。を使用readelf -l <program>して、バイナリが期待しているプログラム インタープリターを確認できます ( PT_INTERP「プログラム インタープリターの要求」の下)。

-Wl,--dynamic-linker=/opt/lib/ld-linux.so.3バイナリのプログラム インタープリターがお使いのプラットフォームに適していない場合は、 に渡すことで手動で指定できますgcc

于 2016-01-10T23:25:45.450 に答える