2011-05-28 174 views
1

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

include

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

而我写另一个程序,以下是源代码。

include

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

我的问题是为什么我不能在第二种情况下罚款_IO_printf。我有静态链接我包括的libray。

有人可以帮我解决这个问题,thx。

+0

不要使用HTML格式化您的代码。 – 2011-05-28 18:57:21

回答

3

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

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

+0

谢谢你回答这个问题。 – mike820324 2011-05-28 18:56:29