在linux编译

时间:2016-11-07 16:21:27

标签: c++ linux gcc dynamic-cast

有一个类 DerivedClass ,它继承自 BaseClassA BaseClassB < / em> 公开。所有类都具有虚函数,以确保正确构建虚拟表。

BaseClassA BaseClassB 位于 Library1 < em> DerivedClass 位于 Library2

Library1 中的一个函数以 BaseClassA DerivedClass >指针并尝试将dynamic_cast转换为 BaseClassB ,但它失败了。相同的功能适用于不同的环境和编译器(例如Visual Studio)。

额外信息:

  • 转载4.1.2和4.5 gcc版本(阅读旧的gcc bug)
  • 派生类名称是“匹配”(认为它可能与其他库碰撞?python?)
  • 有几十个库在它们之间进行链接时一个接一个地编译。
  • nm -gC :找到匹配的vtable地址
  • gdb(7.0.1):用于检查类的vtable地址但是不太了解。 (gdb版本不支持“info vtbl”.gdb无法显示有关声称它是typedef的类的直接信息)
  • readelf -s :我看到了符号

我认为这可能是以下问题之一

  1. 重复的符号
  2. HIDDEN符号在图书馆链接的某处
  3. 重复的vtables
  4. -E和RTLD_GLOBAL dlopen标志linker flag不起作用(使用makefile链接器阶段进行链接,可能不是dlopen。
  5. non-inline function manipulation(也不起作用 - 但是理解究竟要做什么可能是我的错误)
  6. 一直在尝试寻找解决方案。但我首先要知道的是什么是问题?我怎样才能专注于它?

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

    任何建议都会受到高度赞赏(解决方案也会很棒;)

1 个答案:

答案 0 :(得分:0)

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

如果有任何理解这种错误的方法,我想知道的是错误。

我尝试过的“ldd”命令或其他命令(top,nm,readelf等),却看不到任何指向此确切错误的内容。

感谢SOF对各种科目的持续帮助