【问题标题】:gcc static linkgcc 静态链接
【发布时间】:2011-05-28 18:43:13
【问题描述】:

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

包括

int main(){
printf("你好世界");
返回 0;
}
在我编译它并使用 -static 选项后,我 objdump 可执行文件。
我发现 printf 实际上被称为 _IO_printf。

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

包括

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

我的问题是为什么我不能在第二种情况下处理 _IO_printf。我已经静态链接了我包含的库。

谁能帮我解决这个问题,谢谢。

【问题讨论】:

  • 不要使用 HTML 来格式化您的代码。

标签: gcc linker


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多