gcc使用“-static”编译的可执行文件中包含哪些函数?而哪些功能不是?

时间:2017-06-03 19:07:02

标签: c linux gcc

当使用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函数将包含在可执行文件中。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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