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

我正在重写Linux项目上的C ++全局新/删除操作符。 这一切在我自己的代码中很好地工作,直到我发现系统库中的新/删除符号也被replace为我的代码! 这是一个非常糟糕的问题,因为它远远超出了我预期的“恶劣程度”。

所以问题是如何防止链接器/编译器从其他(系统)共享库中取代新/删除syms? 或者更确切地说,我如何控制共享库从我的库中链接syms? 我希望系统库仍然会使用默认的新build/删除实现。 尤其是当可执行文件稍后将其他可选dynamic库​​加载到不受我控制的dlopen()时。

自定义全局新build/删除操作符实现被构build到共享库中。

我在互联网上search了如何控制dynamic链接,但没有成功。 我首先尝试更改testing可执行文件的库链接顺序,但是这并没有改变任何东西。

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

你可以阅读这里为什么会发生这种情况的解释。

所以问题是如何防止链接器/编译器从其他(系统)共享库中取代新/删除syms?

你可以通过使用-fvisibility=hidden构建你的::operator new::operator delete到你的库中,使用__attribute__((visibility("default")))显式地标记你想要导出的函数。 或者,您可以使用链接器版本脚本来实现相同的结果。