【问题标题】:How does the linker deal with unique typeinfo constraint for C++ static libraries linked into shared libraries?链接器如何处理链接到共享库的 C++ 静态库的唯一类型信息约束?
【发布时间】:2014-10-15 00:13:04
【问题描述】:

我最近在讨论调用约定、ABI 规范等,顺便记得读过一篇关于可执行文件/库的要求只有一个类的类型信息。

考虑到这一点,我的问题是这样的:假设两个库 libA.solibB.solibboost_somethingorother.a 静态链接......对于 boost 库中的各种类,每个库都有自己的类型信息。链接器如何处理这种模棱两可的情况?或者应该问一个更普遍的问题:将 C++ 库静态链接到共享库是否安全?

举一个更具体的例子

// in libC.a
class SomeException : public std::Exception { /* ... */ };

// in libA.so, links statically against libC.a
void A_test() {
  extern void B_test();
  try {
    B_test();
  }
  catch( SomeException ) {}

// in libB.so, links statically against libC.a
void B_test() {
  throw SomeException();
}

这有什么不安全的地方吗?

在我看来,无论如何它必须做“正确的事情”,因为从仅标头库实例化的对象可以安全地跨 2 个以上共享库中的代码使用。但是,我对自己的逻辑不够自信,而且我很好奇我可能错过了什么(如果有的话)。

【问题讨论】:

    标签: c++ linker shared-libraries static-libraries typeinfo


    【解决方案1】:

    我今天终于有时间修修补补了。假设满足所有条件以发出 typeinfo 对象,编译器将其作为弱符号发出。因为符号很弱,所以它总能找到正确的 typeinfo 对象。

    编译器不会发出对 typeinfo 对象的未定义引用(至少 gcc 4.9 和 clang 3.5 不会);要么全有,要么全无。

    【讨论】:

    • 您是否记得您使用的选项,或者您是否有可以共享的有效 Makefile?使用 clang++ 4.0.1 我得到的是未定义的符号而不是弱符号。我猜在 3.5 和 4.0 之间发生了一些变化。谢谢!
    • 我只看到在您使用其中一种消毒剂时发出未定义的引用。我还没有可以测试的 clang 4.x。
    猜你喜欢
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多