找不到动态链接库?

小微 科技找不到动态链接库?已关闭评论86字数 3860阅读模式
摘要PatchELF前言对于经常在服务器上跑程序或安装程序的朋友,不可避免的会遇到一些问题。其中至多见的问题就是,像下面这样version `GLIBC_2.23 not foundv...

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)关于“找不到动态链接库?”的详细内容,希望对大家有所帮助!

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/14571.html