早上好
在 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/