1

私は、リンカーには通常、元の名前ではなく、マングルされた名前が渡されると述べているC++の本を読んでいます。だから、私は壊れた名前がどのように見えるかを見ようとしています。したがって、Testというクラスを作成しました。このクラスには、関数のシグネチャが含まれているだけで、name_mangling.cppというファイルに保存されています。

次に、mainメソッドで、これらの関数を呼び出します。最初にファイルを.oにコンパイルしてから、次のようなコマンドでリンクしてみました

g++ -o name_mangling name_mangling.o

壊れた名前を見たいと思っていましたが、g++は次のような実際の名前を出力しました

undefined reference to `Test::Test(char const*)'

しかし一方で、.soなどの共有オブジェクトにリンクしようとすると、名前が壊れてしまうのを見てきました。上記の場合ではなく、.soの場合にg ++がマングルされた名前を出力するのはなぜですか?

4

1 に答える 1

3

コードで記述された実際の名前と実際の名前を知っているため、マングルされた名前は表示されません。名前のスペルが間違っている可能性があることを考えると、壊れた名前を表示することは逆効果です (そして、壊れた名前は扱いにくくなります)。

前述のように、Linux/GCC では、マングルされた名前を出力する「nm」ツールがあります。Windows では、 Visual C++ のサンプルの一部であったDependency Walkerを試すことができます。これは、起動時に必要なすべてのダイナミック リンク ライブラリを確実に取得するのにも非常に役立ちます。

于 2012-08-05T17:56:08.977 に答える