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

C++ custom global new/delete overriding system libraries

本文关键字:删除 覆盖 系统库 新建 自定义 全局 C++      更新时间:2023-10-16

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

所以问题是如何防止链接器/编译器替换其他(系统)共享库中的新符号/删除符号?或者更确切地说,我如何控制哪些共享库链接我库中的符号?我希望系统库仍然使用它们默认的new/delete实现。特别是当可执行文件稍后使用dlopen()加载其他不在我控制范围内的可选动态库时。

自定义全局新建/删除运算符实现构建到共享库中。

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

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

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

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

通过使用-fvisibility=hidden构建并显式标记要使用__attribute__((visibility("default")))导出的函数,可以将::operator new::operator delete设为库专用。或者,您可以使用链接器版本脚本来获得相同的结果。