0

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

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

我注意到并非地图文件中列出的所有函数都是在运行时实际使用的已使用函数,是否有任何优化方法可以删除所有未使用的函数?

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

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

4

1 回答 1

2

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

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

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

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

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

于 2021-01-17T18:36:29.767 回答