我最近正在调用约定,ABI规范等,顺便提一下,我记得读过有关可执行文件/库只需要一个类的一个typeinfo的要求。
考虑到这一点,我的问题是这样的:假设两个库libA.so
和libB.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个以上共享库中的代码。但是,我对自己的逻辑不够自信,我很好奇我可能错过了什么(如果有的话)。
答案 0 :(得分:2)
我今天终于开始修补这个问题了。假设满足所有条件以发出typeinfo对象,编译器将其作为弱符号发出。因为符号很弱,所以它总能找到正确的typeinfo对象。
编译器不会发出对typeinfo对象的未定义引用(至少,gcc 4.9& clang 3.5不会);它全有或全无。