小编Ser*_*yov的帖子

如何在现代 GNU/Linux 发行版上运行旧的二进制文件?

我正在尝试在现代 GNU/Linux 发行版(Gentoo Linux)上运行一个在 CentOS 6 上编译的旧 C++ 程序。现在CentOS 6和建议的库都已经过时,因此有必要为二进制文件提供工作环境。

我已经尝试使用命令ldd和一些脚本从 CentOS 6 复制二进制文件所需的所有必需的共享库。现在我有一个包含所有必需库的目录。但是,当我尝试使用 LD_LIBRARY_PATH="带有 .so 文件的目录"运行程序时,终端显示一条消息

$ LD_LIBRARY_PATH=`pwd`/lib ./my-program
Inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_libc_early_init: Assertion `sym != NULL' failed!
Run Code Online (Sandbox Code Playgroud)

所以它出于某种原因不想工作。如果没有强制链接到旧的 .so,二进制文件也不会运行(显然)。我没有时间在现代 Linux 上重新编译我的程序或制作它的静态版本,因为它需要旧的库,并且该程序必须在我不维护的几台 PC 上运行。

有没有一种可靠的方法可以在没有容器或虚拟机的情况下在现代 Linux 上运行旧的二进制文件?也许我走在正确的道路上,但需要解决一些问题,或者我走在错误的道路上,需要尝试其他事情。

如果您阅读到此行,感谢您的关注!

我附上所需库的列表( 的输出ldd my-program):

linux-vdso.so.1 =>  (0x00007ffc26b40000)
librfftw.so.2 => /usr/lib64/librfftw.so.2 (0x00007f026f631000)
libfftw.so.2 => /usr/lib64/libfftw.so.2 (0x00007f026f3f8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f026f1f4000)
libboost_thread-mt.so.5 => /usr/lib64/libboost_thread-mt.so.5 (0x00007f026efdf000)
libboost_system-mt.so.5 => /usr/lib64/libboost_system-mt.so.5 (0x00007f026eddc000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f026ebbf000)
libxml++-2.6.so.2 => /usr/lib64/libxml++-2.6.so.2 (0x00007f026e99c000) …
Run Code Online (Sandbox Code Playgroud)

c++ linux shared-libraries ld ldd

8
推荐指数
1
解决办法
7798
查看次数

标签 统计

c++ ×1

ld ×1

ldd ×1

linux ×1

shared-libraries ×1