繁体   English   中英

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

[英]How does the linker deal with unique typeinfo constraint for C++ static libraries linked into shared libraries?

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

考虑到这一点,我的问题是:假设两个库libA.solibB.so静态链接到libboost_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个以上共享库中的代码。 但是,我对自己的逻辑不够自信,而且我很好奇我可能错过了什么(如果有的话)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM