2012-02-23 13 views
14

Tengo un archivo de objeto C++ que contiene ejemplos de algunas funciones de plantilla C++. El archivo objeto en cuestión ejemplifica la misma función para algunas combinaciones diferentes de parámetros de plantilla. Estoy intentando depurar 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). Por lo general, hago esto usando objdump para desensamblar el archivo objeto, pero (al menos de manera predeterminada) no es capaz de eliminar los nombres de las funciones C++. ¿Hay alguna manera de hacer esto? Los archivos objeto se crearon usando gcc 4.6.1.¿Puede objdump deshacer nombres de funciones de plantilla C++?

Respuesta

13

Pipe it through c++filt? Podría necesitar darle -n dependiendo de si los símbolos vienen con o sin el guión bajo inicial.

+4

Parece que eso funcionaría. También encontré la opción '-C' para' objdump', que al parecer funciona para mi aplicación al menos. –

+0

@JasonR aún mejor. Históricamente ha habido opciones y nombres variantes como 'nm ++', pero fueron al azar y tuve el hábito de simplemente canalizar todo. – smparkes

+0

@JasonR, gracias por publicar esto ... '-C' no estaba documentado en mi versión de' objdump' (no se muestra con '--help') pero aún así funcionó. –

8

objdump -C lo hace como se menciona en Jason R en un comentario.

man objdump dice:

Decode (demangle) nombres de símbolos de bajo nivel en los nombres de nivel de usuario. Además de eliminar cualquier guion bajo inicial del sistema, esto hace que los nombres de las funciones de C++ sean legibles. Los diferentes compiladores tienen diferentes estilos de manipulación. El argumento de estilo de demanda opcional se puede utilizar para elegir un estilo de demanda adecuado para su compilador.

Salida de ejemplo en una operator new[] encendido y objdump -CSr invocación:

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 

Sin -C que mostraría el nombre revuelto _Znam.

nm también tiene esa opción.

Cuestiones relacionadas