Linux 批量依赖库拷贝(ldd)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介:

标签

PostgreSQL , Linux , ldd , 库依赖


背景

如何将程序依赖的动态库拷贝到指定的目录?

例子

1、通过LDD查看依赖的动态库。

# ldd postgres  
        linux-vdso.so.1 =>  (0x00007ffcfc324000)  
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb6151ba000)  
        libxml2.so.2 => /lib64/libxml2.so.2 (0x00007fb614e4f000)  
        libpam.so.0 => /lib64/libpam.so.0 (0x00007fb614c40000)  
        libssl.so.10 => /lib64/libssl.so.10 (0x00007fb6149ce000)  
        libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fb61456c000)  
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fb61431f000)  
        librt.so.1 => /lib64/librt.so.1 (0x00007fb614117000)  
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fb613f12000)  
        libm.so.6 => /lib64/libm.so.6 (0x00007fb613c10000)  
        libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007fb6139bc000)  
        libicui18n.so.50 => /lib64/libicui18n.so.50 (0x00007fb6135bc000)  
        libicuuc.so.50 => /lib64/libicuuc.so.50 (0x00007fb613243000)  
        libsystemd.so.0 => /lib64/libsystemd.so.0 (0x00007fb61321b000)  
        libc.so.6 => /lib64/libc.so.6 (0x00007fb612e59000)  
        /lib64/ld-linux-x86-64.so.2 (0x00007fb6153e1000)  
        libz.so.1 => /lib64/libz.so.1 (0x00007fb612c43000)  
        liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fb612a1d000)  
        libaudit.so.1 => /lib64/libaudit.so.1 (0x00007fb6127f4000)  
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fb61250c000)  
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fb612308000)  
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fb6120d4000)  
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fb611ec6000)  
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fb611cc2000)  
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fb611aa7000)  
        liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007fb611898000)  
        libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007fb61167b000)  
        libssl3.so => /lib64/libssl3.so (0x00007fb61142e000)  
        libsmime3.so => /lib64/libsmime3.so (0x00007fb611207000)  
        libnss3.so => /lib64/libnss3.so (0x00007fb610edd000)  
        libnssutil3.so => /lib64/libnssutil3.so (0x00007fb610caf000)  
        libplds4.so => /lib64/libplds4.so (0x00007fb610aab000)  
        libplc4.so => /lib64/libplc4.so (0x00007fb6108a6000)  
        libnspr4.so => /lib64/libnspr4.so (0x00007fb610667000)  
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fb61035f000)  
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fb610149000)  
        libicudata.so.50 => /lib64/libicudata.so.50 (0x00007fb60eb74000)  
        libcap.so.2 => /lib64/libcap.so.2 (0x00007fb60e96f000)  
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb60e748000)  
        libgcrypt.so.11 => /lib64/libgcrypt.so.11 (0x00007fb60e4c6000)  
        libgpg-error.so.0 => /lib64/libgpg-error.so.0 (0x00007fb60e2c1000)  
        libdw.so.1 => /lib64/libdw.so.1 (0x00007fb60e079000)  
        libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00007fb60de72000)  
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fb60dc3b000)  
        libattr.so.1 => /lib64/libattr.so.1 (0x00007fb60da35000)  
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fb60d7d3000)  
        libelf.so.1 => /lib64/libelf.so.1 (0x00007fb60d5bb000)  
        libbz2.so.1 => /lib64/libbz2.so.1 (0x00007fb60d3aa000)  
        libfreebl3.so => /lib64/libfreebl3.so (0x00007fb60d1a7000)  

2、写一个SHELL脚本,自动拷贝依赖的动态库。

vi test.sh  
  
deplist=$( ldd $1 | awk '{if (match($3,"/")){ print $3}}' )  
cp -L -n $deplist $2   
-L 表示拷贝文件(如果是软链,会拷贝到最终的文件)。  
-n 表示不覆盖已有文件。  

3、创建目标目录。

mkdir /tmp/lib  

4、将postgres依赖的动态库拷贝到目标目录

. ./test.sh /usr/pgsql-10/bin/postgres /tmp/lib/  
ll /tmp/lib  
  
