1. ホーム
  2. c++

[解決済み] gxx_personality_v0は何のためにあるのですか?

2022-11-02 23:41:58

質問

OS開発サイトからの又聞きなのですが、どこにもまともな説明がなく、気になったので質問します。

gccを使用して自立型C++プログラムをコンパイル・リンクすると、時々このようなリンカーエラーが発生します。

out/kernel.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'

これは、このシンボルが libstdc++ で定義されており、フリースタンディング環境では欠落しているためと思われます。この問題を解決するには、単にこのシンボルをどこかで定義する必要があります。

void *__gxx_personality_v0;

それはいいのですが、私は魔法のように動くものが好きではありません...。そこで質問ですが、この記号は何のためにあるのでしょうか?

どのように解決するのですか?

これはスタック・アンワイディング・テーブルで使用されます。 別の質問に対する私の答え . その回答で述べたように、その使用は Itanium C++ ABI と呼ばれています。 パーソナリティ・ルーチン .

グローバルなNULL voidポインタとして定義することでquot;work"するのは、おそらく何も例外をスローしていないからでしょう。何かが例外を投げようとするとき、あなたはそれが誤動作するのを見るでしょう。

もちろん、何も例外を使用していないのであれば、例外を無効にするために -fno-exceptions で無効にできます (また、RTTI を使っているものがなければ -fno-rtti ). もしそれらを使っているならば、(他の回答がすでに指摘しているように)リンクに g++ の代わりに gcc を追加します。 -lstdc++ を追加します。