链接器如何处理链接到共享库的C ++静态库的唯一typeinfo约束?

时间:2014-10-15 00:13:05

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

我最近正在调用约定,ABI规范等,顺便提一下,我记得读过有关可执行文件/库只需要一个类的一个typeinfo的要求。

考虑到这一点,我的问题是这样的:假设两个库libA.solibB.so静态链接到libboost_somethingorother.a ...每个库都有自己的typeinfo用于提升图书馆。链接器如何处理这种模糊的情况?或者也许应该提出一个更普遍的问题:将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个以上共享库中的代码。但是,我对自己的逻辑不够自信,我很好奇我可能错过了什么(如果有的话)。

1 个答案:

答案 0 :(得分:2)

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

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