2016-12-09 9 views
2
extern int test(); 
int main() 
{ 
    return test(); 
} 

gcc -c -o test.o test.cでコードをビルドします。nm test.oを実行すると名前のマングリングがないことがわかります。 nmtestですが、_testは出力しません。名前がマングリングしないのはなぜですか?

私の環境では、名前の符号化は、Cプログラムでは発生しませんubuntu 16.04gcc 5.4.0

+0

本当に_name mangling_ではありませんが、関数名にアンダースコアを追加するのは、使用するツールチェーンに依存します。 C16xマイクロコントローラ用に開発中、KeilとTaskingのツールを使用しました。 1つは_を追加し、もう一方は追加しませんでした。同じCPUアーキテクチャであっても。したがって、C関数の呼び出し規約は、ツールチェーンのマニュアルまたはCPUのEABIの説明を参照する必要があります。 – Gerhardh

答えて

3

グローバルシンボルの先頭にアンダースコアが追加されていると思われるようです。これは、Linuxが使用するオブジェクト形式であるELFで行われていないことです。 a.outやcoffのような古いバイナリフォーマットでは、ELFは必要としませんでした。

Btw。 「mangling」という用語は、通常、C++のシンボルマングリングのために使用されます。これは別のものです。

1

です。 C++プログラムで発生します。

Cで関数をオーバーロードすることはできませんが、C++では関数をオーバーロードできません。

1

main関数が返す機能testを呼び出した後testの戻り値は、その後mainの戻り値に与えられています。

名前のマングリングは不要です。

関連する問題