为什么我不能PRELOAD我自己的libc.so.6来运行动态可执行文件

问题描述 投票:0回答:1

我试图运行动态可执行文件(xxx)但我收到以下错误:

$ ./xxx
./xxx: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./xxx)
./xxx: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by ./xxx)

作为2.12版本系统中的libc,对于我的二进制文件来说太旧了。

我已经复制了libc的2.27版,它可以使用这个特定的二进制文件。如果我尝试使用LD_PRELOAD运行它:

$ LD_PRELOAD="./libc.so.6" ./xxx
ERROR: ld.so: object './libc.so.6' from LD_PRELOAD cannot be preloaded: ignored.
./xxx: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./xxx)
./xxx: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by ./xxx)

该系统是RedHat 6服务器:

$ uname -a
Linux platinum 2.6.32-754.3.5.el6.x86_64 #1 SMP Thu Aug 9 11:56:22 EDT 2018 x86_64 GNU/Linux

相反的步骤在我的Ubuntu 18.10机器上工作。为什么我无法扩展我自己的libc?另外,为什么不能ld.so提供更全面的解释为什么我的libc无法预加载?

我可能会补充说以下失败:

$ /lib64/ld-linux-x86-64.so.2 ./libc.so.6 
Segmentation fault (core dumped)

所以我猜我正在使用的二进制文件可能与RedHat内核不兼容。

linker-errors
1个回答
0
投票

我能够找到解决方案,但它需要在RedHat服务器上编译GLIBC 2.17。我将发布我使用的说明,以防这对其他人有用: $ cd /tmp $ wget https://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz $ tar xzvf glibc-2.17.tar.gz $ mkdir build-glibc $ cd build-glibc $ ../glibc-2.17/configure --disable-sanity-checks $ make $ cd - $ cp /tmp/build-glibc/libc.so /tmp/build-glibc/elf/ld-linux-x86-64.so.2 . $ LD_PRELOAD="./libc.so:/lib64/libpthread.so.0:/lib64/libkrb5.so.3:/lib64/libk5crypto.so.3:/lib64/libdl.so.2:/lib64/libm.so.6:/lib64/libcom_err.so.2:/lib64/libkrb5support.so.0:/lib64/libkeyutils.so.1:/lib64/libresolv.so.2:/lib64/libselinux.so.1" ./ld-linux-x86-64.so.2 ./xxx

我还必须使用新的动态加载器,因为旧的动态加载器与GLIBC 2.17不兼容: $ LD_PRELOAD="./libc.so" ./xxx ./xxx: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument

© www.soinside.com 2019 - 2024. All rights reserved.