我有一台 64 位 Ubuntu Linux 机器。最近我收到了一个旧的编译二进制文件,它曾经在一台旧的、退役的服务器上运行,我认为它是 2007 年的 Redhat 发行版。
正如您所预料的,二进制文件由于库不兼容而无法工作。二进制文件很烂,而且不是为了可移植。但我仍然只能使用二进制文件,并且需要运行它。所以我的问题变成了如何处理(痛苦的)问题:弄清楚二进制文件需要什么库,找到这些库,并强制程序使用它们。这样做的正确策略是什么?
我将给你我的二进制文件的具体示例,它运行但立即失败并显示错误消息
datab2txt: relocation error: /lib64/libnss_files.so.2: symbol __rawmemchr, version GLIBC_2.2.5 not defined in file libc.so.6 with link time reference
我对诊断此问题的策略很感兴趣,因为我希望如果我解决了这个问题(通过找到旧版本的 glibc??),可能会有更多的库需要解决。
解决这个问题的最佳策略是什么?我猜我需要确定所需的库(如何?),找到它们,然后强制程序使用它们(如何?覆盖 LD_LIBRARY_PATH ?)
谢谢!
编辑:使用ldd datab2txt
会出现错误not a dynamic executable
。呃……那是什么意思?
此外,我运行文件并得到:
% file datab2txt
datab2txt: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.4.0, not stripped
答案1
使用 可以识别库ldd
。找到它们是另一个问题,但请尝试在 上搜索packages.ubuntu.com
较旧的 Ubuntu 版本。然后,您需要手动解压软件包并将共享对象安装到它们自己的专用目录(或目录树,如果需要)中,并使用LD_LIBRARY_PATH
指向它们。(注意:使用apt-get
或dpkg
不起作用,如果您尝试强制解决问题,可能会破坏您的系统。千万不要这样做。)
答案2
你很幸运,有一个命令可以找出二进制文件需要哪些库,以及预期的版本:
ldd -v /path/to/binary
答案3
理论上,使用chroot应该可以解决运行软件的问题 - 其设计用途之一是运行不受支持的、具有不受支持的 ABI 的旧软件 - 您可能需要旧盒子来复制所需的库,或者自己查找和编译必要的库。
答案4
您有一个静态二进制文件。一般来说,这意味着所有库都是编译好的,并且二进制文件没有外部依赖项。但是,如果程序使用 NSS 库 (libnss),则会出现例外情况。
从https://gcc.gnu.org/ml/gcc/1998-12/msg00083.html:
{AJ} 如果没有共享库,NSS(有关详细信息,请键入“info libc“Name Service Switch”)将无法正常工作。NSS 允许使用不同的服务(例如 NIS、文件、db、hesiod),只需更改一个配置文件(/etc/nsswitch.conf),而无需重新链接任何程序。唯一的缺点是现在静态库需要访问共享库。这由 GNU C 库透明地处理。
如果程序使用 NSS 并且您尝试对其进行静态编译,您将看到以下警告
> gcc t.c -Wall -static -o hostname -DWITH_NSS
/tmp/cco4Lcky.o: In function `main':
t.c:(.text+0x66): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
如果您只有二进制文件,我不确定是否有简单的方法可以解决这个问题。当然,您可以找到带有较旧 glibc 的 Linux 发行版。