一尘不染

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

linux

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

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

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

默认情况下,gcc 4.3-x是否仅包括静态链接时实际 使用的 符号,还是我应该将其他优化标志传递给链接器?我知道静态链接是不好的,我只是在做临时工作。


阅读 291

收藏
2020-06-03

共1个答案

一尘不染

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

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

objdump -d a.out

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

简单的“搜索”就给出了此链接

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

  • 使用“ -fdata-sections”进行编译以将数据保留在单独的数据节中,使用“ -ffunction-sections”进行编译以将函数保留在单独的节中,因此如果未使用它们,则可以将其(数据和函数)丢弃。
  • 链接“ –gc-sections”以删除未使用的部分。
2020-06-03