假设我写了以下内容:
enum class Color { Red, Green, Blue, };
template <Color c> Color foo() { return c; }
template Color foo<Color::Green>();
并编译它。当我查看编译代码的objdump时,我得到:
[einpoklum@myhost /tmp]$ objdump -t f.o | grep "\.text\." | sed 's/^.*\.text\.//;' | c++filt
Color foo<(Color)1>()
Color foo<(Color)1>() 000000000000000b Color foo<(Color)1>()
如果我将abi::__cxa_demangle()
用于<cxxabi.h>
(GCC;也许它与您的编译器不同),它也是相似的 - (Color)0
或Color)1
是模板参数,而不是Red
或Green
,Color::Red
或Color::Green
。
显然,我不能以我喜欢的方式破坏名字。但是 - 我真的希望能够获得(或写出?)demangling调用的变体而不是"Color foo<(Color)1>()"
返回"Color foo<(Color:Green>()"
(或"Color foo<(Green>()"
。这可行吗?
答案 0 :(得分:0)
带有调试信息的对象文件 - section .debug_info可能包含有关enum class Color
的信息,它需要一些工具来读取ELF调试信息,语义解析数据并将信息应用/传递给c ++ filt 。我不知道这些工具是否存在(也许,在GDB中它们都粘在一起)
一般来说,使用优化编译的目标文件或剥离的调试信息几乎是不可能的 - 关于enum class Color
的信息不存在...
来自优化构建
objdump -s aaa.o
aaa.o: file format pe-x86-64
Contents of section .text$_Z3fooIL5Color1EES0_v:
0000 554889e5 b8010000 005dc390 90909090 UH.......]......
Contents of section .xdata$_Z3fooIL5Color1EES0_v:
0000 01040205 04030150 .......P
Contents of section .pdata$_Z3fooIL5Color1EES0_v:
0000 00000000 0b000000 00000000 ............
Contents of section .rdata$zzz:
0000 4743433a 20287838 365f3634 2d706f73 GCC: (x86_64-pos
0010 69782d73 65682d72 6576302c 20427569 ix-seh-rev0, Bui
0020 6c742062 79204d69 6e47572d 57363420 lt by MinGW-W64
0030 70726f6a 65637429 20352e33 2e300000 project) 5.3.0..
Debug build有部分内容.debug_info:
0070 00000000 00000000 00000002 436f6c6f ............Colo
0080 720004a3 00000001 01a30000 00035265 r.............Re
0090 64000003 47726565 6e000103 426c7565 d...Green...Blue
00a0 00020004 0405696e 74000566 6f6f3c28 ......int..foo<(
00b0 436f6c6f 7229313e 0001065f 5a33666f Color)1>..._Z3fo
00c0 6f494c35 436f6c6f 72314545 53305f76 oIL5Color1EES0_v
00d0 007b0000 00000000 00000000 000b0000 .{..............
00e0 00000000 00019c06 63007b00 00000100 ........c.{.....
00f0 00