我想要使用gcc包含的静态链接库(例如stdio),所以我使用-static选项。
我的环境是ubuntu 10.10
gcc版本为4.4.5
我使用的编译命令是: gcc -static -o output.out input.c
以下是我的源代码
include
int main(){
在我编译它并使用-static选项后,我objdump可执行文件
我发现printf实际上叫做_IO_printf。
printf("hello world");
return 0;
}
我写了另一个程序,以下是源代码
include
int main(){
我使用相同的选项编译此源代码并objdump新的可执行文件
但是,我找不到_IO_printf。
return 0;
}
我的问题是为什么我不能在第二种情况下使用_IO_printf。我有静态链接我包含的libray。
有人可以帮助我解决这个问题,thx。
答案 0 :(得分:3)
链接器不只是将目标文件和库放在一起。它创建了不同部分之间的链接。因此,如果一个单元中存在未解析的符号(例如函数或变量),它会在其他单元中查找并进行连接。
由于第二个程序不调用printf,链接器不需要解析该符号。所以没有必要将该函数添加到可执行文件中(它只是坐在那里占用空间)。链接器可以看到缺少的内容,并且应该(通常)只添加缺少的内容到实际的粒度。