2017-06-03 64 views
1

当一个C程序编译时使用GCC的-static选项时,最终的可执行文件将包含大量C的标准函数。例如,我的整个程序就像是gcc用“-static”编译的可执行文件中包含哪些函数?哪些功能不是?

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的功能将被包含在可执行文件中。

+1

运行任何应用程序所需的函数,由您调用的函数,这些函数调用的函数。拿出printf看最小的一组。 –

回答

1

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

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

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

1

静态库是对象文件的存档。 链接它们只会引入那些解析未定义的 符号引用的归档成员,并且这个工作是递归的(例如,您可以调用a(),它调用b(),它调用c())。如果每个存档成员都定义了一个符号(例如,a.o只定义了a()等),则只会获得所需的符号(递归)。实际上,档案成员也可以定义其他符号(例如,a.o可能定义为a()variable),因此您将获得符号来解析未定义的符号引用以及共享具有所需符号定义的相同对象文件的符号。