关于不同gcc、g++编译器和不同c库和不同系统内核的程序通用性解释

wangchunlin 2022-10-27 139 10/27

信息比较零散,我也没有找到比较完整的解释

系统调用(System Call Interface)是比较稳定的,也就是说你用到的系统调用大概率在十年前的内核上都有。这也是 docker 能好用的原因之一。

目前看来比较容易影响的是 glibc,因为它不推荐使用静态链接,主要涉及 libc.so.6 和 ld.so ,前者必须跟后者版本严格一致,后者通常通过 interpreter path 显式指定使用系统提供的版本。你也没法控制编译器不使用新版 glibc 新增的符号。

另外两个基础库 libstdc++.so 和 libgcc_s.so 倒是可以选择静态链接,问题不大。

如果能用 musl-staic 或者像 go 那样完全不依赖 glibc 也是很好移植的。

所以通常做可移植的做法是把所有用到的 so(包括 glibc)全打包到程序目录下,用 patchelf 修改 interpreter path 和 rpath 。

不同版本的 Linux 编译的 c/c++程序是否通用 - 糯米PHP (nuomiphp.com)

- THE END -

wangchunlin

10月27日17:42

最后修改:2022年10月27日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论