PatchELF
对于时常在服务器上跑程序或安装程序的朋友,不可防止的会遇到一些问题。文章源自微观生活(93wg.com)微观生活-https://93wg.com/14571.html
其中最多见的问题就是,像下面这样文章源自微观生活(93wg.com)微观生活-https://93wg.com/14571.html
version `GLIBC_2.23&文章源自微观生活(93wg.com)微观生活-https://93wg.com/14571.html
那呈现这类问题该如何办呢?文章源自微观生活(93wg.com)微观生活-https://93wg.com/14571.html
经常使用解决方案文章源自微观生活(93wg.com)微观生活-https://93wg.com/14571.html
针对这一问题,网上搜寻的谜底大部份都是分为下列几步文章源自微观生活(93wg.com)微观生活-https://93wg.com/14571.html
安装高版本的 glibc文章源自微观生活(93wg.com)微观生活-https://93wg.com/14571.html
显然,没有这个库,固然先要在环境中安装这个库才行,比如我要安装 glibc-2.23文章源自微观生活(93wg.com)微观生活-https://93wg.com/14571.html
下载文章源自微观生活(93wg.com)微观生活-https://93wg.com/14571.html
http://ftp.gnu.org/gnu/libc/文章源自微观生活(93wg.com)微观生活-https://93wg.com/14571.html
选择对应的版本并下载,如 libc-2.23.tar.gz
解压
nbsp;tar-zxfglibc-2.23.tar.gz
生成配置文件
nbsp;cdglibc-2.23nbsp;mkdirbuild&&cdbuildnbsp;../configure--prefix=LIB_DIR
可以用 --prefix=LIB_DIR,LIB_DIR 为你要将 glib 安装到的路径
通常非 root 用户权限没法安装到默许的 /usr/local 目录下,需要自己手动指定
安装
nbsp;makenbsp;makeinstall
等会吧,这个安装还蛮久的。来杯咖啡,静等安装胜利就行。
问题:
如果在 ../configure 这一步呈现了问题,比如我呈现 ld 版本过低的过错
***Thesecriticalprogramsaremissingortooold:asld
也不用着急,再安装个较高版本的 binutils 就行。
这个如何安装?相似上面的 1-4 步从新来一遍就行。一般像这类 C 库的安装进程都是这样的,挺简单的,只是通常抛出的异样是不简单的 (•̩̩̩̩_•̩̩̩̩)。
配置环境
安装完成后,大多数的谜底都是将下面的命令添加到 ~/.bashrc 文件中
exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:yourglibcpath
然后,执行
source~/.bashrc
然而这又会引入另外一个问题更严重的问题。
glibc 是 Linux 系统中最底层的 API,几近其他所有的库都会依赖它。
因而当你更新了较高版本的 glibc 时,底层的库依赖的还是低版本的 glibc 库,因而可能会致使系统的严重故障。
我当初就是信了这些鬼话,添加到了环境变量中,致使几近所有的命令都没法使用。运行命令或脚本也会呈现
Segmentationfault
最后的解决方法就是将 ~/.bashrc 文件中的
exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:yourglibcpath
删除了以后,才恢复原状。
那怎么解决呢,一种办法就是每一次运行以前,在终端临时将 glibc 的路径添加到 LD_LIBRARY_PATH 变量中,然而这无比麻烦。
下面,咱们介绍一款神器
PatchELF
PatchELF 是一个用于修改现有 ELF 可执行文件以及库的简单实用程序
ELF: 可执行与可链接格式(Executable and Linkable Format),常被称为 ELF 格式。
既然它能够更改可执行文件,那么咱们就能够直接将可执行文件需要加载的 glibc 库的路径修改成咱们刚才安装的路径。
这样就能够在既不需要添加环境变量,也不需要手动加载临时变量的情况下使用。
下面,咱们先安装这个工具
1. 安装
下载
https://github.com/dxsbiocc/patchelf
先从 GitHub 上下载源码
配置环境
./bootstrap.sh./configure
安装
makemakecheckmakeinstall2. 使用
「查看参数」
nbsp;patchelfsyntax:patchelf[--set-interpreterFILENAME][--page-sizeSIZE][--print-interpreter][--print-soname]Prints&
patchelf 的主要功能与动态库解析器、RPATH 和动态库有关。
「使用方式」
更改可执行文件的动态库解析器
nbsp;patchelf--set-interpreter/lib/my-ld-linux.so.2my-program
更改可执行文件以及库的RPATH
nbsp;patchelf--set-rpath/opt/my-libs/lib:/other-libsmy-program
收缩可执行文件以及库的RPATH
nbsp;patchelf--shrink-rpathmy-program
该命令会删除了可执行文件中所有不包括 DT_NEEDED 字段指定的库的路径。
例如:
一个可执行文件引用一个库 libfoo.so,它的 RPATH 是 /lib:/usr/lib:/foo/lib,而 libfoo.so 只能在 /foo/lib 中找到,那么新的 RPATH 将是 /foo/lib
其中 RPATH 指定的是可执行文件的动态链接库的搜寻路径
删除了动态库上声明的依赖项(DT_NEEDED),可屡次使用
nbsp;patchelf--remove-neededlibfoo.so.1my-program
添加动态库上声明的依赖项(DT_NEEDED),可屡次使用
nbsp;patchelf--add-neededlibfoo.so.1my-program
替代动态库声明的依赖项(DT_NEEDED),可屡次使用
nbsp;patchelf--replace-neededliboriginal.so.1libreplacement.so.1my-program
更改动态库的 SONAME
nbsp;patchelf--set-sonamelibnewname.so.3.4.5path/to/libmylibrary.so.1.2.3
「示例」
我有一个 msi 分析的可执行文件 msisensor-blood
在终端执行时,呈现过错
nbsp;./msisensor-blood./msisensor-blood:/lib64/libm.so.6:version`GLIBC_2.23&
glibc-2.15 的 libc.so.6 库
glibc-2.23 的 libm.so.6 库
首先, 咱们用 ldd 命令列出其动态库依赖关系
./msisensor-blood:/lib64/libm.so.6:version`GLIBC_2.23&
libm.so.6=>/lib64/libm.so.6...libc.so.6=>/lib64/libc.so.6
改换 libm.so.6 的路径
patchelf--replace-neededlibm.so.6/home/dengxs/software/glibc-2.23/lib/libm.so.6msisensor-blood
改换 libc.so.6 的路径
patchelf--replace-neededlibc.so.6/share/software/glibc/2.15/lib/libc.so.6msisensor-blood
再看下动态库列表
nbsp;lddmsisensor-bloodlinux-vdso.so.1=>(0x00007ffde0199000)libz.so.1=>/home/dengxs/software/zlib-1.2.11/lib/libz.so.1(0x00007f6a786df000)libpthread.so.0=>/lib64/libpthread.so.0(0x00000033dee00000)libstdc++.so.6=>/home/dengxs/software/anaconda3/lib/libstdc++.so.6(0x00007f6a78552000)/home/dengxs/software/glibc-2.23/lib/libm.so.6(0x00007f6a7844b000)libgomp.so.1=>/home/dengxs/software/anaconda3/lib/libgomp.so.1(0x00007f6a7841d000)libgcc_s.so.1=>/home/dengxs/software/anaconda3/lib/libgcc_s.so.1(0x00007f6a78409000)/share/software/glibc/2.15/lib/libc.so.6(0x00007f6a78062000)/lib64/ld-linux-x86-64.so.2(0x00000033dde00000)librt.so.1=>/lib64/librt.so.1(0x00000033df200000)libdl.so.2=>/lib64/libdl.so.2(0x00000033dea00000)
OK,已经替代胜利了
接下去看看能不能直接运行
nbsp;./msisensor-bloodProgram:msisensor-blood(homopolymerandmiscrosateliteanalysisusingcfDNAbamfiles)Version:v0.1Author:BeifangNiu&&KaiYeUsage:msisensor-blood<co妹妹and>[options]Keyco妹妹ands:scanscanhomopolymersandmiscrosatelitesmsimsiscoring
没问题,一切顺利。(^∀^)ノシ
以上就是微观生活(93wg.com)关于“找不到动态链接库?”的详细内容,希望对大家有所帮助!
评论