オブジェクトファイル内のシンボルを表示する方法は?


83

.oファイルのシンボルを表示するにはどうすればよいですか?nmは私には機能しません。私はg ++ / linuxを使用しています。


5
nmはまさにあなたが使用するものです。それがどのように機能しないのか説明できますか?
nos

1
それは言う:nm: Lib1.o: File format not recognized
nakiya 2010年

4
@nakiya:実行file Lib1.oして、出力が何であるかを教えてください。
DarkDust 2010年

4
@ nakiya.oファイルを実行することはできません。また、ヘッダーファイルをコンパイルすると、オブジェクトファイルではなく、最新のgccバージョンでプリコンパイル済みヘッダーが生成されます。ヘッダーファイルではなく、.cppファイルをコンパイルする必要があります。
nos

1
@nakiya:実行できませんfile Lib1.o。シェルに「」というテキストを入力する必要があります。と呼ばれるツールはfile、Lib1.oのファイルタイプ、つまりそれが本当にオブジェクトファイルであるかどうかを示します。疑わしい。
DarkDust 2010年

回答:


101

の代わりにnm、強力なを使用できますobjdump。詳細については、manページを参照してください。objdump -t myfileまたはを試してくださいobjdump -T myfile-Cフラグを使用すると、C ++名をデマングルすることもできますnm


1
ObjDumpも試してみました。同じ結果:objdump: Lib1.o: File format not recognized
nakiya 2010年

2
試してみてくださいobjdump -t Lib1.o
ムスタファ2014

13

別のプラットフォームでクロスコンパイラを使用しましたか?その場合は、それぞれnmまたはobjdumpコマンドを使用する必要があります。

たとえばXXX-YYY-gcc、.oファイルのコンパイルに使用したことがある場合は、ファイルを使用XXX-YYY-nmまたはXXX-YYY-objdump処理する必要があります。



4

オブジェクトファイル、ライブラリ、または実行可能ファイルに含まれている関数を確認するコマンドがあります。

nm

4
OPは、彼は使用できないと直接述べましたnm
ivan_pozdeev 2016年

2

nm -C .o/lib/exeたとえば、次のように使用できます。

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

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

nm -Cあなたが単に使用する場合、それを使用すると、より読みやすくなりますnm

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

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

私たちが見るように、それはそれほど読みにくいです。

以下は私のfile1.cpp好きなものです:

xiongyu@ubuntu:~/tmp/build$ vi ../file1.cpp 
#include "head.h"
void f()  {
     int i = fun<int>(42);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.