Ubuntu下如何查找所有依赖库。

软件和网站开发以及相关技术探讨
回复
飞翔的薄荷
帖子: 30
注册时间: 2011-12-08 22:46

Ubuntu下如何查找所有依赖库。

#1

帖子 飞翔的薄荷 » 2023-08-11 12:07

自己在Ubuntu 22.04上编译了程序,现场环境是20.04。
如何在不重新编译的情况下运行?
(程序设置了-rpath当前可执行文件目录)。
头像
astolia
论坛版主
帖子: 6452
注册时间: 2008-09-18 13:11

Re: Ubuntu下如何查找所有依赖库。

#2

帖子 astolia » 2023-08-11 12:12

查看依赖的动态链接库,不包含用dlopen动态加载的

代码: 全选

ldd 程序
飞翔的薄荷
帖子: 30
注册时间: 2011-12-08 22:46

Re: Ubuntu下如何查找所有依赖库。

#3

帖子 飞翔的薄荷 » 2023-08-11 19:13

astolia 写了: 2023-08-11 12:12 查看依赖的动态链接库,不包含用dlopen动态加载的

代码: 全选

ldd 程序
版主大大你好,我将所有依赖库拷贝到当前可执行文件./lib路径后,ldd查看有些库任然到/lib/aarch64-linux-gnu下面去找是什么原因呢?

代码: 全选

ldd xxx
	linux-vdso.so.1 (0x0000ffffa38a9000)
	libzmq.so.5 => /root/vs/PositionSever/out/install/Linux-GCC-Release/./lib/libzmq.so.5 (0x0000ffffa212a000)
	libsqlite3.so.0 => /root/vs/PositionSever/out/install/Linux-GCC-Release/./lib/libsqlite3.so.0 (0x0000ffffa1ff7000)
	libmysqlcppconn8.so.2 => /root/vs/PositionSever/out/install/Linux-GCC-Release/./lib/libmysqlcppconn8.so.2 (0x0000ffffa1c7b000)
	libpthread.so.0 => /root/vs/PositionSever/out/install/Linux-GCC-Release/./lib/libpthread.so.0 (0x0000ffffa1c4a000)
	libstdc++.so.6 => /root/vs/PositionSever/out/install/Linux-GCC-Release/./lib/libstdc++.so.6 (0x0000ffffa1a65000)
	libm.so.6 => /root/vs/PositionSever/out/install/Linux-GCC-Release/./lib/libm.so.6 (0x0000ffffa19ba000)
	libgcc_s.so.1 => /root/vs/PositionSever/out/install/Linux-GCC-Release/./lib/libgcc_s.so.1 (0x0000ffffa1996000)
	libc.so.6 => /root/vs/PositionSever/out/install/Linux-GCC-Release/./lib/libc.so.6 (0x0000ffffa1823000)
	/lib/ld-linux-aarch64.so.1 (0x0000ffffa3879000)
	libsodium.so.23 => /lib/aarch64-linux-gnu/libsodium.so.23 (0x0000ffffa17db000)
	libpgm-5.2.so.0 => /lib/aarch64-linux-gnu/libpgm-5.2.so.0 (0x0000ffffa177e000)
	libnorm.so.1 => /lib/aarch64-linux-gnu/libnorm.so.1 (0x0000ffffa161d000)
	libgssapi_krb5.so.2 => /lib/aarch64-linux-gnu/libgssapi_krb5.so.2 (0x0000ffffa15c5000)
	libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000ffffa15b1000)
	libssl.so.1.1 => /root/vs/PositionSever/out/install/Linux-GCC-Release/./lib/libssl.so.1.1 (0x0000ffffa1517000)
	libcrypto.so.1.1 => /root/vs/PositionSever/out/install/Linux-GCC-Release/./lib/libcrypto.so.1.1 (0x0000ffffa1288000)
	libresolv.so.2 => /root/vs/PositionSever/out/install/Linux-GCC-Release/./lib/libresolv.so.2 (0x0000ffffa1262000)
	libkrb5.so.3 => /lib/aarch64-linux-gnu/libkrb5.so.3 (0x0000ffffa117c000)
	libk5crypto.so.3 => /lib/aarch64-linux-gnu/libk5crypto.so.3 (0x0000ffffa113f000)
	libcom_err.so.2 => /lib/aarch64-linux-gnu/libcom_err.so.2 (0x0000ffffa112b000)
	libkrb5support.so.0 => /lib/aarch64-linux-gnu/libkrb5support.so.0 (0x0000ffffa110e000)
	libkeyutils.so.1 => /lib/aarch64-linux-gnu/libkeyutils.so.1 (0x0000ffffa10f9000)
root@dc171f7d1b86:~/vs/PositionSever/out/install/Linux-GCC-Release# ll ./lib | grep libkrb5.so.3
-rw-r--r-- 1 root root    876592 8月  11 17:30 libkrb5.so.3
比如:ll ./lib | grep libkrb5.so.3 显示可以找到libkrb5.so.3 。但是ldd显示任然连接到/lib/aarch64-linux-gnu/libkrb5.so.3
飞翔的薄荷
帖子: 30
注册时间: 2011-12-08 22:46

Re: Ubuntu下如何查找所有依赖库。

#4

帖子 飞翔的薄荷 » 2023-08-11 20:14

代码: 全选

root@ccd67d575472:/home/root# ./xxx
./PositionSever: error while loading shared libraries: libsodium.so.23: cannot open shared object file: No such file or directory
root@ccd67d575472:/home/root# ldd xxx
	linux-vdso.so.1 (0x0000ffff91236000)
	libzmq.so.5 => /home/root/./lib/libzmq.so.5 (0x0000ffff8fab7000)
	libsqlite3.so.0 => /home/root/./lib/libsqlite3.so.0 (0x0000ffff8f984000)
	libmysqlcppconn8.so.2 => /home/root/./lib/libmysqlcppconn8.so.2 (0x0000ffff8f608000)
	libpthread.so.0 => /home/root/./lib/libpthread.so.0 (0x0000ffff8f5d7000)
	libstdc++.so.6 => /home/root/./lib/libstdc++.so.6 (0x0000ffff8f3f2000)
	libm.so.6 => /home/root/./lib/libm.so.6 (0x0000ffff8f347000)
	libgcc_s.so.1 => /home/root/./lib/libgcc_s.so.1 (0x0000ffff8f323000)
	libc.so.6 => /home/root/./lib/libc.so.6 (0x0000ffff8f1b0000)
	/lib/ld-linux-aarch64.so.1 (0x0000ffff91206000)
	libsodium.so.23 => not found
	libpgm-5.2.so.0 => not found
	libnorm.so.1 => not found
	libgssapi_krb5.so.2 => not found
	libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000ffff8f19c000)
	libssl.so.1.1 => /home/root/./lib/libssl.so.1.1 (0x0000ffff8f102000)
	libcrypto.so.1.1 => /home/root/./lib/libcrypto.so.1.1 (0x0000ffff8ee73000)
	libresolv.so.2 => /home/root/./lib/libresolv.so.2 (0x0000ffff8ee4d000)
root@ccd67d575472:/home/root#
拷贝到新环境后,这几个文件果然找不到
libsodium.so.23 => not found
libpgm-5.2.so.0 => not found
libnorm.so.1 => not found
libgssapi_krb5.so.2 => not found

但其实一直是有的,不知道为啥找不到。

代码: 全选

root@ccd67d575472:/home/root# ll ./lib | grep  libsodium.so.23
-rw-r--r-- 1 root root    227504 Aug 11 09:30 libsodium.so.23
头像
astolia
论坛版主
帖子: 6452
注册时间: 2008-09-18 13:11

Re: Ubuntu下如何查找所有依赖库。

#5

帖子 astolia » 2023-08-12 11:13

飞翔的薄荷 写了: 2023-08-11 20:14
拷贝到新环境后,这几个文件果然找不到
libsodium.so.23 => not found
libpgm-5.2.so.0 => not found
libnorm.so.1 => not found
libgssapi_krb5.so.2 => not found

但其实一直是有的,不知道为啥找不到。

代码: 全选

root@ccd67d575472:/home/root# ll ./lib | grep  libsodium.so.23
-rw-r--r-- 1 root root    227504 Aug 11 09:30 libsodium.so.23

代码: 全选

LD_DEBUG=files,libs ldd xxxx
去看具体的搜索过程

设置一下LD_LIBRARY_PATH环境变量为/home/root/lib,大不了用LD_PRELOAD来强行加载
飞翔的薄荷
帖子: 30
注册时间: 2011-12-08 22:46

Re: Ubuntu下如何查找所有依赖库。

#6

帖子 飞翔的薄荷 » 2023-08-14 11:59

astolia 写了: 2023-08-12 11:13

代码: 全选

LD_DEBUG=files,libs ldd xxxx
去看具体的搜索过程
设置一下LD_LIBRARY_PATH环境变量为/home/root/lib,大不了用LD_PRELOAD来强行加载
用了LD_DEBUG看到,可执行文件依赖的库,去找了当前目录lib下。比如mysql库libmysqlcppconn8.so:

代码: 全选

     18:     file=libmysqlcppconn8.so.2 [0];  needed by ./PositionSever [0]
        18:     find library=libmysqlcppconn8.so.2 [0]; searching
        18:      search path=/home/root/.:/home/root/./lib              (RUNPATH from file ./PositionSever)
        18:       trying file=/home/root/./libmysqlcppconn8.so.2
        18:       trying file=/home/root/./lib/libmysqlcppconn8.so.2
        18:
        18:     file=libmysqlcppconn8.so.2 [0];  generating link map
        18:       dynamic: 0x0000ffff8eb85010  base: 0x0000ffff8e811000   size: 0x000000000037bc20
        18:         entry: 0x0000ffff8e88a620  phdr: 0x0000ffff8e811040  phnum:                  8
        18:
然后非可执行文件的依赖的库就不再搜索当前目录lib下了,比如libpgm-5.2.so.0:

代码: 全选

        18:     file=libpgm-5.2.so.0 [0];  needed by /home/root/./lib/libzmq.so.5 [0]
        18:     find library=libpgm-5.2.so.0 [0]; searching
        18:      search cache=/etc/ld.so.cache
        18:      search path=/lib/aarch64-linux-gnu:/usr/lib/aarch64-linux-gnu:/lib:/usr/lib            (system search path)
        18:       trying file=/lib/aarch64-linux-gnu/libpgm-5.2.so.0
        18:       trying file=/usr/lib/aarch64-linux-gnu/libpgm-5.2.so.0
        18:       trying file=/lib/libpgm-5.2.so.0
        18:       trying file=/usr/lib/libpgm-5.2.so.0
也就是,设置可执行文件的RPATH不能对依赖库的依赖库起作用。 :Hehe
目前的方案只能:export LD_LIBRARY_PATH=/home/root/./lib么?
头像
gulshan212
帖子: 8
注册时间: 2022-12-30 14:04
系统: Windows 10
来自: Haldwani, Uttarakhand (India)
联系:

find all dependent libraries in Ubuntu

#7

帖子 gulshan212 » 2023-10-01 0:50

Well, you can use 1dd command to find all dependent libraries in Ubuntu and you can do it by following way.

ldd /path/to/myprogram

Thanks
回复