有没有一种方法可以获取未被内联的函数列表?无论是通过向gcc传递选项还是检查二进制文件。
编辑:我知道如何使用gcc的内置属性noinline显式要求不将函数内联。
将-fdump-ipa-inline
添加到编译器选项中。
在目标文件旁边创建的yoursourcefile.inline
文件中搜索"Considering inline candidate",以找出编译器考虑内联的所有函数。
搜索"Inlined into"以查找编译器最终内联的所有函数。
如果您想知道编译器拒绝候选项的原因(例如“调用不太可能且代码大小会增加”),请搜索"inline_failed:"。
-fdump-tree-all
选项,并搜索转储文件中的“inline”即可。在Unix/Linux中,您可以使用nm命令来获取二进制文件中符号的列表。
如果函数没有被内联,它的符号名称将出现在二进制文件中。
'inline'不是函数的属性,一个函数可以同时是内联和非内联的。当你调用一个函数时,编译器会决定是否内联它,如果有多个调用,编译器可能会为不同的调用选择不同的选项。如果至少有一个非内联调用,该函数将出现在符号表中。如果导出该函数,它也将出现在符号表中。
因此,没有办法检查一个函数是否被内联,你只能通过反向工程来检查特定的调用是否被内联。