Name Mangling in C++ (五)

2014-11-24 12:06:07 · 作者: · 浏览: 2
e_mangling]$ nm func.cpp
4.
5. nm: func.cpp: File format not recognized
6.
7. [lichao@sg01 name_mangling]$ nm func.o
8.
9. 0000000000000060 t _GLOBAL__I__Z9test_funcRiPKcdSsf
10. U _Unwind_Resume
11. 0000000000000022 t _Z41__static_initialization_and_destruction_0ii
12.
13. 0000000000000000 T _Z9test_funcRiPKcdSsf
14.
15. U _ZNSaIcEC1Ev
16. U _ZNSaIcED1Ev
17. U _ZNSsC1EPKcRKSaIcE
18. U _ZNSsC1ERKSs
19. U _ZNSsD1Ev
20. U _ZNSt8ios_base4InitC1Ev
21. U _ZNSt8ios_base4InitD1Ev
22. 0000000000000000 b _ZSt8__ioinit
23.
24. U __cxa_atexit
25. U __dso_handle
26. U __gxx_personality_v0
27. 0000000000000076 t __tcf_0
28.
29. 000000000000008e T main
加粗的那行就是函数test_func经过name mangling之后的结果,其中:
l Ri,表示对整型变量的引用
l PKc:表示const char *指针
l Ss:目前还没有找到原因。先留着~
l f:表示浮点型
name demangling
C++的name mangling技术一般使得函数变得面目全非,而很多情况下我们在查看这些符号的时候并不需要看到这些函数name mangling之后的效果,而是想看看是否定义了某个函数,或者是否引用了某个函数,这对于我们调试程序是非常有帮助的。
所以需要一种方法从name mangling之后的符号变换为name mangling之前的符号,这个过程称之为name demangling.事实上有很多工具提供这些功能,最常用的就是c++file命令,c++filt命令接受一个name mangling之后的符号作为输入并输出demangling之后的符号。例如:

1. [lichao@sg01 name_mangling]$ c++filt _Z9test_funcRiPKcdSsf
2.
3. test_func(int&, char const*, double, std::basic_string, std::allocator >, float)
一般更常用的方法为:

1. [lichao@sg01 name_mangling]$ nm func.o | c++filt
2.
3. 0000000000000060 t global constructors keyed to _Z9test_funcRiPKcdSsf
4.
5. U _Unwind_Resume
6. 0000000000000022 t __static_initialization_and_destruction_0(int, int)
7.
8. 0000000000000000 T test_func(int&, char const*, double, std::basic_string, std::allocator >, float)
9.
10. U std::allocator::allocator()
11.
12. U std::allocator::~allocator()
13.
14. U std::basic_string, std::allocator >::basic_string(char const*, std::allocator const&)
15.
16. U std::basic_string, std::allocator >::basic_string(std::basic_string, std::allocator > const&)
17.
18. U std::basic_string, std::allocator >::~basic_string()
19.
20. U std::ios_base::Init::Init()
21. U std::ios_base::Init::~Init()
22. 0000000000000000 b std::__ioinit
23.
24. U __cxa_atexit
25. U __dso_handle
26. U __gxx_personality_v0
27. 0000000000000076 t __tcf_0
28.
29. 000000000000008e T main
另外使用nm命令也可以demangle符号,使用选项-C即可,例如:

1. [lichao@sg01 name_mangling]$ nm -C func.o
2.
3. 0000000000000060 t global constructors keyed to _Z9test_funcRiPKcdSsf
4.
5. U _Unwind_Resume
6. 0000000000000022 t __static_initialization_and_destruction_0(int, int)
7.
8. 0000000000000000 T test_func(int&, char const*, double, std::string, float)
9.
10. U std::allocator::allocator()
11.
12. U std::allocator::~allocator()
13.
14. U std::basic_string, std::allocator >::basic_string(char const*, std::allocator const&)
15.
16. U std::basic_string, std::allocator >::basic_string(std::string const&)
17.
18. U std::basic_string, std: