【问题标题】:How to remove all the unused functions from the map file?如何从地图文件中删除所有未使用的功能?
【发布时间】:2021-04-22 02:41:54
【问题描述】:

我想知道是否有办法删除使用 C 开发的嵌入式项目的映射文件中列出的所有未使用的函数,并使用适用于 ARM IDE 的 IAR 嵌入式工作台,它使用自己的编译器和链接器:

IAR C/C++ Compiler for ARM 8.30    
IAR ELF Linker for ARM 8.30 
IAR Assembler for ARM 8.30

我注意到map文件中列出的函数并不是所有的函数都是在运行时实际使用的函数,有什么优化方法可以删除所有未使用的函数吗?

例如,项目中使用了第三个库,FuncA() 是其中的一部分,其中可能有一个 switch case,并且对于每个 case 调用不同的 static 函数,比如说@ 987654323@,FuncA2(),...FuncAn()。我们将根据FuncA() 的代码和用法输入每个案例,因此很明显,并非所有FuncA1()FuncA2()、...FuncAn() 函数都会在项目中被调用,但是,所有地图文件中列出了它们。

是否可以从地图文件中删除这些功能?如果是怎么办?

【问题讨论】:

  • 可能是库函数调用了它们。可能是它们位于一个目标文件中,其中使用了其中一个函数,而其他一些或全部未使用。
  • @JonathanLeffler 谢谢,没有库函数调用它。那么,您是说属于一个目标文件的所有函数都将列在映射文件中,而不管项目中实际调用了哪个函数?
  • @NEO 我确实遵循了您在第二段中的论点。能否说的更清楚些或提供一个具体的代码示例及其关联的地图文件?
  • 它依赖于工具链而不是 C 语言问题 - 你的工具链是什么?
  • IAR 是一家公司,而不是工具链。他们为不止一种架构制作工具链。那就是说我不熟悉IAR。但是,重新阅读您的论点(仍不清楚),我认为您认为可以删除这些功能的假设是有缺陷的。我会更新我的答案,但我可能会误解你的论点 - 你没有包含代码示例。

标签: c optimization embedded iar map-files


【解决方案1】:

使用外部链接删除未使用的函数必然是链接器的功能,而不是编译器的功能。但是,不需要链接器来支持它,并且任何支持都依赖于工具链,并且可能需要应用特定的链接时优化开关。

编译器可以删除带有静态链接的未使用函数。

我们可以根据代码和调用 FuncA() 的函数输入每个案例,因此很明显,并非所有 FuncA1()、FuncA2()、... FuncAn() 函数都会被调用

如果函数FuncAx() 具有静态链接,但在函数FuncA() 中通过外部链接显式引用,则编译器和链接器都不能删除这些函数,因为编译器没有先验知识知道FuncA() 将如何被调用,并且链接器没有对具有静态链接的函数的引用,或者对语言语义的必然理解,这将使所讨论的切换案例明显不被调用。

我猜想一个复杂的工具链带有 C 语言感知链接器和链接时整个程序优化可能会更积极地删除死代码,但这肯定是特定于工具链的。大多数链接器与源语言无关,仅解析目标代码中的符号,在某些情况下会删除未建立链接的代码。

【讨论】:

  • 那些(FuncA1()...FuncAn)是在外部函数FuncA()中调用的静态函数,在项目中确实调用了funcA()。
  • @NEO 同样,它可能是特定于工具链的。具有静态链接的函数可以由编译器而不是链接器删除。
  • 这确实是特定于供应商的。例如DIAB 编译器允许将所有函数和变量放入单独的 ELF 对象部分,因此链接器随后可以删除“未使用的部分”。在您的 IAR 中,不确定存在哪些优化,以及编译器是否真的可以在该开关情况下检测到,哪些路径(及其函数调用)从未使用过。但也许 --mfc (MultiFileCompilation into single object 可以帮助这里的编译器?
  • @kesselhaus 您的评论应该附在问题上而不是这个答案上,或者您应该发布答案。我已经说过它是特定于工具链的。问题中没有提到工具链,这必然是一个通用的答案。
  • @Clifford:对不起,我认为这是一个答案的缩写,它更适合作为您答案的附加信息,而不是添加到关于 IAR 是工具链还是公司的 cmets。
猜你喜欢
  • 2015-06-07
  • 2011-01-11
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多