C ++自定义全局新/删除覆盖系统库

时间:2016-05-10 17:29:49

标签: c++ linux linker shared-libraries

我在Linux项目上覆盖了C ++全局新/删除运算符。这一切都在我自己的代码中很好地工作,直到我发现系统库中的新/删除符号也被我的代码替换了!这是一个非常糟糕的问题,因为它超出了我想要的“邪恶程度”。

所以问题是如何阻止链接器/编译器从其他(系统)共享库替换新/删除syms?或者更准确地说,我如何控制共享库链接我的库中的syms? 我希望系统库仍然使用他们的默认新/删除实现。特别是当可执行文件稍后使用不受我控制的dlopen()加载其他可选动态库​​时。

自定义全局new / delete运算符实现构建到共享库中。

我在互联网上搜索如何控制动态链接但没有成功。我首先尝试更改测试可执行文件的库链接顺序,但这并未改变任何内容。

1 个答案:

答案 0 :(得分:2)

  

我发现系统库中的新/删除符号也被我的代码替换了!

您可以阅读有关为何发生这种情况的解释here

  

所以问题是我如何阻止链接器/编译器从其他(系统)共享库中替换新的/删除syms?

您可以使用::operator new构建::operator delete-fvisibility=hidden私有您的图书馆,并明确标记您所做的要导出的功能__attribute__((visibility("default"))) 1}}。或者,您可以使用linker version script来获得相同的结果。