Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

lddコマンドで実行ファイルの依存ライブラリをしらべる

CやC++で作ったプロジェクトだとsoファイルを読む込む関係から、lddコマンドという子を使って依存関係を調べる事ができます。

実際のところ

$ ./example_walk
./example_walk: error while loading shared libraries: liblcm.so.1: cannot open shared object file: No such file or directory

ためしにlddコマンドをみると、確かにliblcm.so.1がリンクしていません。

$ ldd example_walk
        linux-vdso.so.1 (0x00007fffc2fb7000)
        libunitree_legged_sdk_amd64.so => /home/shuzo/unitree_legged_sdk/lib/libunitree_legged_sdk_amd64.so (0x00007f9700b30000)
        liblcm.so.1 => not found
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9700940000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9700920000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9700720000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f97005d1000)

PATHに通せばと思ったものの、上手くいかず。
ビルドしてるプロジェクトのlibフォルダに直接ブチ込むという荒治療。

$ cp ~/lcm-1.4.0/build/lcm/liblcm.so.1 ~/unitree_legged_sdk/lib/

$ ldd example_walk
        linux-vdso.so.1 (0x00007fffd51ce000)
        libunitree_legged_sdk_amd64.so => /home/shuzo/unitree_legged_sdk/lib/libunitree_legged_sdk_amd64.so (0x00007fdf4d1f0000)
        liblcm.so.1 => /home/shuzo/unitree_legged_sdk/lib/liblcm.so.1 (0x00007fdf4d1d0000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fdf4cfe0000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fdf4cfc0000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdf4cdc0000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdf4cc71000)
        libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fdf4cb30000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdf4cb0d000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fdf4d416000)
        libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fdf4ca90000)

終わった後改めて調べたところ、lddの”標準的な場所”は以下の順で解決されるとのこと
‐ LD_LIBRARY_PATH (a.out プログラムでは LD_AOUT_LIBRARY_PATH)

  • キャッシュファイル /etc/ld.so.cache
  • デフォルトパスである /usr/lib、 次いで /lib。

今回の場合、liblcm.so.1 はLD_LIBRARY_PATHないし/usr/libに置けばよかったみたい。

参考もと