nm,objdump& pfunct给出矛盾的答案,检查函数是否内联

时间:2014-08-27 12:12:41

标签: c++ c linux unix objdump

我有一个共享的obj文件说a.so并且我希望看一个特定的函数(比如fname)是否内联。我尝试了4种方法并得到了不同的答案:

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.

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

1 个答案:

答案 0 :(得分:2)

由于函数仅在.c文件中的一个位置调用,因此检查函数是否内联的最佳方法如下:

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

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