linux - 共享库如何在 64 位/32 位混合系统中工作?

标签 linux 64-bit shared-libraries

早上好

在 64 位 RedHat 机器上,我们必须编译并运行 32 位应用程序。同时,我设法编译了所需的 gcc 版本 (4.0.3) 和所有必需的 32 位运行时库,并将 LD_LIBRARY_PATH 设置为指向 32 位版本,但现在在剩余的构建过程中,需要执行一个小的 java 程序,它作为 64 位程序安装在/usr/bin 中,它现在首先找到 32 位版本的 libgcc_s.so。

一般来说,如果我将 LD_LIBRARY_PATH 设置为 32 位版本,我会破坏 64 位程序,反之亦然。

这应该如何工作?我确定我不是第一个遇到这个问题的人。一般是怎么解决的?

问候, 斯特凡

最佳答案

将 32 位和 64 位目录添加到 LD_LIBRARY_PATH。

如果您这样做,则 32 位或 64 位的 ld.so 将使用正确的库。

例如一个 32 位测试应用程序“test32”和 64 位测试应用程序“test”,在用户 homedir 中具有本地安装的 gcc 和 binutils 的(较新版本)副本,以避免破坏 gcc 的系统范围安装:

=> export LD_LIBRARY_PATH=/home/user1/pub/gcc+binutils/lib:/home/user1/pub/gcc+binutils/lib64

=> ldd ./test32
    libstdc++.so.6 => /home/user1/pub/gcc+binutils/lib/libstdc++.so.6 (0x00111000)
    libgcc_s.so.1 => /home/user1/pub/gcc+binutils/lib/libgcc_s.so.1 (0x00221000)

=> ldd ./test
    libstdc++.so.6 => /home/user1/pub/gcc+binutils/lib64/libstdc++.so.6 (0x00007ffff7cfc000)
    libgcc_s.so.1 => /home/user1/pub/gcc+binutils/lib64/libgcc_s.so.1 (0x00007ffff7ad2000)

(删除了不太有趣的库路径)

这表明加载器知道忽略错误架构的库,至少在这个 Scientific Linux 6.3(RHEL 派生的)系统上是这样。我希望其他发行版也能以类似方式工作,但尚未对此进行测试。

然而,这可能比您的(未指定的)发行版最近才开始出现这种情况。

关于linux - 共享库如何在 64 位/32 位混合系统中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1706328/

相关文章:

javascript - Node.js hubot 在服务器上执行命令

linux - 尝试连接到 iSCSI 驱动器时来自 iscsiadm 的错误消息

c# - CLR 检测到 Entity Framework 的无效程序

c++ - 为什么 .so 文件总是小于 .a 文件?(来源相同。)

c++ - 在 Ubuntu 中定位 Boost 库

r - 如何在 R 包命名空间文件中正确使用 useDynLib()

linux - 使用不同的 IRQ 处理程序在 PCI 驱动程序中启用多个 MSI

c - 当子进程执行带有 setuid 位设置的 execve 时,fork() 中的文件描述符

Hadoop 安装 + 启用虚拟化 64 位 CPU

delphi - 字节绝对字符串数组:为64位Windows编译时内容不正确