在64位Ubuntu运行32位应用ncx32app遇‘文件不存在’问题求助
首先得明确:你遇到的"No such file or directory"错误大概率不是应用本身找不到,而是32位链接器或依赖库加载失败——毕竟你已经把库复制到了指定目录,问题出在Ubuntu 16.04和14.04的库版本不兼容,或者链接器配置不对。下面是一步步的解决方案:
1. 优先安装服务器原生的32位依赖包
既然你的服务器是Ubuntu 14.04,直接用系统包管理器安装所需的32位库是最稳妥的,避免跨版本库的兼容问题:
sudo apt-get update sudo apt-get install libc6:i386 libstdc++5:i386 libncurses5:i386 libgcc1:i386
安装完成后,直接运行你的应用试试:./ncx32app,如果系统已经正确配置了32位运行环境,应该能正常启动。
2. 修复ld-linux.so.2软链接
之前你创建的软链接指向/lib/ld-2.15.so,但Ubuntu 14.04的32位glibc版本是2.19,对应的链接器应该是/lib/i386-linux-gnu/ld-2.19.so。你需要重新创建正确的软链接:
# 先删除旧的软链接 rm /home/myname/lib/ld-linux.so.2 # 创建指向服务器原生32位链接器的软链接 ln -sf /lib/i386-linux-gnu/ld-2.19.so /home/myname/lib/ld-linux.so.2
然后再用LD_LIBRARY_PATH=/home/myname/lib ./ncx32app启动应用。
3. 替换为Ubuntu 14.04原生的32位库(如果不想安装系统包)
你之前从Ubuntu 16.04复制的库依赖更高版本的glibc(2.23),在14.04的2.19环境下无法正常工作。你需要下载Ubuntu 14.04对应的32位库:
- 提取对应deb包中的库文件:
- 从libc6:i386包中提取
libc.so.6、libm.so.6 - 从libstdc++5:i386包中提取
libstdc++.so.5 - 从libgcc1:i386包中提取
libgcc_s.so.1
- 从libc6:i386包中提取
- 将这些文件放到
/home/myname/lib目录,然后确保ld-linux.so.2的软链接正确(参考步骤2)。
4. 用工具排查具体缺失的文件
如果以上步骤都不行,用strace跟踪应用启动过程,找到具体哪个文件找不到:
LD_LIBRARY_PATH=/home/myname/lib strace ./ncx32app 2>&1 | grep -E "open|access" | grep -v "ENOENT" | tail -20
这个命令会输出应用尝试打开的文件,你可以看到哪个库或链接器加载失败,针对性修复。
另外,也可以用readelf检查应用的链接器路径:
readelf -l ncx32app | grep INTERP
如果输出的是/lib/ld-linux.so.2,那确保你的LD_LIBRARY_PATH优先加载自己的lib目录,或者用patchelf修改应用的链接器路径:
patchelf --set-interpreter /home/myname/lib/ld-linux.so.2 ./ncx32app
修改后就不用每次都设置LD_LIBRARY_PATH了。
内容的提问来源于stack exchange,提问作者Val Todorov

