c++ - plantillas - que es using namespace std en programacion
¿Se pueden objdump anular nombres de las funciones de la plantilla de C++? (2)
c++filt
través de c++filt
? Es posible que deba -n
dependiendo de si los símbolos vienen sin / o sin el guión bajo.
Tengo un archivo de objetos de C ++ que contiene instancias de algunas funciones de la plantilla de C ++. El archivo objeto en cuestión crea una instancia de la misma función para algunas combinaciones diferentes de parámetros de plantilla. Estoy tratando de solucionar un problema y me gustaría ver el desmontaje de una instanciación específica de la función de plantilla (es decir, conozco los parámetros de plantilla para la función que deseo examinar). Normalmente haría esto usando objdump
para desensamblar el archivo de objeto, pero (al menos de forma predeterminada) no puede deshacer los nombres de las funciones de C ++. ¿Hay alguna manera de hacer esto? Los archivos de objetos se crearon usando gcc 4.6.1.
objdump -C
La bandera -C
habilita el desmangle:
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 salida contiene nombres descompuestos:
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)>:
Sin -C
, contiene nombres destrozados en su lugar:
0000000000000639 <_Z3addIiET_S0_S0_>:
000000000000064d <_Z3addIdET_S0_S0_>:
man objdump
dice:
Decodifique (desmangle) los nombres de símbolos de bajo nivel en nombres de nivel de usuario. Además de eliminar cualquier guión bajo inicial del sistema, esto hace que los nombres de las funciones de C ++ sean legibles. Diferentes compiladores tienen diferentes estilos de mutilación. El argumento de estilo de desmangling opcional se puede usar para elegir un estilo de desmangling apropiado para su compilador.
nm
también tiene la opción -C
.
Probado en Ubuntu 18.04, g++
7.3.0, objdump
2.30.