¿Cómo ver símbolos en archivos de objetos?

81

¿Cómo puedo ver los símbolos en un archivo .o? nm no me funciona. Yo uso g ++ / linux.

nakiya
fuente
5
nm es exactamente lo que usaría. ¿Puedes explicar por qué no te funciona?
nos
1
Dice:nm: Lib1.o: File format not recognized
nakiya
4
@nakiya: Ejecutar file Lib1.oy decirnos cuál es la salida.
DarkDust
4
@nakiya No puede ejecutar un archivo .o. Y si compila un archivo de encabezado, produce encabezados precompilados con versiones recientes de gcc, no archivos de objeto. Debe compilar archivos .cpp, no archivos de encabezado.
nos
1
@nakiya: No puede ejecutarlo, realmente debería escribir el texto " file Lib1.o" en su shell. La herramienta llamada filele dice el tipo de archivo de Lib1.o, es decir, si realmente es un archivo de objeto. Lo dudo.
DarkDust

Respuestas:

100

En lugar de nm, puedes usar el poderoso objdump. Consulte la página del manual para obtener más detalles. Prueba objdump -t myfileo objdump -T myfile. Con la -Cbandera también puede exigir nombres de C ++, como nmhace.

DarkDust
fuente
1
Probé ObjDump también. Mismo resultado:objdump: Lib1.o: File format not recognized
nakiya
2
tryobjdump -t Lib1.o
mustafa
13

¿Ha estado utilizando un compilador cruzado para otra plataforma? Si es así, debe utilizar el comando respectivo nmo objdump.

Por ejemplo, si ha utilizado XXX-YYY-gccpara compilar el archivo .o, debe utilizar XXX-YYY-nmo XXX-YYY-objdumpprocesar los archivos.

Schedler
fuente
5

Solo corre: nm you_obj_file.o | c++filt

Jee lee
fuente
4

Hay un comando para ver qué funciones están incluidas en un archivo de objeto, biblioteca o ejecutable:

nm
Alok Save
fuente
4
El OP declaró directamente que no puede usar nm.
ivan_pozdeev
2

Puede utilizar nm -C .o/lib/exe, por ejemplo:

xiongyu@ubuntu:~/tmp/build$ nm -C libfile1.a 

file1.cpp.o:
0000000000000000 T f()
0000000000000000 W int fun<int>(int)

usarlo nm -Cserá más legible , si solo usa nm:

xiongyu@ubuntu:~/tmp/build$ nm libfile1.a 

file1.cpp.o:
0000000000000000 T _Z1fv
0000000000000000 W _Z3funIiET_S0_

como vemos, no es tan legible.

A continuación se muestra lo que me file1.cppgusta:

xiongyu@ubuntu:~/tmp/build$ vi ../file1.cpp 
#include "head.h"
void f()  {
     int i = fun<int>(42);
}
Jayhello
fuente