dynamic_cast 在 linux 编译时 "long distance" 兄弟姐妹之间失败
dynamic_cast fails between "long distance" siblings on linux compilation
有一个 class DerivedClass 继承自 BaseClassA 和 BaseClassB 公开。所有 classes 都有虚拟函数以确保正确构建虚拟 table。
BaseClassA和BaseClassB位于在 Library1 和 DerivedClass 在 Library2.
Library1 中的一个函数以 [=46] 的形式检索 DerivedClass =]BaseClassA 指针并尝试从 dynamic_cast 到 BaseClassB 但是它失败。相同的函数适用于不同的环境和编译器(例如 visual studio)。
补充信息:
- 使用 4.1.2 和 4.5 gcc 版本重现(阅读旧的 gcc 错误)
- 导出的class名称是"Match"(认为它可能与其他库冲突?python?)
- 有数十个库在它们之间链接时一个接一个地编译。
- nm -gC:找到匹配
的vtable地址
- gdb (7.0.1): 用于检查 class 的 vtable 地址,但不太了解。 (gdb 版本不支持 "info vtbl"。gdb 无法显示有关 class 的直接信息,声称它是 typedef)
- readelf -s: 看到符号了
我想这可能是以下问题之一
- 重复符号
- 链接库中某处的隐藏符号
- 重复 vtables
- -E 和 RTLD_GLOBAL dlopen 标志 linker flag 无效(链接是使用 makefile 链接器阶段进行的,可能不是 dlopen。
- non-inline function manipulation(也没有用 - 但可能是我理解必须要做的事情的错误)
一直在努力寻找解决方案的网络。但我首先想知道的是问题是什么?我怎样才能专注于它?
(5) 看起来很有前途,尽管我没有设法使用它。
如有任何建议,我们将不胜感激(解决方案也很棒 ;))
显然#4 就是答案。
这是一个动态加载功能的隐藏功能,必须单独处理。将 -Wl,-E 标志添加到链接过程并更改加载程序标志就可以了。
我想知道是否有任何linuxy方式来理解这个错误。
我尝试过类似 "ldd" 命令或其他命令(top、nm、readelf 等)但看不到任何指向此确切错误的内容。
感谢SOF在各个学科的不断帮助
有一个 class DerivedClass 继承自 BaseClassA 和 BaseClassB 公开。所有 classes 都有虚拟函数以确保正确构建虚拟 table。
BaseClassA和BaseClassB位于在 Library1 和 DerivedClass 在 Library2.
Library1 中的一个函数以 [=46] 的形式检索 DerivedClass =]BaseClassA 指针并尝试从 dynamic_cast 到 BaseClassB 但是它失败。相同的函数适用于不同的环境和编译器(例如 visual studio)。
补充信息:
- 使用 4.1.2 和 4.5 gcc 版本重现(阅读旧的 gcc 错误)
- 导出的class名称是"Match"(认为它可能与其他库冲突?python?)
- 有数十个库在它们之间链接时一个接一个地编译。
- nm -gC:找到匹配 的vtable地址
- gdb (7.0.1): 用于检查 class 的 vtable 地址,但不太了解。 (gdb 版本不支持 "info vtbl"。gdb 无法显示有关 class 的直接信息,声称它是 typedef)
- readelf -s: 看到符号了
我想这可能是以下问题之一
- 重复符号
- 链接库中某处的隐藏符号
- 重复 vtables
- -E 和 RTLD_GLOBAL dlopen 标志 linker flag 无效(链接是使用 makefile 链接器阶段进行的,可能不是 dlopen。
- non-inline function manipulation(也没有用 - 但可能是我理解必须要做的事情的错误)
一直在努力寻找解决方案的网络。但我首先想知道的是问题是什么?我怎样才能专注于它?
(5) 看起来很有前途,尽管我没有设法使用它。
如有任何建议,我们将不胜感激(解决方案也很棒 ;))
显然#4 就是答案。 这是一个动态加载功能的隐藏功能,必须单独处理。将 -Wl,-E 标志添加到链接过程并更改加载程序标志就可以了。
我想知道是否有任何linuxy方式来理解这个错误。
我尝试过类似 "ldd" 命令或其他命令(top、nm、readelf 等)但看不到任何指向此确切错误的内容。
感谢SOF在各个学科的不断帮助