注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++小知识55——C++filt及其用法  

2014-09-18 09:57:29|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C++小知识55——C++filt及其用法

 

今天看陈硕的书,谈到inline展开,上面了一个小方法来判断 C++的可执行文件是DEBUG还是RELEASE版本,或者说如何判断其是一个 –o0  还是-o2,地就是看类模板的短成员函数有没有被inline展开,他还举了一个例子:

Int main()

{

  Std::vector<int> vi;

  Printf(“%zd\n”,vi.size());//这里调用了INLINE函数SIZE()

}

 

G++ -Wall vec.cc  #non-optiized build

Nm  ./a.out |grep size |c++filt

000000000000000004007ac  W std::vector<int,std::allocator<int>>::size() const

//vector<int>::size()没有inline展开,目标文件中出现了函数(弱)定义

nm c++filt - [GNU/Linux]

g++ -Wall –o2 vec.cc    #optimized build

nm  ./a.out  |grep size|c++filt

//没有输出,因为vector<int>::size()inline展开了。

学习就要认真得把基础打好,从一点一滴开始。

 

然后转载别人一篇相关文章:

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明

http://www.blogbus.com/laymantech-logs/160022308.html

 

由于每一个重载的函数都使用与原函数相同的名称,因此,支持函数重载的语言必须拥有一种机制,以区分同一个函数的许多重载版本。下面的C++实例展示了一个名为demo的函数的几个重载版本的原型:

 

void demo(void); 

void demo(int x); 

void demo(double x); 

void demo(int x, double y); 

void demo(double x, int y); 

void demo(char* str);

通常,一个目标文件中不能有两个名称相同的函数。为允许重载,编译器将描述函数参数类型的信息合并到函数的原始名称中,从而为重载函数生成唯一的函数名称。为名称完全相同的函数生成唯一名称的过程叫做名称改编(name mangling 。如果使用nm转储前面的C++代码的已编译版本中的符号,将得到如下结果(有删减,以突出显示demo的重载版本):

 

idabook# g++ -o cpp_test cpp_test.cpp 

idabook# nm cpp_test | grep demo 

0804843c T _Z4demoPc 

08048400 T _Z4demod 

08048428 T _Z4demodi 

080483fa T _Z4demoi 

08048414 T _Z4demoid 

080483f4 T _Z4demov

C++标准没有为名称改编方案制定标准,因此,编译器设计人员必须自己制定标准。为了译解上面列出的demo函数的重载版本,我们需要一个能够理解编译器(这里为g++)的名称改编方案的工具,c++filt正是这样一个实用工具。c++filt将每个输入的名称看成是改编后的名称(mangled name),并设法确定用于生成该名称的编译器。如果这个名称是一个合法的改编名称,那么,c++filt就输出改编之前的原始名称;如果c++filt无法识别一个改编名称,那它就按原样输出该名称。

 

如果将上面nm输出的结果交给c++filt处理,将可以得到这些函数的原始名称,如下所示:

 

idabook# nm cpp_test | grep demo | c++filt 

0804843c T demo(char*) 

08048400 T demo(double) 

08048428 T demo(double, int) 

080483fa T demo(int) 

08048414 T demo(int, double) 

080483f4 T demo()

值得注意的是,改编名称可能包含其他与函数有关的信息,正常情况下,nm无法显示这些信息。在逆向工程过程中,这些信息可能非常重要。在更复杂的情况下,这些额外信息中可能还包含与类名称或函数调用约定有关的信息。

 

zz from: http://book.51cto.com/art/201005/197787.htm

  评论这张
 
阅读(1244)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017