Scroll to navigation

C++FILT(1) GNU Development Tools C++FILT(1)

名前

c++filt - C++ と Java シンボルの デコード(demangle)

書式

c++filt [-_|--strip-underscore]
[-n|--no-strip-underscore]
[-p|--no-params]
[-t|--types]
[-i|--no-verbose]
[-r|--no-recurse-limit]
[-R|--recurse-limit]
[-s format|--format=format]
[--help] [--version] [symbol...]

説明

C++言語とJava言語には関数オーバーロードが用意されています。つまり、各関数が異なる型のパラメータを取る場合、同じ名前で多くの関数を記述できます。これらの似たような名前の関数を区別できるように、C++ と Java はそれらを、それぞれの異なるバージョンを一意に識別する低レベルのアセンブラ名にエンコードします。 このプロセスは mangling (訳注: エンコード) として知られています。c++filt [1]プログラムは逆のマッピングを行います。これはローレベルの名前をユーザーレベルの名前にデコード (demangles) して、読み取り可能にします。

入力含まれるすべての英数字の単語 (文字、数字、アンダースコア、ドル記号 ($) 、またはピリオドで構成される) は、潜在的にエンコード (mangled) された名前です。 名前が C++ 名にデコードされた場合、出力中のローレベルの名前が C++ 名に置き換えられます。それ以外の場合は、元の単語が出力されます。 このようにして、エンコード (mangled) された名前を含むアセンブラソースファイル全体を c++filt 経由で渡すことができ、デコード (demangled) された名前を含んだ同じソースファイルを見ることができます。

c++filt を使用して、以下のようにコマンドラインに渡すことで、個々のシンボルを解読することもできます。

        c++filt <symbol>

symbol 引数がない場合、 c++filt はシンボル名を標準入力から読み込みます。すべての結果は標準出力に表示されます。コマンドラインから名前を読み込むことと、標準入力から名前を読み込むことの違いは、コマンドライン引数はエンコード (mangled) された名前であることが期待され、前後のテキストと区別するためのチェックが行われないことです。たとえば、次のようになります:

        c++filt -n _Z1fv

これは機能し、名前を "f()" にデコード (demangle) しますが、一方:

        c++filt -n _Z1fv,

は動きません。(エンコード (mangled) された名前の最後に余分なコンマがあるため、無効になっていることに注意してください)。ただし、次のコマンドは機能します:

        echo _Z1fv, | c++filt -n

は "f()," を表示します。すなわち、デコード (demangled) された名前の後にコンマが続きます。これは、標準入力から読み込まれた名前がアセンブラソースファイルの一部であることを想定しているためです。アセンブラソースファイルでは、エンコード (mangled) された名前の後に余分な文字が続くことがあります。たとえば以下のようなものです:

            .type   _Z1fv, @function

オプション

-_
一部のシステムでは、 C コンパイラと C++ コンパイラの両方で、すべての名前の前にアンダースコアが付けられます。. たとえば、C での名前 "foo" は、ローレベルの名前 "_foo" を取得します。このオプションを使用すると、最初のアンダースコアが削除されます。c++filt がデフォルトでアンダースコアを削除するかどうかは、ターゲットに依存します。
先頭のアンダースコアを削除しません。.
関数名を デコード (demangling) するときに、関数のパラメータの型を表示しません。
タイプと関数名をデコード (demangle) しようとします。これはデフォルトで無効になっています。なぜなら、エンコード (mangled) された型は通常、コンパイラの内部でのみ使用され、 非エンコード (non-mangled) の名前と混同される可能性があるからです。例えば、 "a" という名前の関数がエンコード (mangled) された型の名前として扱われる場合、 "signed char" にデコード (demangled) されることになります。
実装の詳細(存在する場合)を、デコード (demangled) した出力に含めません。
文字列の削除中に実行される再帰の量の制限を有効または無効にします。名前をエンコード (mangling) する形式は無限レベルの再帰を許すので、デコード操作がホストマシンで利用可能なスタック空間の量を使い果たし、メモリ障害を引き起こすような文字列を作成する可能性があります。この制限では、再帰を 2048レベルまでのネストに制限することで、これが発生しないようにしています。

デフォルトでは、この制限は有効になっていますが、本当に複雑な名前をデコード (demangle) するには無効にする必要がある場合があります。ただし、再帰制限が無効になっている場合は、スタックが枯渇する可能性があり、そのようなイベントに関するバグレポートは拒否されることに注意してください。

-r オプションは、--no-recurse-limit オプションの同義語です。-R オプションは、--recurse-limit オプションの同義語です。

c++filt は、異なるコンパイラによって使用されるさまざまなエンコード (mangling) メソッドをデコードできます。このオプションの引数は、以下のように使用する方式を選択します:
"auto"
実行可能ファイルに基づく自動選択(デフォルトの方式)
"gnu"
GNU C++ コンパイラ (g++) で使われているもの
"lucid"
Lucid コンパイラ (lcc) で使われているもの
"arm"
C++ Annotated Reference Manual で規定されたもの
"hp"
HP コンパイラ (aCC) で使われるもの
"edg"
EDG のコンパイラで使われるもの
"gnu-v3"
GNU C++ のコンパイラ (g++) が V3 ABI とともに使われるもの
"java"
GNU Java コンパイラ (gcj) で使われるもの
"gnat"
GNU Ada コンパイラ (GNAT) で使われるもの。
オプションの概要を c++filt に出力して終了します。
c++filt のバージョンを表示して終了します。
@file
file からコマンドラインオプションを読み込みます。読み込まれた オプションは、元の @file オプションの代わりに挿入されます。 fileが存在しない場合、または読み込めない場合、オプションは 文字通りに扱われ、削除されません。

file 中のオプションは空白で区切られます。空白文字は、オプション 全体を一重引用符または二重引用符で囲むことによってオプションに含める ことができます。任意の文字 (バックスラッシュを含む) は、含まれる文字の 前にバックスラッシュを付けることによって含めることができます。 file 自体に追加の @file オプションを含めることができます。 このようなオプションは再帰的に処理されます。

FOOTNOTES

1.
 MS-DOSではファイル名に C<+> 文字を使用できないため、このプログラムは B<CXXFILT> という名前になります。
    

関連項目

binutils の Info エントリ.

著作権

Copyright (c) 1991-2025 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

2025-09-17 binutils-2.45.50