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カーネルに何か追加が必要なのでしょうか。
コメント
takada
高田です。
田村様、ご回答いただきありがとうございました。
ご指摘の内容を確認しました。
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
同じディレクトリにライブラリファイルをおいて実行しましたが、結果は変わりませんでした。
以上、よろしくお願いします。
takada
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 があること確認してください。
※TestHook.so があれば ../lib/TestHook.so と表示されます。
> ATDE5上で通常のコンパイル(g++)をしたライブラリではlddの結果は次のように表示されました。
lddはご存知の通り、どの共有ライブラリをロードする必要があるのか、
どのバージョンを使用するのかを表示してくれます。
しかし、プログラム内でdlopen()を使用し
ダイナミックロードを行うライブラリファイル(TestHook.so)については 表示されません。
> ダイナミックロードの方法に誤りがあるのでしょうか。
ダイナミックロードの方法に誤りがあるかどうかを切り分けるために、
実行ファイル(linux_dyload_test)と同じディレクトリに、
ライブラリファイル(TestHook.so)を配置しプログラムを実行してみてください。
> それとも、Linuxカーネルに何か追加が必要なのでしょうか。
こちらでdlopen()を使用したダイナミックロードを試したところ、
問題なく出来ましたので、Linuxカーネルに追加の設定は必要ありません。