2013-03-04 66 views
3

我读了Itanium ABI它说,RTTI跨模块边界在安腾和MSVC的ABI

它的目的有两个TYPE_INFO指针指向同等类型的描述,当且仅当指针相等。一个实现必须满足这个约束,例如通过使用符号抢占,COMDAT部分或其他机制。

有没有人知道关于如何在流行的平台上实现这一点的血淋淋的细节,例如使用GCC和GNU binutils的Linux,使用动态加载的库时?它有多可靠?

此外,我对这个typeid的印象还不清楚,因为MSVC中的比较完全是因为这个需求不能得到满足,所以使用运行时字符串比较来对错误的符号名称进行比较。这仍然是它的方式吗?是否存在阻止MSVC使用与安腾ABI平台上所用技术相同的技术平台限制?

编辑一个问题:不例外地在模块间捕(任ABI)依靠RTTI信息为好,或者是有参与,除了比运行dynamic_cast S的另一种等价的机制?

回答

1

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; 
    } 
    ... 

安腾ABI始终只使用指针比较。它应该和DLL一起工作的方式是动态加载器应该确保程序地址空间中的每个异常都有一个typeinfo对象实例。

如果您对异常RTTI和捕获信息的实际执行感兴趣,请查看我的OpenRCE article(MSVC)和Recon 2012 presentation(GCC,MSVC x64)。