gcc静态链接



我想静态链接我包含在gcc中的库(如stdio),所以我使用-static选项
我的环境是ubuntu 10.10。
gcc版本为4.4.5
我使用的编译命令是:gcc-static-o output.out-input.c
以下是我的源代码

include

int main(){
printf("hello world");
return 0;
}
在我编译它并使用-static选项之后,我objdump可执行文件
我发现printf实际上叫做_IO_printf

我写了另一个程序,下面是源代码

include

int main(){
return 0;
}
我使用相同的选项编译此源代码,并objdump新的可执行文件
但是,我找不到_IO_printf

我的问题是为什么在第二种情况下我不能对_IO_printf进行罚款。我已经静态链接了我包含的图书馆

有人能帮我解决这个问题吗。

链接器不仅仅是将对象文件和库放在一起。它在不同的部分之间创建链接。因此,如果一个单元中有一个未解析的符号(例如函数或变量),它会在其他单元中查找并建立连接。

由于第二个程序不调用printf,所以链接器不需要解析该符号。因此,将该函数添加到可执行文件中是没有意义的(它只是坐在那里并占用空间)。链接器可以看到缺少的内容,并且(通常)应该只将缺少的内容添加到一些实用的粒度。

最新更新