运行不同glibc版本的文件

在实际运行程序时,经常会遇到一个问题,电脑上安装的glibc版本不符合要求,由于glibc是最底层的库,不可能重新编译glibc,这样会导致系统崩溃。
所以,怎么解决这个问题就很有必要了。

已知程序的源码

这时,便可以通过指定动态链接库文件,重新编译文件来解决。
例如:gcc test.c -o test -Wl,--rpath=/path/to/newglibc,--dynamic-linker=/path/to/newglibc/ld-linux.so.2

没有源码

可以使用patchelf这个工具,修改程序的动态链接库位置
例如:patchelf --set-interpreter /path/to/newglibc/ld-linux.so.2 --set-rpath /path/to/newglibc/ test
比如我对silent文件执行了上述操作,查看其动态链接库文件的位置,发现已经指向了自己定义的位置。

1
2
3
4
pur3uit@pur3uit:~/ctf$ ldd silent 
linux-vdso.so.1 (0x00007ffeb060f000)
libc.so.6 => /home/pur3uit/build/build-2.25/libc.so.6 (0x00007fb0dd9cc000)
/home/pur3uit/build/build-2.25/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fb0ddd69000)

参考链接

在一个系统中安装运行多个版本的Glibc-原理篇