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

Tim*_*ost 16 c linux gcc static-linking

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

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

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

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

S.J*_*.J. 19

这个问题不仅与gcc有关,也与ld(1)有关.

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

objdump -d a.out

它显示了可执行文件中的所有函数.

简单的"谷歌搜索"给出了这个链接.

因此,要删除未使用的功能,您需要:

  • 使用"-fdata-sections"编译以将数据保存在单独的数据部分和"-ffunction-sections"中以将函数保存在单独的部分中,因此如果未使用它们(数据和函数)可以被丢弃.
  • 链接"--gc-sections"以删除未使用的部分.