2015-12-22 18 views
6

Als Teil unseres Build-Prozesses generieren wir eine Map-Datei, wenn wir unsere ausführbare Datei kompilieren. Zum Beispiel:Linker-Map-Datei hat manchmal verstümmelte Symbole, aber nicht immer

g++ -Wl,-Map,/tmp/foo.map -o foo foo.cpp 

In einem Versuch von GCC 4.3/4,4-4,9 GCC migrieren wir Setup einen neuen Build-Server haben. Die Map-Datei, die vom 4.9-Build-Server generiert wird, enthält keine ungültigen Symbolnamen. Die Map-Datei, die von den 4.3/4.4-Build-Servern generiert wird, tut dies. die oben läuft zum Beispiel mit 4.3 ich dies in der Map-Datei snipped erhalten:

.plt   0x0000000000400700  0x90 /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/crt1.o 
       0x0000000000400710    [email protected]@GLIBCXX_3.4 
       0x0000000000400720    [email protected]@GLIBCXX_3.4 
       0x0000000000400730    [email protected]@GLIBC_2.2.5 

Ausführen des gleichen Code gegen 4.9 Ich erhalte die folgenden Ausschnitt:

.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    [email protected]@GLIBC_2.2.5 
       0x0000000000400720    [email protected]@GLIBC_2.2.5 

Ist diese Änderung zu erwarten? Gibt es eine Möglichkeit, eine fehlerhafte Ausgabe mit gcc 4.9 zu erzeugen (eine Art Rückwärtskompatibilität)? Ich frage, weil spätere Tools in unserem Build die Symboldatei verwenden und auf den entfremdeten Namen ersticken.

Antwort

1

Gibt es eine Möglichkeit mit gcc verstümmelten Ausgabe zu erzeugen 4,9

Die Map-Datei Generation hat nichts mit der Version von GCC zu tun, und alles mit der Version von Linker zu tun Sie verwenden (die müssen zwischen dem alten und dem neuen Build-Server unterschiedlich sein).

Von 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. 

Ich vermute, dass der ältere Linker nicht die Aufmerksamkeit auf --demangle zu zahlen hat, wenn die Ausgabe der Karte zu erzeugen, und die neueren Linker haben, dass festgelegt.

+0

Danke, Hinzufügen --no-demangle behoben das Problem. – Pace