共享库如何在混合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位程序,反之亦然。
它应该如何工作?我确信我不是第一个遇到这个问题的人。它通常如何解决?
问候, 斯特凡
作为一种变通方法,包裹Java调用在一个小的shell脚本unset
小号LD_LIBRARY_PATH
,然后调用可执行文件。或者,这也可能工作:
LD_LIBRARY_PATH= java...
请注意“=”和可执行文件的名称之间的空格。
感谢您的想法,它可能会在这种特殊情况下工作。然而,我正在寻找一种更通用的方法,它不需要更改机器上的构建脚本。 – struppi 2009-11-10 09:38:24
是的;我不确定自动拾音器是如何工作的。我建议安装一个32位应用程序并在其上运行“ldd”。如果选择了这些库,那么它必须在/etc/ld.conf和ldconfig中发生一些奇迹:http://linux.die.net/man/8/ldconfig – 2009-11-10 10:20:07
在Solaris上,可以使用LD_LIBRARY32_PATH
和LD_LIBRARY64_PATH
,但在Linux上不支持。
在一般情况下,你应该永远需要设置LD_LIBRARY_PATH
都摆在首位:
- 要么安装所需的库到
/usr/lib32
或/usr/lib64
作为 适当,或 - 建立自己的32与
-Wl,-rpath=/path/to/32-bit/libs
是不是只是'LD_LIBRARY_PATH','' Solaris上的LD_LIBRARY_PATH_32'和'LD_LIBRARY_PATH_64'? – maxschlepzig 2015-12-21 16:15:05
刚刚设置LD_LIBRARY_PATH
两个路径(使用冒号分隔)。链接器将忽略它无法读取的库。
这很好,但 - 至少在我的环境中 - 它似乎没有工作。装载机确实抱怨;它并不是简单地跳过那些不符合比特位的库。可悲! – struppi 2009-11-13 20:23:08
这很奇怪,你能描述一下事情是如何失败的吗?另外,也许发布'ldd'的输出? – 2009-11-13 21:01:49
当重新安装运行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位应用程序将无缝运行。
将都加到的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来源)系统上。我希望其他发行版能够以类似的方式工作,但没有经过测试。
但是,这可能只是比你的(未指定的)发行版本更早才开始。
你用什么来维护你的构建? makefile? – 2009-11-10 08:14:39
是的,Makefiles。 – struppi 2009-11-10 09:34:44