将-static与GCC结合使用能保证我的C程序在x86发行版上运行吗



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

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

由于我没有做GUI或自定义库,或者任何太复杂的事情,我假设我不必为每个发行版再次编译,并且在我的Ubuntu 20.04系统上编译时,在gcc中使用-static静态链接将创建一个与几乎所有x86_64 Linux系统兼容的可执行二进制文件。我说得对吗?它至少能在Debian、Ubuntu、Arch及其衍生产品上运行吗?

我看到了安卓管理局的Garry的视频,他静态地编译了他在树莓派上制作的C程序,并在安卓上运行,所以我猜这是可能的。

glibc库仍然使用一些动态特性,即使静态链接也是如此。这可能适用于较旧的发行版,因为像NSS(名称服务切换(这样的东西已经存在很长时间了。

如果你想要真正的静态,你应该使用ucbc或其他类似的小型C库。但是,如果系统使用功能来覆盖DNS、用户ID(如在LDAP中查找用户(、主目录位置等,它们将无法工作。

还有另一个问题:内核支持。如果你在一个非常新的内核上构建静态库,那么这个库可能是为了使用新版本的系统调用而构建的,如果你去了一个足够旧的发行版,这些系统调用可能就不存在了。像2.4、2.6或3.X这样的内核肯定会丢失系统调用。

从您列出的标题中,对dlopen的唯一依赖是由fopen的模式参数暗示的:如果在那里使用,ccs=参数,fopen将尝试dlopen作为gconv模块,用于字符集转换。

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

最新更新