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

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

该程序依赖于Xen库中的某些符号,这些符号仅在不稳定的树中可用。 因此,通过虚拟机模板上的各个软件包pipe理器来安装Xen的库并不能解决我的问题。

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

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

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

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

objdump -d a.out

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

简单的“谷歌搜索”给这个链接 。

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

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