如何确保未使用的符号没有链接到最终的可执行文件?

时间:2010-11-26 04:12:49

标签: c size vxworks

首先,我向那些愿意关注过去几天发布的问题的人道歉。这可能听起来有点重复,因为我一直在询问与-ffunction-sections& -fdata-sections和这一行在同一行。那些问题和他们的答案并没有解决我的问题,所以我意识到我最好在这里陈述完整的问题并让SO专家思考它。很抱歉没有提前这样做。

所以,这就是我的问题:

我构建了一组静态库,它们提供了许多功能。这些静态库将提供给许多产品。并非所有产品都将使用我的库提供的所有功能。问题是库的大小非常大,产品希望它减少。主要目标是减少最终的可执行文件大小,而不是库大小本身。

现在,我做了一些研究,发现如果源文件中有4个函数,并且应用程序只使用了其中的一个函数,则链接器仍然会将3个函数中的其余函数包含在最终的可执行文件中因为它们都属于同一个目标文件。我进一步分析并发现-ffunction-sections,-fdata-sections和-gc-sections(这是一个链接器选项)将确保只有一个函数被链接。

但是,由于我无法控制的某些原因,这些选项现在无法使用。

有没有其他方法可以确保链接器只链接严格要求的函数并排除所有其他函数,即使它们位于同一目标文件中?

还有其他方法可以解决这个问题吗?

注意:重新组织我的代码几乎被排除在外,因为它是遗留代码而且很大。

我主要处理的是VxWorks&海湾合作委员会在这里。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

最终,确保只链接所需函数的唯一方法是确保库中的每个源(对象)文件只导出一个函数符号 - 每个文件一个(可见)函数。通常,有些文件导出几个总是全部一起使用的函数 - 例如,包的初始化和终结函数。此外,导出函数使用的函数通常不需要在源(对象)文件外可见 - 确保它们是static

如果您查看Plauger的“The Standard C Library”,您会发现每个函数都在一个单独的文件中实现,即使文件最终有4行(一个标题,一个函数行,一个开放式大括号) ,一行代码和一个紧密的支撑。)


杰伊问道:

  

对于大项目而言,管理这么多文件难道不难吗?此外,我没有找到许多遵循此模型的开源项目。 OpenSSL就是一个例子。

我没有说它被广泛使用 - 事实并非如此。但这是确保二进制最小化的方法。编译器(链接器)不会为你做最小化 - 至少,我不知道这样做。在大型项目中,您可以设计源文件,以便通常全部一起使用的密切相关的函数分组在单个源文件中。偶尔使用的函数应放在单独的文件中。理想情况下,很少使用的函数应该都在自己的文件中;如果不这样做,将其中的少数数据分组为小(但非最小)文件。这样,如果使用了很少使用的函数之一,那么只会链接有限量的额外未使用代码。

关于文件数量 - 是的,所采用的技术确实意味着很多文件。您必须权衡管理(命名)大量文件的工作量与最小代码大小的好处。自动构建系统消除了大部分的痛苦; VCS系统处理大量文件。

另一种方法是将库代码放入共享对象 - 或动态链接库(DLL)。然后程序与共享对象链接,共享对象只加载到内存中一次,并在使用它的程序之间共享。为每个进程复制(非常量)数据。这减少了磁盘上程序的大小,但是在加载过程中以修复为代价。但是,您不必担心可执行文件的大小;可执行文件不包含共享对象。您可以更新库(如果您小心),而无需重新编译使用它的主程序。可执行文件的大小减小是共享库受欢迎的一个原因。