Est-ce que objdump peut désactiver les noms des fonctions de template C++?

j'ai un fichier objet C++ qui contient des instanciations de certaines fonctions de template C++. Le fichier objet en question instancie la même fonction pour quelques combinaisons différentes de paramètres de template. J'essaie de déboguer un problème et je voudrais regarder le démontage d'une instanciation spécifique de la fonction template (c'est-à-dire, je connais les paramètres du template pour la fonction que je veux examiner). Je le ferais typiquement en utilisant objdump pour démonter l'objet file, mais il (au moins par défaut) n'est pas capable de désactiver les noms des fonctions C++. Est-il possible de faire cela? Les fichiers d'objets ont été créés en utilisant gcc 4.6.1.

16
demandé sur Jason R 2012-02-23 22:47:06

2 réponses

passe par c++filt ? Pourrait avoir besoin de lui donner -n selon que les symboles viennent w/ ou w/o le premier underscore.

15
répondu smparkes 2012-02-23 18:49:10

objdump -C

le drapeau -C permet le démanglage:

printf '
template<typename T>
T add(T x, T y) {
    return x + y;
}

void h() {
    add(1, 2);
    add(1.0, 2.0);
}
' > a.cpp
g++ -g -std=c++11 a.cpp
objdump -CS a.out

la sortie contient des noms démangés:

int main() {
    add(1, 2);
 60c:   e8 28 00 00 00          callq  639 <int add<int>(int, int)>
    add(1.0, 2.0);
 62d:   e8 1b 00 00 00          callq  64d <double add<double>(double, double)>

0000000000000639 <int add<int>(int, int)>:

000000000000064d <double add<double>(double, double)>:

sans -C , il contient des noms mutilés à la place:

0000000000000639 <_Z3addIiET_S0_S0_>:
000000000000064d <_Z3addIdET_S0_S0_>:

man objdump dit:

décoder (démangler) les noms de symboles de bas niveau en noms de niveau utilisateur. Outre suppression de tout underscore initial préprogrammé par le système, ce qui rend les noms de fonction C++ lisibles. Les différents compilateurs ont des styles de mutilation différents. L'argument de style démangling optionnel peut être utilisé pour choisir un style démangling approprié pour votre compilateur.

nm a aussi l'option -C .

testé à Ubuntu 18.04, g++ 7.3.0, objdump 2.30.

12