私の C プログラムに __gxx_personality_v0 が必要なのはなぜですか?

DDD
リリース: 2024-11-20 19:02:16
オリジナル
430 人が閲覧しました

Why Does My C   Program Need `__gxx_personality_v0`?

__gxx_personality_v0 の目的を理解する

OS 開発フォーラムでよく寄せられた質問により、謎めいた __gxx_personality_v0 シンボルについての調査が始まりました。 gcc を使用して独立した C プログラムをコンパイルおよびリンクすると、ユーザーはこの未定義の参照に関連するリンカー エラーに遭遇することがよくあります。

スタックの巻き戻しの重要性

アセンブリの詳細関連する質問の出力により、__gxx_personality_v0 の本当の性質が明らかになります。 Itanium C ABI で定義されているように、スタック アンワインド テーブルにおいて重要な役割を果たします。パーソナリティ ルーチンと呼ばれることが多いその機能は、例外時にプログラムのスタックを巻き戻す動作を確立することです。

例外サポートのために g とリンクする

その名前にもかかわらず, gcc だけでは例外処理を行う機能が備わっていません。この機能をプログラムに組み込むには、 g とリンクする必要があります。これにより、 -lstdc が自動的に組み込まれます。これにより、__gxx_personality_v0 シンボルを含む必要なライブラリにアクセスできるようになります。これにより、例外が発生したときにプログラムがスタックを適切に巻き戻すことができます。

自立型プログラムの例外を無効にする

プログラムが例外を利用しない場合は、安全に無効にすることができます。 -fno-Exceptions コンパイラ フラグを使用してそれらを実行します。これにより、__gxx_personality_v0 シンボルが不要になります。同様に、プログラムで必要がない場合は、-fno-rtti を使用して RTTI (ランタイム型情報) を無効にすることができます。

基本機能のボイド ポインター置換

特定の機能例外が有効になっていない自立環境では、__gxx_personality_v0 をグローバル NULL void ポインターとして単純に定義すると、十分です。このメソッドはリンカー エラーを防止しますが、有効なパーソナリティ ルーチンの機能を完全に複製するわけではありません。例外処理を行わないと、プログラムが例外をスローしようとするとエラーが発生する可能性があります。

以上が私の C プログラムに __gxx_personality_v0 が必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート