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