linux - 旧版链接器(使用 libc5)在 Linux 内核 2.6.25 上失败

标签 linux linker legacy glibc libc

我们有一个使用 libc5 的旧链接器,由于多种因素,我们只有二进制文件,没有源代码。是的,版本控制可以让我们摆脱当前的问题……现在我们的完整工具链和产品线都在使用版本控制,但是这匹特殊的马早已不复存在了。

此链接器适用于 Linux 内核 2.6.24,但在 2.6.25(和 2.6.26)上它失败并显示消息

    Virtual memory exceeded in `new'

我们在相应的旧版编译器上也遇到了类似的问题,但在某些 stackoverflow.com answers 上却遇到了类似的问题。大量研究发现,编译器问题是由Linux内核2.6.25中的“brk随机化”引起的。解决方法是设置 sysctl 变量和环境变量:

    /proc/sys/kernel/randomize_va_space = 0 or 1
    setenv MALLOC_TOP_PAD_ 536870912

但是,这对链接器没有帮助。

我通过使用“ldd”发现链接器具有更多共享库依赖项(编译器只有 libc.so.5):

    libg++.so.27 => /usr/lib/libg++.so.27 (0xb7eca000)
    libstdc++.so.27 => /usr/lib/libstdc++.so.27 (0xb7e99000)
    libm.so.5 => /lib/libm.so.5 (0xb7e90000)
    libc.so.5 => /lib/libc.so.5 (0xb7dd3000)

而且我了解到我可能必须安装 libg++.so.27 的 libc5 版本。我犹豫是否要这样做,因为我不知道这是否会覆盖最新的 libg++.so.27 并导致非 libc5 应用程序出现问题。

那么,我是否找到并安装 libg++.so.27 的 libc5 版本,或者是否有更好的方法来禁用 brk 随机化,或者内核 2.6.24 和 2.6.25 之间是否存在导致链接器的另一个差异有问题吗?

编辑

参见this了解这次搜索的所有细节以及我的最终解决方案。

最佳答案

它并没有准确回答你的问题,但在你的情况下,我会使用已知可用的 libc + libstdc++ 组合创建一个 chroot,甚至是 kernel+libc+libstdc++ (在这种情况下你需要一个虚拟机,明显地)。这样,您就可以相对轻松地尝试一些事情,而不会干扰其他任何事情。

与旧库兼容的最好方法是使用这个旧库,毕竟,由于它“只是”一个工具链问题,所以使用某种 jail /chroot/虚拟机不应该太多有问题吗?

关于linux - 旧版链接器(使用 libc5)在 Linux 内核 2.6.25 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/795510/

相关文章:

C# SendKey 到 MS-DOS 应用程序

database - 在新数据库设计的同时维护数据库遗留表数据

authentication - PHP 网站中的 Facebook 集成

linux - 为 OpenBTS 设置开发环境

objective-c - Objective-C 是否编译为 native 代码或字节码?

c++ - GDB:如何在调试期间检查当前行号

c++ - 从构建库切换到 exe 或 dll 时出现 Unresolved external symbol 错误

c++ - GCC/Linux : adding a static library to a . 所以?

linux - 在 Linux 或 OSX 上将程序与 gcc 链接时,如何确定使用 -l 时如何调用它

linux - gdb - 如何找到堆栈框架的当前模块