在与gcc静态链接时,如何仅包含已使用的符号?

时间:2011-03-15 03:54:05

标签: c linux gcc static-linking

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

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

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

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

1 个答案:

答案 0 :(得分:18)

此问题不仅与gcc有关,也与ld(1)有关。

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

来检查

objdump -d a.out

显示可执行文件中的所有函数。

简单的“谷歌搜索”给出link

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

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