海湾合作委员会静态链接
我想用 gcc 静态链接我包含的库(例如 stdio),所以我使用 -static 选项。
我的环境是ubuntu 10.10。
gcc版本是4.4.5。
我使用的编译命令是:gcc -static -o output.out input.c
以下是我的源代码。
包括
int main(){
编译它并使用 -static 选项后,我 objdump 可执行文件。
printf("你好世界");
返回0;
}
我发现printf实际上叫_IO_printf。
我又写了一个程序,下面是源代码。
包括
int main(){
我使用相同的选项编译此源代码,并 objdump 新的可执行文件。
返回0;
}
但是,我找不到 _IO_printf。
我的问题是为什么我不能在第二种情况下罚款 _IO_printf。我已经静态链接了我包含的库。
有人可以帮我解决这个问题吗,谢谢。
I want to static link libray which I included (such as stdio) with gcc, so I use the -static options.
My environment is ubuntu 10.10.
gcc version is 4.4.5.
the compile command I used is : gcc -static -o output.out input.c
the following is my source code.
include
int main(){
printf("hello world");
return 0;
}
After I compile it and use the -static option, I objdump the executable file.
and I found out that the printf is actually called _IO_printf.
And I write another program, the following is the souce code.
include
int main(){
return 0;
}
I compile this source code with the same option and objdump the new executable file.
However, I can't find the _IO_printf.
My question is why I can't fine _IO_printf in the second case. I have static linked the libray which I included.
Can someone plz help me solve this problem, thx.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
链接器不仅仅将目标文件和库放在一起。它在不同部分之间创建链接。因此,如果一个单元中存在未解析的符号(例如函数或变量),它将在其他单元中查找它并建立连接。
由于第二个程序不调用 printf,因此链接器不需要解析该符号。因此,将该函数添加到可执行文件中是没有意义的(它只会坐在那里并占用空间)。链接器可以看到缺少的内容,并且(通常)应该仅添加缺少的内容到一些实际的粒度。
A linker doesn't just put object files and libraries together. It creates links between the different parts. So if there is an unresolved symbol (e.g. function or variable) in one unit, it looks for it in other units and makes the connection.
Since the second program doesn't call printf, the linker does not need to resolve that symbol. So there is no point adding that function to the executable (it'll just sit there and take space). The linker can see what's missing, and should (normally) add only what's missing down to some practical granularity.