Linux 查看程序(动态库)、进程的依赖库的方法

这篇具有很好参考价值的文章主要介绍了Linux 查看程序(动态库)、进程的依赖库的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当我们在linux上部署自己开发的项目程序时,项目代码与依赖库完整拷贝过去之后,直接运行我们自己的可执行程序,往往提示找不到所相关的.so库,会报错。
系统只会去默认搜寻目录(/lib和/usr/lib)下, 以及动态库配置文件(/etc/ld.so.conf和/etc/ld.so.conf.d/*.conf)里所列的目录下, 搜索可共享的动态库(格式如lib*.so*), 进而创建出动态装入程序*(ld.so)*所需的连接和缓存文件。因此,需要我们手动将路径添加进去。

1. 利用ldd查看可执行程序(动态库)的依赖库

使用 ldd -r XXX 查询动态库的依赖。关于undefined symbol使用 C++filt 查看

[user@localhost dist]$ ldd /usr/bin/bash
        linux-vdso.so.1 =>  (0x00007ffdbe9e0000)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fa7da66c000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fa7da468000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fa7da09a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa7da896000)

[user@localhost ocr_server]$ ldd libgims.so
        linux-vdso.so.1 =>  (0x00007ffca0de1000)
        libopencv_imgproc.so.405 => /usr/local/lib64/libopencv_imgproc.so.405 (0x00007f6dbb5ce000)
        libopencv_core.so.405 => /usr/local/lib64/libopencv_core.so.405 (0x00007f6dba3df000)
        libopencv_imgcodecs.so.405 => /usr/local/lib64/libopencv_imgcodecs.so.405 (0x00007f6db9e57000)
        libonnxruntime.so.1.11.1 => /home/user/onnxruntime/lib/libonnxruntime.so.1.11.1 (0x00007f6db8fef000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f6db8ce7000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f6db89e5000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f6db87cf000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f6db8401000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6db81e5000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f6db7fe1000)
        libpng15.so.15 => /lib64/libpng15.so.15 (0x00007f6db7998000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6dbd551000)

[wangsp@localhost ocr_server]$ ldd libASL_gcn_label.so  `{部署到生产环境出现错误:not found}`
        linux-vdso.so.1 => not found  
        libopencv_imgproc.so.405 => not found
        libopencv_core.so.405 => not found
        libopencv_imgcodecs.so.405 => not found
        libonnxruntime.so.1.11.1 => not found
        libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007f1013e6a000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f1013b68000)
        libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007f1013950000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f1013582000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1013366000)
        libjpeg.so.62 => /lib64/libjpeg.so.62 (0x00007f1012aef000)
        libpng15.so.15 => /lib64/libpng15.so.15 (0x00007f10128c4000)
        libtiff.so.5 => /lib64/libtiff.so.5 (0x00007f1012650000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f101785f000)
        libjbig.so.2.0 => /lib64/libjbig.so.2.0 (0x00007f1012444000)

方法:

  1. /etc/ld.so.conf.d 目录下创建 XXX_server.conf 文件,将该软件依赖的库路径添加进去
    echo /home/user/Project/XXX_server/ > /etc/ld.so.conf.d/XXX_server.conf
    执行生效
    ldconfig

  2. 或者:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path
    或者:echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path/' >> ~/.bashrc

2. 利用pldd获取进程的内存映射信息,进程的依赖共享库

如下XXX即需要查询的程序名称
pldd $(ps -ef | grep XXX| grep -v grep | awk '{print $2}')

[user@localhost laun]$ sudo pldd $(ps -ef | grep XXX | grep -v grep | awk '{print $2}')
3172:   /home/user/laun/dist/XXX/XXX
linux-vdso.so.1
/lib64/libdl.so.2
/home/user/laun/dist/XXX/libz.so.1
/lib64/libpthread.so.0
/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2
/home/user/laun/dist/XXX/libpython3.6m.so.1.0
/lib64/libutil.so.1
/lib64/libm.so.6
/home/user/laun/dist/XXX/lib-dynload/_struct.cpython-36m-x86_64-linux-gnu.so
/home/user/laun/dist/XXX/lib-dynload/zlib.cpython-36m-x86_64-linux-gnu.so
...
/home/user/laun/dist/XXX/lib-dynload/_json.cpython-36m-x86_64-linux-gnu.so
/home/user/laun/dist/XXX/markupsafe/_speedups.cpython-36m-x86_64-linux-gnu.so
/home/user/laun/dist/XXX/lib-dynload/unicodedata.cpython-36m-x86_64-linux-gnu.so
./XXX/libgims.so
/usr/local/lib64/libopencv_imgproc.so.405
/usr/local/lib64/libopencv_core.so.405
/usr/local/lib64/libopencv_imgcodecs.so.405
/home/user/onnxruntime-linux-x64-1.11.1/lib/libonnxruntime.so.1.11.1
/lib64/libpng15.so.15
./XXX/libgmc.so
./XXX/libgcn_label.so
./XXX/libASL_gcn_label.so
./XXX/libiisis.so
./XXX/libit_dwmp.so
./XXX/libit_dwmp2.so
./XXX/liblgbm.so
/home/user/laun/dist/XXX/gevent/_gevent_c_imap.cpython-36m-x86_64-linux-gnu.so
/home/user/laun/dist/XXX/lib-dynload/_multiprocessing.cpython-36m-x86_64-linux-gnu.so

3. 利用pmap工具查询未知的可执行程序的依赖库

[user@localhost dist]$ objdump -p /usr/local/php/bin/php |grep NEEDED
  NEEDED               libcrypt.so.1
  NEEDED               librt.so.1
  NEEDED               libmysqlclient.so.18
  NEEDED               libmcrypt.so.4
  NEEDED               libiconv.so.2
  NEEDED               libcurl.so.4
  NEEDED               libm.so.6
  NEEDED               libdl.so.2
  NEEDED               libnsl.so.1
  NEEDED               libxml2.so.2
  NEEDED               libz.so.1
  NEEDED               libssl.so.10
  NEEDED               libcrypto.so.10
  NEEDED               libpthread.so.0
  NEEDED               libc.so.6
  NEEDED               libresolv.so.2

4. 利用pmap查看正在运行时的进程的依赖库

[user@localhost ~/software/pldd]$ ps -ef|grep php-fpm
root     26534     1  0  2014 ?        00:01:34 php-fpm: master process (/usr/local/php-5.3.29/etc/php-fpm.conf)
nobody   26535 26534  0  2014 ?        00:00:04 php-fpm: pool www          
nobody   26536 26534  0  2014 ?        00:00:05 php-fpm: pool www          
root     30510 30324  0 00:39 pts/0    00:00:00 grep php-fpm


[user@localhost ~/software/pldd]$ pmap 26534 |head 
26534:   php-fpm: master process (/usr/local/php-5.3.29/etc/php-fpm.conf)
0000000000400000  10452K r-x--  /usr/local/php-5.3.29/sbin/php-fpm
0000000001035000     76K rw---  /usr/local/php-5.3.29/sbin/php-fpm
0000000001048000    104K rw---    [ anon ]
0000000002a65000   3448K rw---    [ anon ]
000000311c600000    388K r-x--  /usr/lib64/libssl.so.1.0.1e
000000311c661000   2048K -----  /usr/lib64/libssl.so.1.0.1e
000000311c861000     16K r----  /usr/lib64/libssl.so.1.0.1e
000000311c865000     28K rw---  /usr/lib64/libssl.so.1.0.1e
000000311ce00000     92K r-x--  /lib64/libpthread-2.12.so

5. ln 命令

ln(link 其实link命令的缩写) 具体使用: ln [选项] 目标文件
选项有如下
-s 使用软连接
-b 删除,覆盖之前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-v 显示详细的处理过程

6. version GLIBCXX_3.4.20 not found 错误解决

参考:Linux 批量依赖库拷贝(ldd)
version GLIBCXX_3.4.20 not found 错误解决
libstdc++.so.6: version `GLIBCXX_3.4.21‘ not found

7. 使用dlopen加载动态库

https://www.cnblogs.com/0xzhang/p/14460925.html
https://www.cnblogs.com/Anker/p/3746802.html文章来源地址https://www.toymoban.com/news/detail-784064.html

到了这里,关于Linux 查看程序(动态库)、进程的依赖库的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux中查看占用端口的进程方法

    其中:95115是进程号,mysqld是进程名称 注意:-tlnp和-ltnp 其中:mysqld是进程名称,95115是进程id 其中:mysqld是进程,95115是进程id

    2024年04月10日
    浏览(36)
  • Linux系列之查看进程线程的方法

    在window系统查看系统进程,我们一般会使用 Ctrl+Shift+Esc 打开系统进程监控页面,但是在Linux系统查看进程一般使用 top 命令或者 ps 命令,但是如果要查看线程怎么查看?其实也可以使用这两个命令,所以本博客总结一下几种方法 ps命令 Linux的ps命令用于查看进程统计信息 常用

    2024年02月07日
    浏览(31)
  • Linux系统之查看进程监听端口方法

    在Linux系统中,,每个服务启动的时候都会通过一个端口来进行监听,所有端口都与OS中的进程ID或服务相关联。在日常的Linux系统运维中,我们有时需要某些特定服务的进程正在侦听哪个端口号。 netstat命令 用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络

    2024年02月02日
    浏览(26)
  • Linux 进程异常退出 如何查看日志

    当进程异常退出时,可以通过以下步骤来查看日志: 找到进程的 PID(进程 ID),可以通过 ps 命令来查看: 找到进程的日志文件,一般情况下,进程的日志文件都会被记录在 /var/log 目录下,可以使用 ls 命令来查看: 打开日志文件,可以使用 tail 命令来查看日志文件的最后几

    2024年02月16日
    浏览(31)
  • Linux当中如何隐藏和查看进程

    进程是执行程序的过程,类似于按照图纸,真正去盖房子的过程。 同一个程序可以执行多次,每次都可以在内存中开辟独立的空间来装载,从而产生多个进程。不同的进程还可以拥有各自独立的IO接口。操作系统的一个重要功能就是为进程提供方便,比如说为进程分配内存空

    2024年02月15日
    浏览(25)
  • linux 如何查看es进程,Linux---关闭Elasticsearch进程,并重新启动

    查看ES进程: 执行命令:ps -ef | grep elasticsearch 如果有elasticsearch进程,则会返回包含elasticsearch的进程信息,如下所示: 如果没有elasticsearch进程,则不会返回任何信息。 关闭ES进程: 执行命令:sudo systemctl stop elasticsearch 等待一段时间,直到ES进程完全停止。 重新启动

    2024年02月11日
    浏览(34)
  • Linux如何查看文件进程占用-lsof

    lsof命令是什么? 可以列出被进程所打开的文件的信息。被打开的文件可以是 1.普通的文件,2.目录  3.网络文件系统的文件,4.字符设备文件  5.(函数)共享库  6.管道,命名管道 7.符号链接 8.底层的socket字流,网络socket,unix域名socket 9.在linux里面,大部分的东西都是被当做文

    2024年02月12日
    浏览(23)
  • Linux查看进程端口号的几种方法

    lsof 是 linux 下的一个非常实用的系统级的监控、诊断工具。它的意思是 List Open Files,它可以用来列出被各种进程打开的文件信息,linux 下 “一切皆文件”。 这个命令可能系统里没有自带,需要先安装一下,CentOS系统的话安装也很简单,安装命令:yum install lsof ,然后一路y。

    2023年04月16日
    浏览(38)
  • Linux查看进程PID的方法(linux查进程的pid)附带自动kill 掉

    Linux查看进程PID的方法 Linux作为一款多用户、多任务的操作系统,可以同时处理多个任务,每个任务的执行都由进程来实现。在每个进程执行的过程中,都会有一个唯一标识符,即称为PID(Process Identifier)进程ID。Linux系统有很多命令用来查看进程PID,下面介绍几种常用的查看

    2024年02月01日
    浏览(78)
  • Linux下查看进程启动时间的方法及示例代码

    在Linux系统中,我们经常需要查看进程的启动时间,以便进行系统性能分析或调试。本文将介绍如何使用命令行工具和示例代码来准确获取进程的启动时间。 方法一:使用ps命令 ps命令是Linux中常用的进程查看工具,它提供了多种选项来获取进程的信息,包括启动时间。以下是

    2024年02月05日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包