libstd++
コード ベースの簡単な grep により、次の 2 つの使用法が明らかになりました__gx_personality_v0
。
libsupc++/unwind-cxx.h 内
// GNU C++ personality routine, Version 0.
extern "C" _Unwind_Reason_Code __gxx_personality_v0
(int, _Unwind_Action, _Unwind_Exception_Class,
struct _Unwind_Exception *, struct _Unwind_Context *);
libsupc++/eh_personality.cc 内
#define PERSONALITY_FUNCTION __gxx_personality_v0
extern "C" _Unwind_Reason_Code
PERSONALITY_FUNCTION (int version,
_Unwind_Action actions,
_Unwind_Exception_Class exception_class,
struct _Unwind_Exception *ue_header,
struct _Unwind_Context *context)
{
// ... code to handle exceptions and stuff ...
}
(注: 実際にはそれよりも少し複雑です。詳細を変更できる条件付きコンパイルがいくつかあります)。
したがって、コードが実際に例外処理を使用していない限り、シンボルを として定義してvoid*
も何の影響もありませんが、影響が及ぶとすぐにクラッシュします-__gxx_personality_v0
グローバルオブジェクトではなく関数なので、試してみてください関数を呼び出すと、アドレス 0 にジャンプし、segfault が発生します。