我们有一个基于 Borland Kylix C++ 构建的应用程序。该应用程序仍在使用中,我们维护了一个安装了 Kylix IDE 的 Red Hat 9 虚拟机以继续其开发。我们知道它已经很老了,但有一段时间这是我们的选择。
在 Fedora 21 之前,我们可以毫无问题地运行这个应用程序,但是在这个新版本中,我们的库无法加载,导致分段错误错误。
那是简单地加载库的测试程序:
#include <stdio.h>
#include <dlfcn.h>
void main()
{
int *p = dlopen("libX.so", RTLD_NOW);
if (p == NULL)
{
printf("Erro = %s\n", dlerror());
}
}
libX.so 是用 Kylix C++ 构建的。执行时发生错误dlopen
。我们不需要加载方法或执行方法来获取错误。使用 strace 分析错误,我们得到:
open("i686/sse2/libborunwind.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("i686/libborunwind.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("sse2/libborunwind.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("libborunwind.so", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P\21\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=27125, ...}) = 0
close(3) = 0
mprotect(0xb7170000, 4096, PROT_READ) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0xb85fbad4} ---
+++ killed by SIGSEGV (core dumped) +++
这libborunwind.so
是一个 Kylix 运行时库,所以我们没有源代码来查看发生了什么。似乎旧的 Kylix 库与 Fedora 21(libc 等)的新库不兼容。
有没有办法在最近的 Linux 发行版中运行旧的编译代码?