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

Will using -static with GCC guarantee that my C programme will work across x86 distros?

我在用 C 语言编写的简单数学工具中使用 stdio.h 、string.h 、math.h。

我听说 gcc 中的 -static 实际上并不总是静态编译库(我从 Linux-我不理解的专业术语中听到这个)而且我也从相同的来源听说软件开发因为 Linux 是一个痛苦,因为碎片化和不同的分布需要为每个重新编译。

因为我没有做 GUI 或自定义库,或任何太复杂的东西,我假设我不必为每个发行版再次编译并在我的 [=28 上编译时与 gcc 中的 -static 静态链接=] 20.04 系统将创建一个与几乎所有 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 这样的内核肯定会缺少系统调用。

从您列出的 headers 中,fopen 的模式参数隐含了对 dlopen 的唯一依赖:如果在那里使用 ,ccs= 参数,fopen 将尝试 dlopen 一个 gconv 模块,用于字符集转换。

除此之外,在 <stdio.h><string.h><math.h> 中声明的函数中的 none 将执行隐式 dlopen,因此静态链接应该在这种特殊情况下是安全的。