コンパイラは最終的にはバイナリの実行ファイルを生成するわけだが、少なくともCやC++の場合は分割コンパイルができるので複数のオブジェクトファイルをリンカで結びつけることになっている。リンカはC言語の形式でしか名前を処理できないので、コンパイラはC++の場合でもマングリングと呼ばれるC言語形式への書き換え処理を行ってくれている。
大まかなルールはwikipediaによると、
修飾された名前は全て _Z で始まる。下線に大文字を続けたものはCおよびC++では予約語であることに注意されたい。従って、ユーザの識別子とぶつかることはない。ネストされた名前は(名前空間、クラス両者)、Nをつけ、次いで <長さ,id> のペアをつけて示す(「長さ」は次の識別子の長さ)。最後にEを付ける。
とある。std::basic_filebuf<char, std::char_traits<char>>::~basic_filebuf()
から_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev
が生成されるのを見るに、多少順番は前後するが、
std | :: | basic_... | < | char | std | :: | char_traits | < | char | > | > | :: | ~basic_... | () | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
_ZN | St | 13basic... | I(l1) | c | St | 11char_... | I(l2) | c | E(←l2) | E(←l1) | D1 | E(←_ZN) | v(void) |
実際の規則はとても複雑である。。。*1
参考
マングリング
- 名前修飾 - Wikipedia
- Demangling C++ Symbols: 単なる置き換えだけでなく、マングリングの際に文字列の圧縮も行われるらしい
- https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling: (*1) gccとclangはこの規則に従っている
- gcc/mangle.c at master · gcc-mirror/gcc · GitHub: gccのソースコード
デマングリング
- C++ のシンボルをデマングルする - bkブログ
- GCC and MSVC C++ Demangler: 名前を入力したらデマングルしてくれるウェブサイト
- GitHub - eklitzke/demangle: Tool to demangle C++ symbols.: デマングルするプログラムを書く人は複数(↑←)存在するらしい