欢迎使用CSDN-markdown编辑器
来源:互联网 发布:淘宝代理兼职好不好做 编辑:程序博客网 时间:2024/06/03 09:31
c++filt
由于每一个重载的函数都使用与原函数相同的名称,因此,支持函数重载的语言必须拥有一种机制,以区分同一个函数的许多重载版本。下面的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无法显示这些信息。在逆向工程过程中,这些信息可能非常重要。在更复杂的情况下,这些额外信息中可能还包含与类名称或函数调用约定有关的信息。
转载: http://book.51cto.com/art/201005/197787.htm
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- android 自定义标题栏
- C++/CLI中MFC与.NET的互操作
- 云计算领域顶级期刊会议列表
- LeetCode_OJ【12】【13】Integer to Roman && Roman to Integer
- Objective-C 【NSString 的其他常见用法】
- 欢迎使用CSDN-markdown编辑器
- poj 3984 迷宫问题
- u-boot Makefile -- make xxx_config分析
- cf 577B
- 【摘自百度知道】一个字符等于几个字节
- 检测应用是否安装和检测版本更新,反之提供下载地址并安装应用(V1.2)
- Linux删除重复行的命令
- 冒泡排序
- 将RGB数据写入BMP位图文件