关于Linux的二进制兼容性

4

如果我用Ubuntu上的GCC 4.8编译一些C++代码,这些代码没有GUI/界面,只使用标准的Linux库,那么这个二进制文件能否在RHEL 5/6上运行,而且不会因为较旧的GCC产生错误呢?


1
我不是Unix专家,但我认为如果你将所有内容静态链接,并且你的应用程序不使用特定于Ubuntu的API,它应该可以工作。最好的方法是尝试一下 :) - DarkWanderer
1
如果是静态链接的话,很可能会出现这种情况;如果是动态链接的话,很可能不会。 - Elliott Frisch
最好在旧版Ubuntu上编译程序,以获得更好的兼容性,因为大多数系统库、编译器和其他工具都试图保持向后兼容。 - linuxbuild
2个回答

5

通常情况下是不行的。其中一个原因是libc版本太老,会报错。

如果您使用静态链接libstdc++并小心避免较新的glibc功能,则可能可以实现。但是后者并非总是可行的。libc的静态链接没有官方支持,可能会奏效也可能会失败。


实际上,只需使用GCC 4.8重新构建较旧版本的libc,运行patchelf(http://nixos.org/patchelf.html),一切可能都会变得OK。 - user184968
@skwllsp,从目标系统复制libc通常也是可行的。 - n. m.
1
你确定吗?看一下这个链接:https://dev59.com/VHRA5IYBdhLWcg3wvQhh#851229?你是指包括ld-linux.so.2在内的所有内容都要复制吗? - user184968
@skwllsp 我不能保证它一定能够生效,但我认为复制/lib和/usr/lib过去可能有效。 - n. m.

2
问题可能更多地与Glibc有关,而不是libstdc ++(您确实可以静态链接)或GCC本身。
您可以使用替代的Libc,例如MUSL libc(应该更友好地支持静态链接)。
此外,可能存在一些内核依赖性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接