[openrtm-users 03029] Re: LD_LIBRARY_PATHについて

Masaki Murooka murooka @ jsk.t.u-tokyo.ac.jp
2014年 5月 2日 (金) 20:23:17 JST


原様,安藤様


室岡と申します.
ご返答ありがとうございます.


実行結果を追加して説明させていただきます.
OpenRTM初心者ですので,間違い等ございましたら是非ご指摘ください.


hrpsys-baseをROSから使っておりまして[1],
ROS標準の起動スクリプトファイルの中でrtcdや各コンポーネントを起動しています.
A,Bの具体的なファイル名はAはRobotHardware.so,BはlibhrpIo.soとなっています

[1] https://github.com/start-jsk/hrpsys


RobotHardware.soはlibhrpIo.soをダイナミックリンクしています.
複数のlibhrpIo.soというファイルがあるのですが,
こちらの都合でrpathを使わずに特定のlibhrpIo.soにリンクさせたいという状況です.

/home/murooka/catkin_ws/ws_rtmros_common/devel/lib/libhrpIo.so
(以降,libhrpIo.so<bad>)
/home/murooka/catkin_ws/ws_rtmros_gazebo/src/rtm-ros-robotics/rtmros_gazebo/hrpsys_gazebo_general/lib/libhrpIo.so(以降,libhrpIo.so<good>)
というファイルがあって,
RobotHardware.soをlibhrpIo.so<good>にリンクさせようとしています.
RobotHardware.soにrpathを設定していない状況で,
LD_LIBRARY_PATHの先頭にlibhrpIo.so<good>を含むディレクトリのパスを追加しています.
ldd RobotHardware.so では,libhrpIo.so<good>をリンクしているという結果が得られるのですが,
ROS起動スクリプトから起動するとlibhrpIo.so<bad>をリンクしてしまいます.




ログファイルを2つ添付させて頂きましたが,
roslaunch-ros-default-log-20140502.log は,ROS起動時に自動生成されるログファイル,
rtmlaunch-terminal-output-with-strace-20140502.log
はターミナル出力でstraceを付けたrtcdの出力が含まれています.


roslaunch-ros-default-log-20140502.log 内に出力される実行時のLID_LIBRARY_PATHは以下のようになっており,
libhrpIo.so<good>を含むディレクトリが先頭に指定されています.

'LD_LIBRARY_PATH':
'/home/murooka/catkin_ws/ws_rtmros_gazebo/src/rtm-ros-robotics/rtmros_gazebo/hrpsys_gazebo_general/lib/:/home/murooka/catkin_ws/ws_jsk_roseus/src/jsk-ros-pkg/jsk_roseus/euslisp/jskeus/eus/Linux64/bin:/usr/lib/gazebo-2.2/plugins:/home/murooka/catkin_ws/ws_rtmros_gazebo/devel/lib:/home/murooka/catkin_ws/ws_rtmros_tutorials/devel/lib:/home/murooka/catkin_ws/ws_rtmros_common/devel/lib:/home/murooka/catkin_ws/ws_jsk_control/devel/lib:/home/murooka/catkin_ws/ws_jsk_pr2eus/devel/lib:/home/murooka/catkin_ws/ws_jsk_recognition/devel/lib:/home/murooka/catkin_ws/ws_jsk_model_tools/devel/lib:/home/murooka/catkin_ws/ws_jsk_roseus/devel/lib:/home/murooka/catkin_ws/ws_jsk_common/devel/lib:/opt/ros/hydro/lib:/home/murooka/catkin_ws/ws_jsk_roseus/src/jsk-ros-pkg/jsk_roseus/euslisp/jskeus/eus/Linux64/bin:/usr/lib/gazebo-2.2/plugins:/home/murooka/catkin_ws/ws_jsk_roseus/src/jsk-ros-pkg/jsk_roseus/euslisp/jskeus/eus/Linux64/bin:/usr/lib/gazebo-2.2/plugins:/home/murooka/catkin_ws/ws_rtmros_gazebo/src/rtm-ros-robotics/rtmros_gazebo/hrpsys_gazebo_general/plugins:/home/murooka/catkin_ws/ws_rtmros_gazebo/src/rtm-ros-robotics/rtmros_gazebo/hrpsys_gazebo_general/plugins:/home/murooka/catkin_ws/ws_rtmros_gazebo/src/rtm-ros-robotics/rtmros_gazebo/hrpsys_gazebo_general/plugins'


rtmlaunch-terminal-output-with-strace-20140502.log の最後の方で
RobotHardware.soをlddしており,
以下のようにlibhrpIo.so<good>をリンクしています.

ldd /home/murooka/catkin_ws/ws_rtmros_common/src/rtm-ros-robotics/openrtm_common/hrpsys/lib/RobotHardware.so
libhrpIo.so => /home/murooka/catkin_ws/ws_rtmros_gazebo/src/rtm-ros-robotics/rtmros_gazebo/hrpsys_gazebo_general/lib/libhrpIo.so
(0x00007f0727a6b000)

また,rtmlaunch-terminal-output-with-strace-20140502.log の最後の方で
RobotHardware.soにrpathが無いことを確認しています.

chrpath /home/murooka/catkin_ws/ws_rtmros_common/src/rtm-ros-robotics/openrtm_common/hrpsys/lib/RobotHardware.so
/home/murooka/catkin_ws/ws_rtmros_common/src/rtm-ros-robotics/openrtm_common/hrpsys/lib/RobotHardware.so:
no rpath or runpath tag found.

ただ,rtmlaunch-terminal-output-with-strace-20140502.logの前半にある
起動時のstarceのログでは
以下のようにlibhrpIo.so<bad>がopenされてしまています.

open("/home/murooka/catkin_ws/ws_rtmros_common/devel/lib/libhrpIo.so",
O_RDONLY|O_CLOEXEC) = 14




このような結果から
openrtmコンポーネントの動的リンクのためにdlopenする際に
LD_LIBRARY_PATHが反映されていないorうわ書かれているのではないかと
考えて質問させて頂きました.


以上,長文になってしまい恐縮ですが,
よろしくお願い致します.


2014年5月2日 1:17 Ando Noriaki <n-ando @ aist.go.jp>:
> 室岡様
>
> 安藤です
>
> rtcd内の動的リンクライブラリのロードにはLinuxではdlopenを
> 使っているだけですので,LD_LIBRARY_PATHは効くと思います。
> ソースをざっと見まわしてみても特に変わったことはしていないようでした。
>
> $ ldd A.so
> $ ldd B.so
>
> の結果を教えていただけますか?
>
> A.so をリンクするとき -lB はつけてますでしょうか?
>
>
>
> 2014年4月30日 22:08 Masaki Murooka <murooka @ jsk.t.u-tokyo.ac.jp>:
>> 室岡です
>>
>> rtcdを使ってAというディレクトリにあるA.soというコンポーネントを
>> manager.modules.preload:A.so
>> manager.modules.load_path:A
>> というオプションをつかってで読み込んでいるのですが,
>> sh 1: rtcprof: not found
>> というエラーがでています.
>> A.soはBというディレクトリにあるB.soというライブラリに依存しており,
>> manager.modules.load_path:B,A
>> としてみたり,
>> export LD_LIBRARY_PATH=A:B
>> しても同じ状況です.
>> ただ,
>> manager.modules.preload:B.so,A.so
>> とすると,ちゃんとB.soが読み込まれています.
>>
>> rtcdで使う.soの読み込み時にはLD_LIBRARY_PATHは見ないのでしょうか?
>>
>> --
>> =========================
>> 室岡雅樹(Masaki Murooka)
>> 東京大学大学院 情報理工学系研究科 知能機械情報学専攻
>> 稲葉・岡田研究室(情報システム工学研究室)
>> murooka @ jsk.t.u-tokyo.ac.jp
>> _______________________________________________
>> openrtm-users mailing list
>> openrtm-users @ openrtm.org
>> http://www.openrtm.org/mailman/listinfo/openrtm-users
> _______________________________________________
> openrtm-users mailing list
> openrtm-users @ openrtm.org
> http://www.openrtm.org/mailman/listinfo/openrtm-users



-- 
=========================
室岡雅樹(Masaki Murooka)
東京大学大学院 情報理工学系研究科 知能機械情報学専攻
稲葉・岡田研究室(情報システム工学研究室)
murooka @ jsk.t.u-tokyo.ac.jp
-------------- next part --------------
$B%F%-%9%H7A<00J30$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
$B%U%!%$%kL>(B: rtmlaunch-terminal-output-with-strace-20140502.log
$B7?(B:         text/x-log
$B%5%$%:(B:     164290 $B%P%$%H(B
$B @ bL@(B:       $BL5$7(B
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20140502/a89cafba/attachment.bin>
-------------- next part --------------
$B%F%-%9%H7A<00J30$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
$B%U%!%$%kL>(B: roslaunch-ros-default-log-20140502.log
$B7?(B:         text/x-log
$B%5%$%:(B:     450844 $B%P%$%H(B
$B @ bL@(B:       $BL5$7(B
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20140502/a89cafba/attachment-0001.bin>


More information about the openrtm-users mailing list