Linux 编译"long distance"兄弟姐妹之间的dynamic_cast失败

dynamic_cast fails between "long distance" siblings on linux compilation

本文关键字:dynamic cast 失败 兄弟姐妹 编译 long distance Linux 之间      更新时间:2023-10-16

有一个类DerivedClass,它公开继承了BaseClassABaseClassB。所有类都有虚函数,以确保正确构建虚表。

BaseClassA BaseClassB 位于 Library1 DerivedClass Library2

Library1中的一个函数以BaseClassA指针的形式检索DerivedClass,并尝试动态转换到BaseClassB,但失败了。相同的函数可以在不同的环境和编译器中工作(例如visual studio)。

额外信息:

  • 使用4.1.2和4.5 gcc版本复制(阅读旧的gcc错误)
  • 派生类名称是"匹配"(认为它可能与其他库碰撞?python ?)
  • 有几十个库一个接一个地编译,并相互链接。
  • nm -gC:找到匹配
  • 的虚值表地址
  • gdb(7.0.1):用于检查类的虚函数表地址,但不太理解。gdb版本不支持"info vtbl"。gdb不能显示关于类的直接信息,声称它是一个类型定义
  • readelf -s:我看到符号

我猜可能是下列问题之一

  1. 重复符号
  2. 隐藏符号在库链接的某个地方
  3. 复制vtable
  4. -E和RTLD_GLOBAL dlopen标志链接标志不起作用(链接是使用makefile链接阶段进行的,可能不是dlopen。
  5. 非内联函数操作(没有工作,但可能是我的错误,理解到底要做什么)

一直在网上寻找解决方案。但我首先想知道的是问题出在哪里?我该如何专注于它?

(5)看起来很有希望,尽管我没有设法使用它。

任何建议都将非常感谢(解决方案也会很棒;))

显然答案是#4。这是一个隐藏的功能,动态加载函数,必须单独处理。在链接过程中添加-Wl,-E标志,并更改加载器标志,就可以达到目的。

我想知道的是,如果有任何linux的方式来理解这是错误的。

类似"ldd"或其他命令(top, nm, readelf等),我尝试过,但没有看到任何指向这个确切错误的东西。

感谢SOF在各个学科上的持续帮助