跨模块边界的异常,需要-fPIC?

时间:2012-04-16 10:52:36

标签: c++ g++ elf

我从共享库中抛出一个exeception并将其捕获到另一个库中。我控制所有源代码,所以它应该没问题我使用g ++ 4.4.5。首先,以下代码不起作用:

try
  {
// do something that throws tags::out_of_range in the other shared lib
  }
catch(const tags::out_of_range& e)
  {
cout << "out_of_range " << typeid(tags::out_of_range()).name() << endl;
cout << "out of range exception " << typeid(e).name() << endl;
  }
catch (const exception& e2)
  {
cout << "out_of_range " << typeid(tags::out_of_range()).name() << endl;
cout << "other exception " << typeid(e2).name() << endl;
  }

我总是最终只捕获一个std :: exception。打印代码中显示的typeid()。name()给出了可能的解释:

  

out_of_range FN4tags12out_of_rangeEvE

     

其他例外N4tags12out_of_rangeE

我们可以看到名称不匹配,如果我理解正确,当类在不同的模块中时,名称实际上是字符串比较动态转换。

所以我在某处读取尝试添加-fPIC,突然它起作用(意味着我捕获了out_of_range异常),虽然打印名称仍然给出相同的结果。我认为位置无关的代码不再重要,并且在g ++手册页中查看-fPIC:

  

“此选项对m68k,PowerPC和SPARC有所不同”

我使用的是x86-64。我真的不明白代码定位如何在这种情况下有所作为?另外,如果typeid名称是字符串比较我认为我仍然会在std :: exception子句中结束,因为即使使用-fPIC它们仍然不同?

所以问题:为什么-fPIC会有所不同?

0 个答案:

没有答案