最近,我讨论了调用约定,ABI规范等问题,顺便说一句,我回想起有关可执行文件/库只对一个类具有一个typeinfo的要求的内容。
考虑到这一点,我的问题是:假设有两个库libA.so
,libB.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] 删除。
我来说两句