在Solaris运行Ubuntu编译的Socket代理程序报错:Cannot find /lib64/ld-linux-x86-64.so.2
问题解答:Ubuntu编译的Socket程序在Solaris运行报错
Cannot find /lib64/ld-linux-x86-64.so.2 问题背景
我在Ubuntu 16.04服务器上写了个简单的Socket代理程序,放到Solaris系统上运行时直接报错:
Cannot find /lib64/ld-linux-x86-64.so.2
程序用到的头文件如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h>
错误原因解析
这个问题本质是跨Unix系统的二进制兼容性问题,具体细节如下:
/lib64/ld-linux-x86-64.so.2是Linux(基于GNU C库,即glibc)专属的64位动态链接器,它负责在程序启动时加载运行所需的动态库文件。- Solaris属于独立的Unix分支(由SunOS衍生而来),它使用的动态链接器完全不同——64位Solaris的默认动态链接器是
/lib/64/ld.so.1,且系统底层依赖的C库是Solaris自身的libc实现,和Linux的glibc不兼容。 - 你在Ubuntu上编译程序时,默认会生成依赖Linux glibc的可执行文件,这种二进制文件无法直接在Solaris上运行,因为Solaris既没有Linux的动态链接器,也不支持glibc的库调用逻辑。
哪怕你的代码用的都是标准POSIX头文件(就像你列出的这些),编译后的二进制依然和编译环境的系统库强绑定,Linux和Solaris属于差异较大的Unix系统,直接跨系统运行二进制文件必然会出现这类兼容性问题。
内容的提问来源于stack exchange,提问作者김진영
相关产品推荐
相关产品推荐

