1

Ubuntu 15.04を実行しているARM組み込みLinuxプラットフォームでクロスコンパイルしています。以前は、このプログラムの静的にリンクされたバージョンはうまくいきました。最近、私はlibproprietary(この質問のためにlibの名前が変更されました)にリンクする必要がありました。これは.soとしてしか利用できません。動的リンクされたARM実行可能ファイルを実行しているときに "そのようなファイルまたはディレクトリがありません"というエラーが発生しました

libproprietary.so works;私はそれに依存する別のプログラムを実行することができます。

$ uname -a 
Linux <hostname> 3.10.92-71 #1 SMP PREEMPT Fri Dec 18 00:38:54 BRST 2015 armv7l armv7l armv7l GNU/Linux 

問題:

私が試した何
$ ./myprogram 
-bash: ./myprogram: No such file or directory 

$ ldd ./myprogram 
libproprietary.so.2 => /usr/lib/libproprietary.so.2 (0xb6bbc000) 
librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0xb6ba6000) 
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6b92000) 
libusb-1.0.so.0 => /lib/arm-linux-gnueabihf/libusb-1.0.so.0 (0xb6b72000) 
libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0xb6ab8000) 
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6a43000) 
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6955000) 
/usr/lib/ld.so.1 => /lib/ld-linux-armhf.so.3 (0xb6f28000) 
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb692c000) 
libudev.so.1 => /lib/arm-linux-gnueabihf/libudev.so.1 (0xb690f000) 

$ file ./myprogram 
./myprogram: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=881d76b2ce20f32aef95796b4fee9f01e492a7d2, not stripped 
$ file /bin/ls 
/bin/ls: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=a687c2baf9963c62c6abd209863d360dd0863686, stripped 

$ readelf -l myprogram| grep interpreter 
    [Requesting program interpreter: /usr/lib/ld.so.1] 

$ strace ./myprogram 
execve("./myprogram", ["./myprogram"...], [/* 21 vars */]) = -1 ENOENT (No such file or directory) 
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory 
) = 40 
exit_group(1)       = ? 
+++ exited with 1 +++ 

$ ls -l myprogram 
-rwxrwxr-x [details snipped] 

$ file /usr/lib/libproprietary.so.<version> 
/usr/lib/libproprietary.so.<version>: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=d9b4ba3b9ec03779792984bc8a89ceede5737455, stripped 

通訳、/usr/lib/ld.so.1は、存在していないように見えます。私はそれが使用されているものの/ bin/LSに類似しているべきであることを推測するつもりだ:

$ readelf -l /bin/ls | grep interpreter 
    [Requesting program interpreter: /lib/ld-linux-armhf.so.3] 

私はしかし、私のリンク段階でこの問題を解決する方法がわかりません。

ccache arm-linux-gnueabihf-g++ -o myprogram -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -Wl,-no-undefined -pthread -Wl,-Bdynamic -lproprietary -Wl,-rpath-link=result/debug/lib -Wl,-rpath=\$ORIGIN/../../../../result/debug/lib variant-dir/debug/core-.o -Lresult/debug/lib -Wl,-Bstatic -l<other libs> 

Iは、コアの.o単語の後-Wl、-Bdynamic -lproprietaryを移動してみましたが、それは何も変更しませんでした。

答えて

0

インタプリタ/usr/lib/ld.so.1は存在しないようです。私は/ bin/lsが使用しているものと似ているはずだと推測します:

正しいです。リンク時に-Wl,--dynamic-linker=/lib/ld-linux-armhf.so.3フラグを付けて通訳を変更することができます。

しかし、

  • あなたのツールチェーンは、(プログラムはおそらくクラッシュします。その場合には)あなたが実際にインストールされているものからlibcの異なるバージョンをターゲットにすることができます。
  • libcをターゲットにしての場合、ツールチェインが誤って設定されています。
+0

これをチェックしてツールチェーンを正しく設定する方法は知っていますか?または私は何を見上げるべきであることを指摘しますか? – amo

+0

私はあなたが示唆したとおりにインタプリタを変更しましたが、あなたが予測したように、プログラムはすぐにallocate_stackのアサーションでクラッシュします。 – amo

関連する問題

 関連する問題