我有一个共享的obj文件说a.so,并且我想了解一个特定的函数(比如fname)是否内联。我尝试了以下4种方法并获得了不同的答案:nm,objdump&pfunct给出了矛盾的答案来检查一个函数是否内联
1) nm a.so | grep fname
- >这并不表示任何o/p表示函数是内联的。 请让我知道这是否足够检查一个函数是否内联。
2) objdump -d a.so | grep fname
- >这没有给出任何o/p意味着函数被内联。如果我在这里得出结论,请纠正我。
3) objdump -W a.so
- >的功能FNAME,这给了我下面的O/P的最后一行,其中说: “声明为内联却忽略了”
DW_AT_name : (indirect string, offset: 0x10411): fname
DW_AT_decl_file : 246
DW_AT_decl_line : 40
DW_AT_prototyped : 1
DW_AT_inline : 2 (declared as inline but ignored)
4)pfunct -G a.so | grep fname
- >这个矮人实用程序显示函数fname暗示该函数未被内联。
现在前两种方式暗示该函数内联,而其余两个则表示相反。任何人都可以请解释以下内容:
1) Why are there differences in the above 4 ways ?
2) Are there any known issues with objdump and pfunct ?
3) Also let me know the best way to check if a function is inlined or not.
任何帮助将不胜感激。谢谢 !!!
函数可能在某些地方内联,而不在其他地方内联。你的函数是否在.so中被调用? – 2014-08-27 12:18:05
是的,这个函数是静态的,只在那个.c文件的一个地方调用。 – mezda 2014-08-27 12:27:25
这个共享的obj文件是用调试信息编译的吗?如果没有,那么一个成功的内联函数将没有证据表明它曾经是一个函数。 – 2014-08-27 12:38:01