Linux动态库so收集工具


前言


    开发和部署过linux下c/c++程序的朋友会不会有这种感受,可执行文件依赖的动态库(.so)多了就很烦锁,特别是部署上线时,一般很先安装依赖(通过yum或者download原始编译安装),再找自己项目生成的文件copy到线上,最后就运行起来。其实如果开发环境和生产线上环境差别不大(内核版本一样)的话,就可以把程序所依赖的动态库一起copy过去放到ld能搜索到的目录就行了。 那我如何得知可执行文件依赖什么动态库呢,ldd命令不就可以吗,没错,我这里写了个小脚本就是做收集可执行文件的依赖动态库(so),脚本代码也简单,读者可往下查阅copy来用。

 

注意1:

有些系统的so要删掉,只挑选你自己需要的,如libstdc++.so.6 libm.so.6 libc.so.6 libgcc_s.so,.
因为新机器上也有,不删把人家的覆盖掉系统会出问题。


注意2:

当把收集到的so是常规文件,都不带符号链接的,所以放到新机器的ldconfig搜索到的目录后,要执行ldconfig(需要root),或者也可以用环境变量
LD_LIBRARY_PATH方式,这时有soname的库你得手动建立软链接。 加载动态库的流程不在此介绍了,可参考,大家也可自行查阅baidu、google。

运行:

像一般shell脚本那样运行即可,只需一个参数,就是你想收集的可执行文件(可以全路径或相对路径),输出目录就是多个.depend命令的目录。

 

#! /bin/sh

set -e
set -u

file=$1
depsos=`ldd $file | awk '{print $3}'| grep '/'`
dstpath="$file.depend"
tmpfile=''

if [ $# -gt 1 ]; then
    dstpath=$2
fi

if [ ! -e $dstpath ]; then
    mkdir -p $dstpath
fi

cnt=0
for lfi in $depsos; do
    if [ -f $lfi ]; then
        if [ -h $lfi ]; then
        #   echo "sambol file -> `readlink $lfi`"
            tmpfile=`readlink $lfi | xargs basename`
            cp $lfi $dstpath/$tmpfile
        else
        #   echo "$lfi common file"
            cp $lfi $dstpath
        fi
    else
        echo "$lfi isnot a file, error"
    fi

    cnt=$[$cnt+1]
done

echo "pack $cnt so to $dstpath"

 

/latefirstcmt/4