名前マングリング
別名: name mangling
同じ名前の関数が複数定義可能であるときに適切にリンクを行えるように、シンボルに識別できる情報を付与すること。mangleには「文章などをわからなくする」という意味がある。 具体例
code:c
void foo() {}
int main() { return 0; }
というコードをCとC++でそれぞれコンパイルする。 code:txt(sh)
$ nm a.out | grep foo
0000000000001129 T foo
$ nm b.out | grep foo
0000000000001129 T _Z3foov
と、Cはfooだが、C++は_Z3foovとマングルされている。
マングルされた名前は常に_Zから始まる。
3は名前が3文字だということ。
vは引数の型名。
nmコマンドの--demangleオプションでデマングルでき、
code:txt
$ nm --demangle b.out | grep foo
0000000000001129 T foo()
と元の関数名がわかる。
関数名とマングルされた名前の対応例
table:一覧
void foo() _Z3foov foo()
void fooo() _Z4fooov fooo()
void foooo() _Z5foooov foooo()
int foo(int x) _Z3fooi foo(int)
void foo(int x, int y) _Z3fooii foo(int, int)
void foo(std::string s) _Z3fooNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE foo(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >