2014-12-24 71 views
1

我在64位Linux(RH6)上构建32位应用程序。
我检查联动期间链接器如何搜索库,并看到它被发现右32位库libz但删除它,去进一步SEACH和被发现的64位版本的它:
3885956: trying file=/lib/libz.so.1 3885956: search cache=/etc/ld.so.cache 3885956: trying file=/lib64/libz.so.1
所有链接说后:
/usr/bin/ld: skipping incompatible /usr/lib64/libz.so when searching for -lz /usr/bin/ld: cannot find -lz collect2: ld returned 1 exit status
有人可以解释我为什么连接器做到这一点,以及如何强制它获得32位库?
Thsnks。64位Linux上的链接不正确

PS。 我使用-m32选项,但在这种情况下它不起作用。

UPDATE!看来调查转移到另一个领域 - 电气制造。如果我运行emake(原始目标案例),则失败。如果我复制粘贴执行命令哪个emake失败,然后构建成功完成。
因此怀疑上下文有所不同。
不知道如何调查

UPDATE2
这是自叹不如。 Electric Make只会从搜索路径(LD_LIBRARY_PATH)中删除/ usr/lib这样的常见库,并且仅使用Clearcase文件系统中的路径。如果它没有找到必要的库,它会得到ld的缓存并在那里搜索。遇到64位libz.so(geos首先在缓存文件中),它会停止搜索并返回错误。

+0

显示您的确切命令行。 –

+1

“我检查链接器是如何搜索”你是怎么做的?它看起来像'ld.so'可能做的,而不是'ld'。我的猜测是你错过了32位的-devel包。 –

+0

只要确保gcc PATH是正确的。检查这篇文章 http:// stackoverflow。com/questions/3501878/force-gcc-to-compile-64位平台上的32位程序 – tan

回答

0

GCC将寻求在特定的顺序LIB文件:

  1. 路径如下-L选项在环境变量LD_LIBRARY_PATH

  2. 路径文件/etc/ld.so

  3. 路径.conf

  4. /lib和/ usr/lib

因此,尝试使用-L来告诉编译器搜索文件夹中的libz.so,首先包含32位版本。

+0

正如你可以从我的文章中的日志片段看到的,链接器在适当的位置找到32位libz.so(第一行从word开始“试”)。但是,它会忽略它并使用64位。由于LD_LIBRARY_PATH包含路径/ lib和64位lib,因此/etc/ld.so.cache(其中ld使用next)包含具有64位版本的路径/ lib64,因此它找到32位lib。 – OlegG

0

可能您尚未安装该库的32位版本。尝试找到一个包zlib.i586或类似的东西。

该问题的另一个可能来源可能是/lib目录中的“适当”符号链接。我遇到了/lib/libfoo.so/lib64/libfoo.so的符号链接或者甚至是最差的硬拷贝。使用ldd工具可以检索库的实际体系结构。一个32位的库将取决于/lib/ld-linux.so而64位的/lib64/ld-linux-x86-64.so

+0

Linker找到了一个32位的libz.so,但由于某些原因而忽略它。 – OlegG

+0

@OlegG检查我的更新答案。 – Manos

+0

我使用'file'命令检查了两个库libz.so,并确保它们具有正确的相应版本 – OlegG