【问题标题】:How do I include only used symbols when statically linking with gcc?与 gcc 静态链接时,如何仅包含使用的符号?
【发布时间】:2011-03-15 03:54:04
【问题描述】:

我正在部署一个用 gcc 4.3.2-1.1 (Debian) 编译的小程序。该程序将部署在从 Debain 5 到前沿 Fedora、Ubuntu、Slackware、Arch 等各种虚拟机模板上。

该程序依赖于 Xen 库中的一些符号,这些符号仅在不稳定的树中可用。因此,通过虚拟机模板上的相应包管理器安装 Xen 的库并不能解决我的直接问题。

在我打包我自己版本的这些库之前,我需要静态链接可执行文件。

默认情况下,gcc 4.3-x 是否仅包含静态链接时实际使用的符号,或者是否有另一个优化标志我应该传递给链接器?我知道静态链接很糟糕,我只是将其作为临时解决方法。

【问题讨论】:

    标签: c linux gcc static-linking


    【解决方案1】:

    这个问题不仅与 gcc 有关,还与 ld(1) 有关。

    默认情况下,gcc 不会消除死代码,您可以通过编译/链接可执行文件,然后运行来检查这一点

    objdump -d a.out

    它向您显示可执行文件中的所有功能。

    简单的“谷歌搜索”给这个link

    因此,要删除未使用的函数,您需要:

    • 编译时使用“-fdata-sections”将数据保存在单独的数据部分中,使用“-ffunction-sections”将函数保存在单独的部分中,这样它们(数据和函数)在未使用时可以丢弃。
    • 与“--gc-sections”链接以删除未使用的部分。

    【讨论】:

    • 谢谢。有时仅仅弄清楚要搜索什么就令人沮丧。在查询中使用“符号”搜索产生了我不是要查找的所有内容:)
    • 此方法有效...但请注意文档gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html 警告:-ffunction-sections, -fdata-sections ...仅在这样做有显着好处时才使用这些选项。当您指定这些选项时,汇编器和链接器会创建更大的目标文件和可执行文件,而且速度也会变慢。如果指定此选项,则无法在所有系统上使用 gprof,如果同时指定此选项和 ​​-g,则可能会遇到调试问题。
    猜你喜欢
    • 2012-10-16
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多