C 如何从映射文件中删除所有未使用的函数?

C 如何从映射文件中删除所有未使用的函数?,c,optimization,embedded,iar,map-files,C,Optimization,Embedded,Iar,Map Files,我想知道是否有办法删除map文件中列出的所有未使用的函数,这些函数用于使用IAR embedded workbench for ARM IDE开发的嵌入式项目,它使用自己的编译器和链接器: IAR C/C++ Compiler for ARM 8.30 IAR ELF Linker for ARM 8.30 IAR Assembler for ARM 8.30 我注意到并不是map文件中列出的所有函数都是在运行时实际使用的函数,是否有任何优化方法来删除所有未使用的函数 例如,项目中使

我想知道是否有办法删除map文件中列出的所有未使用的函数,这些函数用于使用IAR embedded workbench for ARM IDE开发的嵌入式项目,它使用自己的编译器和链接器:

IAR C/C++ Compiler for ARM 8.30    
IAR ELF Linker for ARM 8.30 
IAR Assembler for ARM 8.30
我注意到并不是map文件中列出的所有函数都是在运行时实际使用的函数,是否有任何优化方法来删除所有未使用的函数

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


是否可以从映射文件中删除此类函数?如果是,如何删除?

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

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

我们可以根据调用FuncA()的代码和函数输入每种情况,因此显然并非所有的FuncA1()、FuncA2()、。。。将调用FuncAn()函数

如果函数
FuncAx()
具有静态链接,但在具有外部链接的函数
FuncA()
中显式引用,则编译器和链接器都不能删除这些函数,因为编译器不知道如何调用
FuncA()
,并且链接器没有引用具有静态链接的函数,也没有必要理解语言语义,这会使有问题的切换案例显然没有被调用


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

删除带有外部链接的未使用函数必须是链接器的功能,而不是编译器的功能。但是,链接器不需要支持该功能,任何支持都取决于工具链,可能需要应用特定的链接时间优化开关

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

我们可以根据调用FuncA()的代码和函数输入每种情况,因此显然并非所有的FuncA1()、FuncA2()、。。。将调用FuncAn()函数

如果函数
FuncAx()
具有静态链接,但在具有外部链接的函数
FuncA()
中显式引用,则编译器和链接器都不能删除这些函数,因为编译器不知道如何调用
FuncA()
,并且链接器没有引用具有静态链接的函数,也没有必要理解语言语义,这会使有问题的切换案例显然没有被调用


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

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