ビルド プロセスの一環として、実行可能ファイルをコンパイルするときにマップ ファイルを生成します。例えば:
g++ -Wl,-Map,/tmp/foo.map -o foo foo.cpp
GCC 4.3/4.4 から GCC 4.9 に移行するために、新しいビルド サーバーをセットアップしました。4.9 ビルド サーバーによって生成されたマップ ファイルには、マングルされたシンボル名はありません。4.3/4.4 ビルド サーバーによって生成されたマップ ファイルはそうです。たとえば、上記を 4.3 で実行すると、マップ ファイルで次のように切り取られます。
.plt 0x0000000000400700 0x90 /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/crt1.o
0x0000000000400710 _ZNSolsEi@@GLIBCXX_3.4
0x0000000000400720 _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
0x0000000000400730 __libc_start_main@@GLIBC_2.2.5
4.9 に対して同じコードを実行すると、次のスニペットが得られます。
.plt 0x00000000004006e0 0x80 /usr/lib/../lib64/crt1.o
0x00000000004006f0 std::ostream::operator<<(int)@@GLIBCXX_3.4
0x0000000000400700 std::ios_base::Init::Init()@@GLIBCXX_3.4
0x0000000000400710 __libc_start_main@@GLIBC_2.2.5
0x0000000000400720 __cxa_atexit@@GLIBC_2.2.5
この変更は予想されますか? gcc 4.9 (ある種の下位互換性オプション) で破損した出力を生成する方法はありますか? 私たちのビルドの後のツールはシンボル ファイルを使用し、デマングルされた名前を詰まらせているためです。