5

ビルド プロセスの一環として、実行可能ファイルをコンパイルするときにマップ ファイルを生成します。例えば:

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 (ある種の下位互換性オプション) で破損した出力を生成する方法はありますか? 私たちのビルドの後のツールはシンボル ファイルを使用し、デマングルされた名前を詰まらせているためです。

4

1 に答える 1

2

gcc 4.9 で壊れた出力を生成する方法はありますか

マップ ファイルの生成は、GCC のバージョンとは関係なく、使用しているリンカーのバージョンとすべて関係があります (古いビルド サーバーと新しいビルド サーバーでは異なる必要があります)。

man ldから:

 --demangle[=style]
 --no-demangle
       These options control whether to demangle symbol names in error
       messages and other output.  When the linker is told to demangle,
       it tries to present symbol names in a readable fashion: it strips
       leading underscores if they are used by the object file format,
       and converts C++ mangled symbol names into user readable names.
       Different compilers have different mangling styles.  The optional
       demangling style argument can be used to choose an appropriate
       demangling style for your compiler.  The linker will demangle by
       default unless the environment variable COLLECT_NO_DEMANGLE is
       set.  These options may be used to override the default.

古いリンカーは出力マップを生成するときに注意を払っていなかったと推測していますが--demangle、新しいリンカーはそれを修正しています。

于 2015-12-24T05:43:38.263 に答える