C 如何确保未使用的符号不会链接到最终可执行文件中?

C 如何确保未使用的符号不会链接到最终可执行文件中?,c,size,vxworks,C,Size,Vxworks,首先,我要向那些关注我在过去几天里提出的问题的人表示歉意。这听起来可能有点重复,因为我一直在问与-fffunction部分和-fdata部分相关的问题,而这一部分在同一行。这些问题和答案并没有解决我的问题,所以我意识到最好在这里陈述全部问题,让专家们思考一下。很抱歉没有早点这么做 所以,我的问题来了: 我构建了一组静态库,提供了很多功能。这些静态库将提供给许多产品。并非所有产品都将使用我的LIB提供的所有功能。问题是库的大小相当大,产品希望减少库的大小。主要目标是减少最终可执行文件的大小,而不是

首先,我要向那些关注我在过去几天里提出的问题的人表示歉意。这听起来可能有点重复,因为我一直在问与-fffunction部分和-fdata部分相关的问题,而这一部分在同一行。这些问题和答案并没有解决我的问题,所以我意识到最好在这里陈述全部问题,让专家们思考一下。很抱歉没有早点这么做

所以,我的问题来了:

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

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

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

是否有其他方法可以确保链接器仅链接严格要求的函数,并排除所有其他函数,即使它们位于同一个对象文件中

有没有其他方法来处理这个问题

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

我在这里主要处理VxWorks和GCC


谢谢你的帮助

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

如果查看Plauger的“”,您会发现每个函数都是在一个单独的文件中实现的,即使该文件最终有4行长(一个标题、一个函数行、一个大括号、一行代码和一个小括号)


杰伊问:

在一个大项目中,管理这么多文件不是很困难吗?而且,我没有发现很多开源项目遵循这种模式。OpenSSL就是一个例子

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

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


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

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

如果查看Plauger的“”,您会发现每个函数都是在一个单独的文件中实现的,即使该文件最终有4行长(一个标题、一个函数行、一个大括号、一行代码和一个小括号)


杰伊问:

在一个大项目中,管理这么多文件不是很困难吗?而且,我没有发现很多开源项目遵循这种模式。OpenSSL就是一个例子

我没说它被广泛使用——事实并非如此。但这是确保二进制文件最小化的方法。编译器(链接器)不会为您进行最小化-至少,我不知道有哪一个会这样做。在大型项目中,可以设计源文件,以便将通常一起使用的密切相关的函数分组到单个源文件中。仅偶尔使用的函数应放在单独的