我在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(缓存文件中的地理位置)它会停止搜索并返回错误。
答案 0 :(得分:0)
Gcc将按特定顺序查找lib文件:
路径跟随-L选项
环境变量LD_LIBRARY_PATH中的路径
文件/etc/ld.so.conf中的路径
/ lib和/ usr / lib
因此,尝试使用-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
。