2009-11-10 69 views
15

早上好,共享库如何在混合64位/ 32位系统中工作?

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

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

它应该如何工作?我确信我不是第一个遇到这个问题的人。它通常如何解决?

问候, 斯特凡

+0

你用什么来维护你的构建? makefile? – 2009-11-10 08:14:39

+0

是的,Makefiles。 – struppi 2009-11-10 09:34:44

回答

2

作为一种变通方法,包裹Java调用在一个小的shell脚本unset小号LD_LIBRARY_PATH,然后调用可执行文件。或者,这也可能工作:

LD_LIBRARY_PATH= java... 

请注意“=”和可执行文件的名称之间的空格。

+0

感谢您的想法,它可能会在这种特殊情况下工作。然而,我正在寻找一种更通用的方法,它不需要更改机器上的构建脚本。 – struppi 2009-11-10 09:38:24

+0

是的;我不确定自动拾音器是如何工作的。我建议安装一个32位应用程序并在其上运行“ldd”。如果选择了这些库,那么它必须在/etc/ld.conf和ldconfig中发生一些奇迹:http://linux.die.net/man/8/ldconfig – 2009-11-10 10:20:07

3

在Solaris上,可以使用LD_LIBRARY32_PATHLD_LIBRARY64_PATH,但在Linux上不支持。

在一般情况下,你应该永远需要设置LD_LIBRARY_PATH都摆在首位:

  • 要么安装所需的库到 /usr/lib32/usr/lib64作为 适当,或
  • 建立自己的32与-Wl,-rpath=/path/to/32-bit/libs
+0

是不是只是'LD_LIBRARY_PATH','' Solaris上的LD_LIBRARY_PATH_32'和'LD_LIBRARY_PATH_64'? – maxschlepzig 2015-12-21 16:15:05

0

刚刚设置LD_LIBRARY_PATH两个路径(使用冒号分隔)。链接器将忽略它无法读取的库。

+0

这很好,但 - 至少在我的环境中 - 它似乎没有工作。装载机确实抱怨;它并不是简单地跳过那些不符合比特位的库。可悲! – struppi 2009-11-13 20:23:08

+0

这很奇怪,你能描述一下事情是如何失败的吗?另外,也许发布'ldd'的输出? – 2009-11-13 21:01:49

0

当重新安装运行64位内核的32位tinycore64系统时,我遇到了同样的问题。

经过大量搜索,我发现为什么这些评论对他们俩都有意义。 。

“那太好了,但 - 至少在我的环境 - 它没有 出现工作装载机没有抱怨;它不是简单地跳过不到位岬匹配 库。可悲!” “这个很奇怪,你能描述一下事情是怎么失败的吗?还有, 也许会在ldd后面输出?” - 亚当古德

为什么此评论可能看起来是真的,但实际上是不正确的。

链接器将忽略它无法读取的库。

这个链接有点亮。 http://www.markusbe.com/2009/09/about-running-32-bit-programs-on-64-bit-ubuntu-and-shared-libraries/

更重要的是,您会发现ld.so手册页具有启发性。

事实证明,路径名可以使运行时链接程序ld.so选择的库作为加载库的区别。在我的64位Linux系统上,除了标准的目录名之外,我还有一些奇怪的目录名。例如/ LIB/x86_64的-Linux的GNU。我实际上认为我会通过将该路径中的库移动到/ lib64来进行试验。当我这样做时,猜猜发生了什么?突然我的64位应用程序(在这种情况下,brctl)没有工作,并抱怨“错误的ELF类”。你好...现在我们正在进行一些工作。

现在我不是100%确定,但关键似乎与rpath令牌扩展有关。 我怀疑$ {PLATFORM}扩展可能与它有关。名称x86_64必须是其中的一部分。在任何情况下,当我将我的64位库放在名为 x86_64-linux-gnu的库路径中时,我发现它们与lib64相同,因此它们优于32位的并且工作正常。

就你而言,你可能想为64位上的32位库做一些非常类似的事情。试试i386-linux-gnu。

在我的情况下我安装64位共享库到32位的userland

所以,我创建了以下路径:

mkdir /lib/x86_64-linux-gnu/ 
mkdir /usr/lib/x86_64-linux-gnu/ 
ln -s /lib/x86_64-linux-gnu /lib64 
ln -s /usr/lib/x86_64-linux-gnu /usr/lib64 

添加您的64位库到64路和32位库32位/ lib目录&/usr/lib路径。

然后将64位特定路径添加到ld.so.conf并使用ldconfig更新缓存现在您的32位& 64位应用程序将无缝运行。

8

都加到的32位和64位目录到LD_LIBRARY_PATH中。

如果你这样做,那么对于32位或64位的ld.so将使用正确的库。

例如32位测试应用程序“test32”和64位测试应用程序“测试”,以及用户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) 

(不感兴趣库路径移除)

这表明装载机知道忽略错误的体系结构的库,至少在这个科学的Linux 6.3(RHEL来源)系统上。我希望其他发行版能够以类似的方式工作,但没有经过测试。

但是,这可能只是比你的(未指定的)发行版本更早才开始。

相关问题