5

私はそれを言うItanium ABIを読んでいます

2 つの type_info ポインターが等しい場合にのみ、2 つの type_info ポインターが同等の型記述を指すことを意図しています。実装は、たとえば、シンボル プリエンプション、COMDAT セクション、またはその他のメカニズムを使用して、この制約を満たす必要があります。

動的にロードされたライブラリを使用する場合、GCC や GNU binutils を使用する Linux などの一般的なプラットフォームで実際にこれがどのように達成されるかについて、詳細を知っている人はいますか? それはどのくらい信頼できますか?

typeidまた、 MSVC での比較は、マングルされたシンボル名のランタイム文字列比較を使用して実装されている (だった?)という印象を受けています。これは、この要件が満たされることが保証されていないためです。今でもこのやり方ですか?また、MSVC が Itanium ABI プラットフォームで使用されているのと同じ手法を利用できないようにする技術的なプラットフォームの制約はありますか?

EDITdynamic_castもう1つの質問:モジュール境界を越えた例外キャッチ(ABIのいずれか)はRTTI情報にも依存していますか、それともランタイムsと同等のもの以外に別のメカニズムが関係していますか?

4

1 に答える 1

2

MSVC は最初にポインター比較を使用し、それが失敗した場合は文字列を比較します。VS2012 の CRT ソースで実装を確認できます。

extern "C" _CRTIMP int __cdecl __TypeMatch(
    HandlerType *pCatch,                // Type of the 'catch' clause
    CatchableType *pCatchable,          // Type conversion under consideration
    ThrowInfo *pThrow                   // General information about the thrown
                                        //   type.
) {
    // First, check for match with ellipsis:
    if (HT_IS_TYPE_ELLIPSIS(*pCatch)) {
        return TRUE;
    }

    // Not ellipsis; the basic types match if it's the same record *or* the
    // names are identical.
    if (HT_PTD(*pCatch) != CT_PTD(*pCatchable)
      && strcmp(HT_NAME(*pCatch), CT_NAME(*pCatchable)) != 0) {
        return FALSE;
    }
    ...

Itanium ABI は常にポインター比較のみを使用します。DLL で動作するはずの方法は、ダイナミック ローダーが、プログラムのアドレス空間に例外ごとに typeinfo オブジェクトの単一のインスタンスが存在することを保証する必要があるということです。

例外 RTTI の実際の実装とキャッチ情報に興味がある場合は、私のOpenRCE 記事(MSVC) とRecon 2012 プレゼンテーション(GCC、MSVC x64) を確認してください。

于 2014-02-25T14:14:23.787 に答える