如何查找未被内联的函数

9

有没有一种方法可以获取未被内联的函数列表?无论是通过向gcc传递选项还是检查二进制文件。

编辑:我知道如何使用gcc的内置属性noinline显式要求不将函数内联。

4个回答

7

-fdump-ipa-inline添加到编译器选项中。

在目标文件旁边创建的yoursourcefile.inline文件中搜索"Considering inline candidate",以找出编译器考虑内联的所有函数。

搜索"Inlined into"以查找编译器最终内联的所有函数。
如果您想知道编译器拒绝候选项的原因(例如“调用不太可能且代码大小会增加”),请搜索"inline_failed:"。


3
使用gcc的-fdump-tree-all选项,并搜索转储文件中的“inline”即可。

0

在Unix/Linux中,您可以使用nm命令来获取二进制文件中符号的列表。
如果函数没有被内联,它的符号名称将出现在二进制文件中。


5
不正确。非静态函数将被发出,无论它们是否被内联。 - Mat
@Mat,不是的。对于C++来说,内联模型可能会更加复杂,但对于C(C99和C11),只有在请求符号“实例化”的翻译单元中才会发出符号,即对于具有内联定义和外部声明的C。 - Jens Gustedt
1
如果C编译器认为内联某个函数可以提高程序运行速度,它就会这样做。但是,如果该函数被导出到其他文件中,则编译器只能将其完全删除,除非该函数被声明为静态的,否则编译器无法知道是否还有其他调用它的地方。因此,@Mat是正确的。 - ams
1
@ams,不是的。C99规定,被标记为“inline”的函数必须在没有外部声明的情况下不产生符号。我曾经写过这些规则,请看一下http://gustedt.wordpress.com/2010/11/29/myth-and-reality-about-inline-in-c99/。 - Jens Gustedt
1
@JensGustedt:谁说过需要标记为“内联”的函数了? - Mat
显示剩余4条评论

0

'inline'不是函数的属性,一个函数可以同时是内联和非内联的。当你调用一个函数时,编译器会决定是否内联它,如果有多个调用,编译器可能会为不同的调用选择不同的选项。如果至少有一个非内联调用,该函数将出现在符号表中。如果导出该函数,它也将出现在符号表中。

因此,没有办法检查一个函数是否被内联,你只能通过反向工程来检查特定的调用是否被内联。


我理解inline是“每次调用”,我的问题是如何找出所有调用都没有被内联。 - Giovanni Funchal
2
你只是没有回答问题。 - Jens Gustedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接