【发布时间】:2014-10-15 00:13:04
【问题描述】:
我最近在讨论调用约定、ABI 规范等,顺便记得读过一篇关于可执行文件/库的要求只有一个类的类型信息。
考虑到这一点,我的问题是这样的:假设两个库 libA.so 和 libB.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 个以上共享库中的代码使用。但是,我对自己的逻辑不够自信,而且我很好奇我可能错过了什么(如果有的话)。
【问题讨论】:
标签: c++ linker shared-libraries static-libraries typeinfo