有条件地覆盖__cxa_throw

时间:2016-04-25 16:56:00

标签: c++ c linker

好的,这个问题有点复杂,所以请在给出解决方案之前先阅读。

基本上,我想覆盖__cxa_throw(C ++异常处理程序),但也允许我的库用户在需要时也覆盖它。为了使事情变得更复杂,我希望能够在不需要重新编译我的库的情况下完成它。

覆盖的常规方法是只定义自己的__cxa_throw函数,然后链接器将只使用静态版本(您的版本)而不是C ++运行时库中的版本。但是,如果您的库的用户还需要为了自己的目的而挂钩异常处理程序呢?现在你有两个静态链接的__cxa_throw实现,当然无法链接。

我的第一个想法是使用动态链接器函数,我可以使用它来加载C ++运行时库并获取__cxa_throw,但是如何在已经加载的程序中更新现有的链接以调用MY实现,然后再将其传递给以前有什么吗?

所以我们有:

  • 原始__cxa_throw(动态关联)
  • my __cxa_throw(静态链接)
  • user __cxa_throw(静态链接)

我希望它能做到这一点:

  • 调用我的__cxa_throw(实际上不叫“__cxa_throw”,因为这会导致碰撞)
  • 我的处理程序调用用户__cxa_throw(如果存在)
  • 如果用户正在通过,他会按照通常的方式调用原始的__cxa_throw。

当然,如果我设法重新链接__cxa_throw指向我的实现,那么用户抓住指向“原始”__cxa_throw的指针实际上可能是我的(不完全确定这一点 - 我需要运行一些测试)。为了解决这个问题,我可以检查重新进入并转到“真正的”原始功能。我唯一无法弄清楚的是如何开始重新连接。

我还应该提一下,我也需要在Apple平台上工作,所以LD_PRELOAD和--wrap已经用完了。

0 个答案:

没有答案