64位Linux上的链接不正确

时间:2014-12-24 14:50:28

标签: c++ linux linker

我在64位Linux(RH6)上构建32位应用程序 我检查链接器在链接期间如何搜索库,并查看它是否找到了正确的32位库libz但删除它,进一步查找并找到它的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。

PS。 我使用的是-m32选项,但在这种情况下无效。

更新!似乎调查转移到另一个领域 - Electric Make。如果我运行emake(原始目标案例)它失败了。如果我复制 - 粘贴 - 执行命令,其中emake失败,那么构建成功完成 因此怀疑情境不同 不知道如何调查

UPDATE2
这很奇怪。 Electric Make只是从搜索路径(LD_LIBRARY_PATH)中删除像/ usr / lib这样的常用库,并且只使用Clearcase文件系统中的路径。如果它没有找到必要的库那里它获取ld的缓存并在那里搜索。满足64位libz.so(缓存文件中的地理位置)它会停止搜索并返回错误。

2 个答案:

答案 0 :(得分:0)

Gcc将按特定顺序查找lib文件:

  1. 路径跟随-L选项

  2. 环境变量LD_LIBRARY_PATH中的路径

  3. 文件/etc/ld.so.conf中的路径

  4. / lib和/ usr / lib

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

答案 1 :(得分:0)

可能您没有安装32位版本的库。尝试查找数据包zlib.i586或类似的内容。

问题的另一个可能来源,可能是"合适的"符号链接在/lib目录下。我遇到的情况是/lib/libfoo.so/lib64/libfoo.so的符号链接,甚至是最糟糕的硬拷贝。使用ldd工具,您可以检索库的实际体系结构。 32位库取决于/lib/ld-linux.so,而{64}位取决于/lib64/ld-linux-x86-64.so

相关问题