Armadilloフォーラム

Armadillo-810上でのダイナミックロード

takada

2014年9月17日 18時39分

ATDE5にてクロスコンパイル(arm-linux-gnueabi-g++)したオブジェクトをSDカードにコピーして、Armadillo-810にマウントしてオブジェクトを次のように実行しました。

$ ./linux_dyload_test ../lib/TestHook.so

linux_dyload_testはダイナミックロードを行う実行ファイルで、TestHook.soがダイナミックリンクライブラリです。
しかし、実行した結果は次のように表示されました。

ldopen(../lib/TestHook.so): ../lib/TestHook.so: cannot open shared object file: No such file or directory

『FAQ : 「cannot open shared object file: No such file or directory」と表示されます』によると、lddにて依存しているライブラリの確認をするとありますが、Armadillo-810上ではlddはnot foundとなってしまいます。

ATDE5上で通常のコンパイル(g++)をしたライブラリではlddの結果は次のように表示されました。

$ ldd TextHook.so
linux-gate.so.1 => (0xb774a000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb7632000)
libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb760c000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb75ee000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb75d5000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb7472000)
/lib/ld-linux.so.2 (0xb774b000)

ダイナミックロードの方法に誤りがあるのでしょうか。
それとも、Linuxカーネルに何か追加が必要なのでしょうか。

コメント

at_shota.tamura

2014年9月18日 17時30分

田村です。

> しかし、実行した結果は次のように表示されました。
> ldopen(../lib/TestHook.so): ../lib/TestHook.so: cannot open shared object file: No such file or directory

このエラーは TestHook.so が存在しない場合に発生します。
../lib/ は相対パスですが、実行ファイル(linux_dyload_test)からの相対パスではなく、
カレントディレクトリからの相対パスです。

linux_dyload_testを実行したディレクトリで、
以下のコマンドを実行し TestHook.so があること確認してください。

$ ls ../lib/TestHook.so

※TestHook.so があれば ../lib/TestHook.so と表示されます。

> ATDE5上で通常のコンパイル(g++)をしたライブラリではlddの結果は次のように表示されました。

lddはご存知の通り、どの共有ライブラリをロードする必要があるのか、
どのバージョンを使用するのかを表示してくれます。
しかし、プログラム内でdlopen()を使用し
ダイナミックロードを行うライブラリファイル(TestHook.so)については 表示されません。

> ダイナミックロードの方法に誤りがあるのでしょうか。

ダイナミックロードの方法に誤りがあるかどうかを切り分けるために、
実行ファイル(linux_dyload_test)と同じディレクトリに、
ライブラリファイル(TestHook.so)を配置しプログラムを実行してみてください。

$ ls
linux_dyload_test TestHook.so
$ ./linux_dyload_test ./TestHook.so

> それとも、Linuxカーネルに何か追加が必要なのでしょうか。

こちらでdlopen()を使用したダイナミックロードを試したところ、
問題なく出来ましたので、Linuxカーネルに追加の設定は必要ありません。

高田です。

田村様、ご回答いただきありがとうございました。

ご指摘の内容を確認しました。

 linux_dyload_testを実行したディレクトリで、
 以下のコマンドを実行し TestHook.so があること確認してください。
 
 $ ls ../lib/TestHook.so
 
 ※TestHook.so があれば ../lib/TestHook.so と表示されます。

lsコマンドを実施しましたが、../lib/TestHook.so と表示されました。

 ダイナミックロードの方法に誤りがあるかどうかを切り分けるために、
 実行ファイル(linux_dyload_test)と同じディレクトリに、
 ライブラリファイル(TestHook.so)を配置しプログラムを実行してみてください。
 $ ls
 linux_dyload_test TestHook.so
 $ ./linux_dyload_test ./TestHook.so

同じディレクトリにライブラリファイルをおいて実行しましたが、結果は変わりませんでした。

以上、よろしくお願いします。

高田です。

本件が解決しました。
ビルド時に使用するコマンドを"arm-linux-gnueabi-g++"から"arm-linux-gnueabihf-g++"に変更したところ、ダイナミックロードが行えることを確認しました。
大変お手数をおかけ致しました。