GCC 何时在不同的 DSO 中提供不同的 typeid?

When does GCC give different typeids in different DSOs?

提问人:Dave 提问时间:10/23/2023 更新时间:10/23/2023 访问量:46

问:

使用相同版本的 GCC/Clang,有没有办法确保在两个不同的 DSO 中为同一类型提供不同的结果,这样和/或跨 DSO 边界的异常将失败?typeiddynamic_castcatch

令人沮丧的是,我见过这样的情况:在跨 DSO 边界抛出异常时未捕获异常,我必须添加到异常类才能使其工作。但我不记得在哪里或在什么情况下。现在我无法在玩具示例中重现它! __attribute__((visibility("default")))

我一直在尝试提出一个包含两个链接库(或库和可执行文件)的示例,这两个库都使用 编译,并且都使用相同的标头定义一些内联多态 () 类。-fvisibility=hidden#includevirtual

但就我而言,在编译器资源管理器中四处使用工具,我似乎无法打破它。似乎在两个 DSO 中评估相同(例如具有相同),因此 s 和 ing 例外在 DSO 中起作用。type_info.hash_code()dynamic_castcatch

谁能给出一些提示,说明在什么情况下这实际上会失败?

C++ GCC DLL 链接类型 ID

评论

0赞 Osyotr 10/23/2023
它将在android上失败。
0赞 Dave 10/23/2023
Messy Compiler Explorer experimentation here: godbolt.org/z/orGrxjojs
0赞 Sedenion 11/4/2023
也许它适用于较旧的 gcc 版本?可能与此相关:stackoverflow.com/q/49773686/3740047,也请参阅此评论

答: 暂无答案