c - 将 -static 与 GCC 一起使用可以保证我的 C 程序可以跨 x86 发行版运行吗?

标签 c linux gcc static-libraries glibc

我在用 C 编写的简单数学工具中使用 stdio.h 、 string.h 、 math.h 。
我听说 gcc 中的 -static 实际上并不总是静态编译库(我从我不理解的 Linux-pro 术语中听到这个)而且我还从相同的消息来源中听说,Linux 的软件开发由于碎片化和不同的发行版需要为每个发行版重新编译。
由于我没有做 GUI 或自定义库,或者任何太复杂的东西,我假设我不必为每个发行版再次编译,并且在我的 Ubuntu 20.04 系统上编译时在 gcc 中静态链接 -static 将创建一个可执行的二进制文件与几乎所有 x86_64 Linux 系统兼容。我对吗 ?它至少可以在 Debian、Ubuntu、Arch 及其衍生产品上运行吗?
我看到了来自 Android Authority 的 Garry 的视频,他静态编译了他在 Raspberry Pi 上制作的 C 程序并在 Android 上运行它,所以我猜这是可能的。

最佳答案

即使静态链接,glibc 库仍然使用一些动态特性。这可能适用于较旧的发行版,因为诸如 NSS(名称服务切换)之类的东西已经存在很长时间了。
如果你想真正保持静态,你应该使用 uclibc 或其他类似的微型 C 库。但是,如果系统使用功能覆盖 DNS、用户 ID(如在 LDAP 中查找用户)、主目录位置等,它们将无法工作。
那么还有另一个问题:内核支持。如果您在一个非常新的内核上构建静态库,则该库可能已构建为使用来自新版本的系统调用,如果您使用足够旧的发行版,这些系统调用可能不存在。像 2.4、2.6 或 3.X 这样的内核肯定会缺少系统调用。

关于c - 将 -static 与 GCC 一起使用可以保证我的 C 程序可以跨 x86 发行版运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62928306/

相关文章:

c - glibc 源中的系统调用在哪里

c - 当您在函数中将文字字符串作为参数传递时,C 是否会添加 '\0'?

c - Linux内核: why does this call to kstrtol crash?

python - 一旦 python 脚本从终端 (Ctrl-C) 停止,如何释放 Ubuntu 内存?

linux - 如何修改DWARF版本的G++编译调试信息

字符串操作中的 C 段错误

linux - 如何在 Rust 中创建虚拟文件系统?

在 C 中不使用 main() 编译和运行程序

gcc - 无法激活 gcc 中的 "-march=native"或 Core2 芯片中的任何其他标志设置的 SSE 指令

c - 为什么在为存储要在程序中使用的 main 参数的指针变量赋值之前不分配空间?