Mam obiekt obiektowy C++, który zawiera wystąpienia niektórych funkcji szablonu C++. Omawiany plik obiektowy tworzy tę samą funkcję dla kilku różnych kombinacji parametrów szablonu. Próbuję debugować problem i chciałbym spojrzeć na demontaż konkretnego wystąpienia funkcji szablonu (to znaczy, znam parametry szablonu dla funkcji, którą chcę zbadać). Zwykle robię to przy użyciu objdump
, aby zdemontować plik obiektowy, ale (przynajmniej domyślnie) nie jest w stanie odłączyć nazw funkcji C++. Czy jest jakiś sposób to zrobić? Pliki obiektowe zostały utworzone przy użyciu gcc 4.6.1.Czy można objdump un-mangle nazwy funkcji szablonu C++?
14
A
Odpowiedz
13
Przeprowadź przez nią c++filt
? Może być konieczne podanie go w zależności od tego, czy symbole pochodzą z/lub bez wiodącego podkreślenia.
8
objdump -C
robi to jak wspomniano przez Jason R w komentarzu.
man objdump
mówi:
Decode (demangle) niskopoziomowe nazwy symboli na nazwy użytkownika szczebla. Oprócz usunięcia początkowego podkreślenia dodawanego przez system, umożliwia to odczytanie nazw funkcji C++. Różne kompilatory mają różne style mangowania. Opcjonalny argument stylu demangowania może być użyty do wyboru odpowiedniego stylu rozplątania dla kompilatora.
Przykładowe wyjście na operator new[]
dalej i objdump -CSr
inwokacji:
char *sn = new char[4];
10: bf 04 00 00 00 mov $0x4,%edi
15: e8 00 00 00 00 callq 1a <main+0x1a>
16: R_X86_64_PC32 operator new[](unsigned long)-0x4
Bez -C
byłoby pokazać zniekształcone nazwy _Znam
.
nm
również ma tę opcję.
Wygląda na to, że to zadziała. Po prostu znalazłem opcję '-C' dla' objdump', która wydaje się działać przynajmniej dla mojej aplikacji. –
@JasonR jeszcze lepiej. Historycznie istniały opcje i odmienne nazwy, takie jak "nm ++", ale były one chybione, a ja nabrałem zwyczaju robienia wszystkiego. – smparkes
@JasonR, dziękuję za opublikowanie tego ... '-C' był nieudokumentowany w mojej wersji' objdump' (nie pokazany z '--help'), ale nadal działał. –