【问题标题】:Which functions are included in executable file compiled by gcc with "-static" on? And which functions are not?哪些函数包含在 gcc 编译的带有“-static”的可执行文件中?哪些功能不是?
【发布时间】:2025-11-22 21:40:01
【问题描述】:

当使用 GCC 的 -static 选项编译 C 程序时,最终的可执行文件将包含大量 C 的标准函数。比如我的整个程序是这样的

int main(int argc, char *argv[]) {
    printf("Hello, world!\n");
    return 0;
}

我检查了编译后的可执行文件,其中包含strcmp()mktime()realloc() 等函数,尽管我的程序从未调用它们。但是stdlib.h中的一些功能缺失,如rand()system()等。我的实验环境是:Ubuntu 14.04(Linux内核3.13.0); GCC 4.8.2。我想知道当-static开启时,可执行文件中会包含哪些C的函数。

【问题讨论】:

  • 运行任何应用程序所需的函数、您调用的函数、这些函数调用的函数。取出 printf 来查看最小集合。

标签: c linux gcc


【解决方案1】:

静态链接意味着您的程序需要的所有库都在编译时链接并包含在我们的可执行文件中。换句话说,您的程序会更大,但它会非常独立(可移植),因为可执行文件将包含它需要运行的所有库。

这意味着使用 -static 您将在包含的库中定义所有函数。您没有放入包含声明,但只是 printf() 已经使用了大量的库。

换句话说,当使用静态时,我们无法告诉您程序中包含哪些库,因为它会因程序而异。

【讨论】:

    【解决方案2】:

    静态库是目标文件的存档。 链接它们,只引入那些解决 undefined 的归档成员 符号引用,这递归地工作(例如,你可以调用a(),它调用b(),它调用c())。如果每个存档成员只定义了一个符号(例如,a.o 只定义了 a() 等),那么您只会(递归地)获得那些需要的符号。实际上,归档成员还可以定义其他符号(例如,a.o 可以定义 a()variable),因此您将获得解析未定义符号引用的符号以及与需要的符号定义。

    【讨论】:

      最近更新 更多