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

布莱恩·范登伯格

最近,我讨论了调用约定,ABI规范等问题,顺便说一句,我回想起有关可执行文件/库只对一个类具有一个typeinfo的要求的内容。

考虑到这一点,我的问题是:假设有两个库libA.solibB.so它们与libboost_somethingorother.a...静态链接,每个库对于boost库中的各个类都有自己的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个以上共享库中的代码之间安全地使用。但是,我对自己的逻辑没有足够的信心,我很好奇我可能错过的内容(如果有的话)。

布莱恩·范登伯格

我终于终于可以解决这个问题了。假设满足所有条件以发出typeinfo对象,则编译器会将其作为弱符号发出。由于符号较弱,因此它将始终找到正确的typeinfo对象。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将静态库链接到共享库

来自分类Dev

将共享库彼此链接到共享库C ++

来自分类Dev

将共享库彼此链接到共享库C ++

来自分类Dev

Android将许多静态库链接到共享库

来自分类Dev

将静态库链接到共享库并隐藏导出的符号

来自分类Dev

使用automake将共享库链接到静态libtool库

来自分类Dev

将C程序链接到C ++共享库

来自分类Dev

如何将C ++静态库链接到C程序?

来自分类Dev

如何将共享库链接到另一个共享库

来自分类Dev

如何链接到旧版本的共享库

来自分类Dev

如何将外部共享库链接到本机扩展?

来自分类Dev

如何在Linux中将libnode.a链接到共享库

来自分类Dev

如何使用相对路径链接到共享库?

来自分类Dev

使用perl XS链接到C共享库

来自分类Dev

链接到在退出时链接到另一个共享库段的共享库

来自分类Dev

链接到不同版本的SSL共享库

来自分类Dev

gcc共享库链接到glibc失败

来自分类Dev

PHP链接到扩展中的共享库

来自分类Dev

链接到不同版本的共享库

来自分类Dev

gcc共享库链接到glibc失败

来自分类Dev

链接到不同版本的共享库

来自分类Dev

创建并链接静态锈库并链接到c

来自分类Dev

将共享库链接到其他共享库C ++项目

来自分类Dev

如何将静态或共享库链接到内核模块?

来自分类Dev

DLL链接到静态库

来自分类Dev

如何创建自动链接到动态库的静态库?

来自分类Dev

如何创建自动链接到动态库的静态库?

来自分类Dev

将共享库与静态库链接

来自分类Dev

共享库和与静态库的多层链接