2017-02-20 3 views
0

を変更していない、私はそれをコンパイルしたバイナリをストリングス私のC++ FILTが正常に動作するようには思えない、何も出力は私のLinux上で

void f(){} 
struct C{void f(){}}; 

を持つ.cppファイルをした、デしよう関数名をマングル:

$c++filt __Z1gv 
__Z1gv 
$c++filt __ZN1C1fEv 
__ZN1C1fEv 

まあ、私が期待どおりに動作していないようです。私はここで何か悪いことをしましたか?私はいくつかの手紙を追加するか、それを動作させるためにいくつかの手紙を削除する必要がありますか?

これらの名前はclangシンボルであることに注意してください.C++ filtは自分のgccバージョンでのみ動作しますか?または、両方のコンパイラをサポートするには、C++ filtに新しいバージョンが必要ですか?

+0

どのように変更された名前を取得しますか? –

+1

'nm'は' strings'ではありません。 'nm -C'は既にデマングルされたシンボルを出力します。 –

答えて

2

-_フラグを渡す必要があります。いくつかのシステムでは

$ c++filt -_ __Z1gv 
g() 
$ c++filt -_ __ZN1C1fEv 
C::f() 

-_
--strip-アンダー

、CおよびC++の両方のコンパイラは、すべての名前の前にアンダースコアを置きます。たとえば、Cの名前「foo」は、ローレベルの名前「_foo」を取得します。このオプションは最初のアンダースコアを削除します。 c++filtがデフォルトでアンダースコアを削除するかどうかは、ターゲットに依存します。

関連する問題