16.3.2 Name Mangling
Early C++ compilers mangled the names of C++ symbols so that existing
linkers could be used without modification. The cfront C++ translator
also mangled names so that information from the original C++ program
would not be lost in the translation to C. Today, name mangling remains
important for enabling overloaded function names and link-time type
checking. Here is an example C++ source file which illustrates name
mangling in action:
|
class Foo
{
public:
Foo ();
void go ();
void go (int where);
private:
int pos;
};
Foo::Foo ()
{
pos = 0;
}
void
Foo::go ()
{
go (0);
}
void
Foo::go (int where)
{
pos = where;
}
int
main ()
{
Foo f;
f.go (10);
}
$ g++ -Wall example.cxx -o example.o
$ nm --defined-only example.o
00000000 T __3Foo
00000000 ? __FRAME_BEGIN__
00000000 t gcc2_compiled.
0000000c T go__3Foo
0000002c T go__3Fooi
00000038 T main
|
Even though Foo contains two methods with the same name, their
argument lists (one taking an int , one taking no arguments) help
to differentiate them once their names are mangled. The
`go__3Fooi' is the version which takes an int argument. The
`__3Foo' symbol is the constructor for Foo . The GNU
binutils package includes a utility called c++filt that can
demangle names. Other proprietary tools sometimes include a similar
utility, although with a bit of imagination, you can often demangle
names in your head.
|
$ nm --defined-only example.o | c++filt
00000000 T Foo::Foo(void)
00000000 ? __FRAME_BEGIN__
00000000 t gcc2_compiled.
0000000c T Foo::go(void)
0000002c T Foo::go(int)
00000038 T main
|
Name mangling algorithms differ between C++ implementations so that
object files assembled by one tool chain may not be linked by another if
there are legitimate reasons to prohibit linking. This is a deliberate
move, as other aspects of the object file may make them
incompatible--such as the calling convention used for making function
calls.
This implies that C++ libraries and packages cannot be practically
distributed in binary form. Of course, you were intending to distribute
the source code to your package anyway, weren't you?
|