total 39332  
-rwxr-xr-x 1 root root    19888 Oct 25 13:01 libattr.so.1  
-rwxr-xr-x 1 root root   122936 Oct 25 13:01 libaudit.so.1  
-rwxr-xr-x 1 root root    68192 Oct 25 13:01 libbz2.so.1  
-rwxr-xr-x 1 root root    23968 Oct 25 13:01 libcap-ng.so.0  
-rwxr-xr-x 1 root root    20024 Oct 25 13:01 libcap.so.2  
-rwxr-xr-x 1 root root    15848 Oct 25 13:01 libcom_err.so.2  
-rwxr-xr-x 1 root root  2512448 Oct 25 13:01 libcrypto.so.10  
-rwxr-xr-x 1 root root    41080 Oct 25 13:01 libcrypt.so.1  
-rwxr-xr-x 1 root root  2118128 Oct 25 13:01 libc.so.6  
-rwxr-xr-x 1 root root    19776 Oct 25 13:01 libdl.so.2  
-rwxr-xr-x 1 root root   301576 Oct 25 13:01 libdw.so.1  
-rwxr-xr-x 1 root root    99952 Oct 25 13:01 libelf.so.1  
-rwxr-xr-x 1 root root    11384 Oct 25 13:01 libfreebl3.so  
-rwxr-xr-x 1 root root    88720 Oct 25 13:01 libgcc_s.so.1  
-rwxr-xr-x 1 root root   535064 Oct 25 13:01 libgcrypt.so.11  
-rwxr-xr-x 1 root root    19384 Oct 25 13:01 libgpg-error.so.0  
-rwxr-xr-x 1 root root   320768 Oct 25 13:01 libgssapi_krb5.so.2  
-rwxr-xr-x 1 root root 20789896 Oct 25 13:01 libicudata.so.50  
-rwxr-xr-x 1 root root  2096056 Oct 25 13:01 libicui18n.so.50  
-rwxr-xr-x 1 root root  1539392 Oct 25 13:01 libicuuc.so.50  
-rwxr-xr-x 1 root root   210768 Oct 25 13:01 libk5crypto.so.3  
-rwxr-xr-x 1 root root    15688 Oct 25 13:01 libkeyutils.so.1  
-rwxr-xr-x 1 root root   963504 Oct 25 13:01 libkrb5.so.3  
-rwxr-xr-x 1 root root    58728 Oct 25 13:01 libkrb5support.so.0  
-rwxr-xr-x 1 root root    61888 Oct 25 13:01 liblber-2.4.so.2  
-rwxr-xr-x 1 root root   348400 Oct 25 13:01 libldap-2.4.so.2  
-rwxr-xr-x 1 root root   157424 Oct 25 13:01 liblzma.so.5  
-rwxr-xr-x 1 root root  1141928 Oct 25 13:01 libm.so.6  
-rwxr-xr-x 1 root root   251784 Oct 25 13:01 libnspr4.so  
-rwxr-xr-x 1 root root  1236800 Oct 25 13:01 libnss3.so  
-rwxr-xr-x 1 root root   186216 Oct 25 13:01 libnssutil3.so  
-rwxr-xr-x 1 root root    61672 Oct 25 13:01 libpam.so.0  
-rwxr-xr-x 1 root root   402384 Oct 25 13:01 libpcre.so.1  
-rwxr-xr-x 1 root root    20048 Oct 25 13:01 libplc4.so  
-rwxr-xr-x 1 root root    15744 Oct 25 13:01 libplds4.so  
-rwxr-xr-x 1 root root   143944 Oct 25 13:01 libpthread.so.0  
-rwxr-xr-x 1 root root   111080 Oct 25 13:01 libresolv.so.2  
-rwxr-xr-x 1 root root    44448 Oct 25 13:01 librt.so.1  
-rwxr-xr-x 1 root root   121328 Oct 25 13:01 libsasl2.so.3  
-rwxr-xr-x 1 root root   155744 Oct 25 13:01 libselinux.so.1  
-rwxr-xr-x 1 root root   164040 Oct 25 13:01 libsmime3.so  
-rwxr-xr-x 1 root root   315072 Oct 25 13:01 libssl3.so  
-rwxr-xr-x 1 root root   470336 Oct 25 13:01 libssl.so.10  
-rwxr-xr-x 1 root root   995840 Oct 25 13:01 libstdc++.so.6  
-rwxr-xr-x 1 root root   162552 Oct 25 13:01 libsystemd.so.0  
-rwxr-xr-x 1 root root  1509376 Oct 25 13:01 libxml2.so.2  
-rwxr-xr-x 1 root root    90664 Oct 25 13:01 libz.so.1  
目录
相关文章
|
1天前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
|
4月前
|
安全 Linux vr&ar
Linux的动态库和静态库
Linux的动态库和静态库
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
108 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
4月前
|
Linux 开发工具
linux下使用gcp拷贝数据的时候显示进度条
linux下使用gcp拷贝数据的时候显示进度条
31 2
|
4月前
|
安全 Linux 开发者
Linux笔记之ldd命令详解
`ldd`命令是Linux环境下一个非常实用的工具,用于显示一个程序运行时所需的共享库依赖。它帮助开发者和系统管理员快速诊断程序运行问题,特别是在处理"找不到库文件"或者"错误的库文件版本"等错误时。然而,出于安全的考虑,对于不信任的可执行文件,应该慎用 `ldd`命令,可以考虑使用其他工具如 `objdump`。总的来说,懂得如何妥善且安全地使用 `ldd`,对于维护一个稳定和高效的Linux系统来说,是非常重要的。
94 9
|
3月前
|
安全 Linux
Linux中ldd命令的依赖复制技巧
`ldd`命令的依赖复制技巧在特定的场合下非常有用,但它也需要细心的处理和充分的测试,以确保在新环境中的稳定运行。此外,这种做法虽然方便,但在长期维护和安全更新方面可能会带来额外的负担。
114 0
|
4月前
|
Linux API
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
|
4月前
|
缓存 安全 Linux
本地YUM源大揭秘:搭建您自己的Linux软件宝库,从此告别网络依赖!一文掌握服务器自给自足的终极技能!
【8月更文挑战第13天】在Linux中,YUM是一款强大的软件包管理工具,可自动处理依赖关系。为适应离线或特定安全需求,本指南教你搭建本地YUM源。首先创建存放软件包的`localrepo`目录,复制`.rpm`文件至其中。接着,安装并运用`createrepo`生成仓库元数据。随后配置新的`.repo`文件指向该目录,并禁用GPG检查。最后,清理并重建YUM缓存,即可启用本地YUM源进行软件搜索与安装,适用于网络受限环境。
286 3
|
5月前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
166 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
4月前
|
Linux 网络安全 API
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?