[英]How does the linker deal with unique typeinfo constraint for C++ static libraries linked into shared libraries?
我最近正在调用约定,ABI规范等,并且顺便提一下,我记得读过有关可执行文件/库只需要一个类的一个typeinfo的要求。
考虑到这一点,我的问题是:假设两个库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个以上共享库中的代码。 但是,我对自己的逻辑不够自信,而且我很好奇我可能错过了什么(如果有的话)。
我今天终于开始修补这个问题了。 假设满足所有条件以发出typeinfo对象,编译器将其作为弱符号发出。 因为符号很弱,所以它总能找到正确的typeinfo对象。
编译器不会发出对typeinfo对象的未定义引用(至少,gcc 4.9和clang 3.5不会); 这是全有或全无。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.