Flo*_*ogo 37 linker gcc shared-libraries
我必须在当前的ubuntu(12.04)上编译程序.然后,该程序应使用具有较旧内核(2.6.18)的CentOS在集群上运行.不幸的是,我不能直接在集群上编译.如果我只是编译并复制程序而没有任何更改,我会收到错误消息"kernel too old".
我理解它的方式,其原因不是内核版本,而是用于编译的libc版本.所以我尝试编译我的程序动态链接集群中的libc并静态链接其他所有内容.
研究
在SO上已经有很多关于这方面的问题,但没有一个答案对我有用.所以这是我对该主题的研究:
-rpath,但是这并没有为我工作(见下文)当前状态
我将以下文件从群集复制到目录中 /path/to/copied/libs
并正在编译选项 -nodefaultlibs -Xlinker -rpath=/path/to/copied/libs -Wl,-Bstatic,-lrt,-lboost_system,-lboost_filesystem -Wl,-Bdynamic,-lc,-lstdc++,-lgcc_s
编译二进制文件的ldd输出是
mybin: /path/to/copied/libs/libc.so.6: version `GLIBC_2.14' not found (required by mybin)
mybin: /path/to/copied/libs/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mybin)
linux-vdso.so.1 => (0x00007ffff36bb000)
libc.so.6 => /path/to/copied/libs/libc.so.6 (0x00007fbe3789a000)
libstdc++.so.6 => /path/to/copied/libs/libstdc++.so.6 (0x00007fbe37599000)
libgcc_s.so.1 => /path/to/copied/libs/libgcc_s.so.1 (0x00007fbe3738b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbe37bf3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbe37071000)
Run Code Online (Sandbox Code Playgroud)
我对这个错误感到有些困惑,因为它使用了正确的路径(即集群中的libc),但仍然抱怨缺少glibc版本.在群集上运行ldd时,它返回not a dynamic executable并运行二进制文件会产生上述相同的两个错误.它看起来还包括其他库(linux-vdso.so.1,ld-linux-x86-64.so.2和libm.so.6).我也应该使用旧版本吗?
所以现在我有两个主要问题: