あるべるのIT関連メモ

素人エンジニアが何かするときに困ったものなどを参考程度にメモっておこうかと

C++ 名前マングリングとは

何度か耳にしたことある単語"名前マングリング"
これが何を指すのか気にするシーンがなかったので今まで放置してきたけど
この本を読んでいて出てきたのでついにちゃんと調べた。
Amazon CAPTCHA

名前マングリングとは

C++では関数の多重定義などに対応するため関数のシンボル名に引数の型などの情報が付与される。

例えば下記のadd()関数

void add() { }

Cコンパイラアセンブリ出力すると(gccの場合)

_add

と、関数名の前にアンダースコアを付けただけのシンボル名になっている。

同じくC++コンパイラアセンブリ出力すると(g++の場合)

_Z3addv

となにやら色々な情報が付与されたシンボル名となっている。

なぜ?

上述のとおり、
名前空間や多重定義などで同じ名前の関数が複数定義可能であり
コンパイラは適切な関数へのリンクを行うためにそれらを区別できる情報を付与します。
関数の名前や型をシンボルに埋め込むことをマングリングと言うそうです。

2016/11/21 追記
>nm foo.o

でシンボル名を調べることができる。

>nm --demangle foo.o

のように"--demangle"オプションを与えるとデマングルされたシンボル名を見られる。