有没有办法获得未在任何地方内联的函数列表?通过将选项传递给gcc或检查二进制文件?
编辑:我知道如何通过使用gcc的内置属性noinline明确要求函数不被内联。
答案 0 :(得分:6)
将-fdump-ipa-inline
添加到编译器选项中。
grep文件yoursourcefile.inline
,该文件在“考虑内联候选者”的目标文件旁边创建,以找出编译器认为内联的所有函数。
将文件格式化为“Inlined into”以找出编译器最终内联的所有函数。
grep for“inline_failed:”如果您对编译器拒绝候选者的原因感兴趣(例如“调用不太可能,代码大小会增加”)。
答案 1 :(得分:3)
使用gcc的-fdump-tree-all
并搜索转储文件“inline”。
答案 2 :(得分:0)
您可以在Unix / Linux中使用 nm command 来获取二进制符号列表。
如果函数未内联,则其符号名称将出现在二进制文件中。
答案 3 :(得分:0)
'inline'不是函数的属性,函数可以是内联的也可以是非内联的。当你调用一个函数时,编译器决定是否内联,如果有多个调用,编译器可以为不同的调用选择不同的选项。如果至少有一个非内联调用,该函数将出现在符号表中。如果它被导出,它也将出现在符号表中。
因此无法检查内联功能是否有内容,您只能通过逆向工程检查内联或不内联的特定呼叫。