我可以使用其标识符对枚举器进行解码吗?

时间:2016-02-05 17:19:51

标签: c++ gcc symbols abi

假设我写了以下内容:

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)0Color)1是模板参数,而不是RedGreenColor::RedColor::Green

显然,我不能以我喜欢的方式破坏名字。但是 - 我真的希望能够获得(或写出?)demangling调用的变体而不是"Color foo<(Color)1>()"返回"Color foo<(Color:Green>()"(或"Color foo<(Green>()"。这可行吗?

1 个答案:

答案 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