我正在重写Linux项目上的C ++全局新/删除操作符。 这一切在我自己的代码中很好地工作,直到我发现系统库中的新/删除符号也被replace为我的代码! 这是一个非常糟糕的问题,因为它远远超出了我预期的“恶劣程度”。
所以问题是如何防止链接器/编译器从其他(系统)共享库中取代新/删除syms? 或者更确切地说,我如何控制共享库从我的库中链接syms? 我希望系统库仍然会使用默认的新build/删除实现。 尤其是当可执行文件稍后将其他可选dynamic库加载到不受我控制的dlopen()时。
自定义全局新build/删除操作符实现被构build到共享库中。
我在互联网上search了如何控制dynamic链接,但没有成功。 我首先尝试更改testing可执行文件的库链接顺序,但是这并没有改变任何东西。
我发现系统库中的新/删除符号也被替换为我的代码!
你可以阅读这里为什么会发生这种情况的解释。
所以问题是如何防止链接器/编译器从其他(系统)共享库中取代新/删除syms?
你可以通过使用-fvisibility=hidden
构建你的::operator new
和::operator delete
到你的库中,使用__attribute__((visibility("default")))
显式地标记你想要导出的函数。 或者,您可以使用链接器版本脚本来实现相同的结果。