extern int test();
int main()
{
return test();
}
gcc -c -o test.o test.c
でコードをビルドします。nm test.o
を実行すると名前のマングリングがないことがわかります。 nm
はtest
ですが、_test
は出力しません。名前がマングリングしないのはなぜですか?
私の環境では、名前の符号化は、Cプログラムでは発生しませんubuntu 16.04
gcc 5.4.0
extern int test();
int main()
{
return test();
}
gcc -c -o test.o test.c
でコードをビルドします。nm test.o
を実行すると名前のマングリングがないことがわかります。 nm
はtest
ですが、_test
は出力しません。名前がマングリングしないのはなぜですか?
私の環境では、名前の符号化は、Cプログラムでは発生しませんubuntu 16.04
gcc 5.4.0
グローバルシンボルの先頭にアンダースコアが追加されていると思われるようです。これは、Linuxが使用するオブジェクト形式であるELFで行われていないことです。 a.outやcoffのような古いバイナリフォーマットでは、ELFは必要としませんでした。
Btw。 「mangling」という用語は、通常、C++のシンボルマングリングのために使用されます。これは別のものです。
です。 C++プログラムで発生します。
Cで関数をオーバーロードすることはできませんが、C++では関数をオーバーロードできません。
main
関数が返す機能test
を呼び出した後test
の戻り値は、その後main
の戻り値に与えられています。
名前のマングリングは不要です。
本当に_name mangling_ではありませんが、関数名にアンダースコアを追加するのは、使用するツールチェーンに依存します。 C16xマイクロコントローラ用に開発中、KeilとTaskingのツールを使用しました。 1つは_を追加し、もう一方は追加しませんでした。同じCPUアーキテクチャであっても。したがって、C関数の呼び出し規約は、ツールチェーンのマニュアルまたはCPUのEABIの説明を参照する必要があります。 – Gerhardh