2014-08-27 30 views
3

我有一个共享的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. 

任何帮助将不胜感激。谢谢 !!!

+4

函数可能在某些地方内联,而不在其他地方内联。你的函数是否在.so中被调用? – 2014-08-27 12:18:05

+0

是的,这个函数是静态的,只在那个.c文件的一个地方调用。 – mezda 2014-08-27 12:27:25

+0

这个共享的obj文件是用调试信息编译的吗?如果没有,那么一个成功的内联函数将没有证据表明它曾经是一个函数。 – 2014-08-27 12:38:01

回答

1

由于函数被调用的唯一一个在.c文件的地方,检查的最佳方式,如果内联函数如下:

objdump -d a.so | grep call | grep fname 

如果有任何结果,那么fname不内联。否则,它必须内联,因为它只在一个地方被呼叫而呼叫地点没有找到。

+0

为什么使用上述4种方法的结果差异的解释? – mezda 2014-08-29 10:38:54

+0

4种方法:1)存在时输出'fname'的地址。 2)代码中使用'fname'的输出。它包括1)和'fname'被调用的地方。 3)输出调试信息,如定义行和文件,其签名等。4)对不起,我不知道'pfunct'。 – writalnaie 2014-08-30 00:32:32