Linux下如何在不更改系统的glibc库的同时运行需要与系统glibc库不同版本的程序?

Sunday, March 12, 2023
本文共726字
2分钟阅读时长
pwn

⚠️本文是作者P3troL1er原创,首发于https://peterliuzhi.top/tricks/linux%E4%B8%8B%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%8D%E6%9B%B4%E6%94%B9%E7%B3%BB%E7%BB%9F%E7%9A%84glibc%E5%BA%93%E7%9A%84%E5%90%8C%E6%97%B6%E8%BF%90%E8%A1%8C%E9%9C%80%E8%A6%81%E4%B8%8E%E7%B3%BB%E7%BB%9Fglibc%E5%BA%93%E4%B8%8D%E5%90%8C%E7%89%88%E6%9C%AC%E7%9A%84%E7%A8%8B%E5%BA%8F/。商业转载请联系作者获得授权,非商业转载请注明出处!

There are things so deep and complex that only intuition can reach it in our stage of development as human beings. — John Astin

注:本文介绍的是一种暂时运行的方法,不会更改系统默认的库版本,如果需要升级系统库版本,可以参阅Ubuntu18.04升级安装GLIBC2.29 - 知乎

编译安装glibc

我这里以glibc2.29为例,我们可以先下载glibc2.29的源码:

wget http://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz

其他版本的源码的下载链接可以在Index of /gnu/glibc找到

然后解压,建立build文件夹并进去:

tar -zxf glibc-2.29.tar.gz
cd glibc-2.29
mkdir build
cd build/

然后我们在配置之前,先下载一些需要用到的工具:

sudo apt-get install make gawk bison -y

然后进行配置,这里我们选择一个目录设置为library生成的路径,我这里设置为了$HOME/uselib/

../configure --prefix=$HOME/uselib/ --disable-sanity-checks
# 一般如果系统没有提示GNU的问题的话,直接运行这个就可以 ../configure --prefix=/usr/local,如果有提示GNU问题,会弹出提示是否在命令中加入--disable-sanity-checks参数。当然上面的命令已经包含了--disable-sanity-checks,所以,括号中的内容就当废话看好了,只是贴出来方便遇到问题的人

然后就开始构建了:

make -j18 && make install

构建完的库在$HOME/uselib/lib下

如何运行程序?

假设我们的程序名是example,那么我们可以这样运行程序:

$HOME/uselib/lib/ld-2.29.so --library-path $HOME/uselib/lib/:/usr/lib/x86_64-linux-gnu/:/lib/x86_64-linux-gnu/ ./example

其中–library-path后面跟着的是<你下载的库的路径>:<程序用到的所有库的路径>

我们可以使用ldd命令来查看程序用到的库:

ldd example

这个命令的基本原理就是,链接器既是一个共享对象,也是一个可执行程序,系统将程序入口设置在链接器的入口,然后链接器加载需要的动态库,再将入口设置在程序的入口。因此我们可以通过链接器指定需要的库,然后运行程序。