C++自定义全局new/delete重载系统库

3
我正在Linux项目中覆盖C ++全局new/delete运算符。在我的代码中,所有的东西都能正常工作,直到我发现系统库中的new/delete符号也被我的代码替换了!这是一个非常严重的问题,因为它远远超出了我预期的“邪恶程度”。
所以问题是,如何防止链接器/编译器用其他(系统)共享库中的new/delete符号替换它们?更准确地说,如何控制哪些共享库链接来自我的库的符号? 我希望系统库仍然使用它们默认的new/delete实现。特别是当可执行文件稍后加载其他不在我的控制下的可选动态库时,这一点尤为重要。
定制的全局new/delete运算符实现构建在共享库中。
我在互联网上搜索了如何控制动态链接的方法,但没有成功。我首先尝试在测试可执行文件中改变库链接顺序,但结果没有改变。

2
你正在使用错误的自定义点。如果您真正想要在所有地方进行更改,则替换全局运算符非常有用。如果您只想在本地化库中自定义分配,则应使用其他机制(例如分配器)来提供自定义点。 - Kerrek SB
2
考虑仅在您的类上重载new和delete运算符。如果您有大多数对象的基类,请在那里执行此操作。这应该涵盖您正在使用的大部分内存。然后,您可以在需要在STL容器中管理对象的情况下创建自定义STL分配器。 - Arno Duvenhage
仅在共同的“根”类中重载new/delete无法帮助我在存在分配原始内存的普通函数的情况下。重构大量的代码以使用自定义基础new/delete将是繁琐的。我正在寻找可能性,即LD_PRELOAD分配器以在其他C ++程序上进行测试。 - JATothrim
1个回答

2
我发现系统库中的new/delete符号也被我的代码替换了!您可以在这里阅读为什么会发生这种情况的解释。
那么问题是,如何防止链接器/编译器替换其他(系统)共享库中的new/delete符号?您可以通过使用-fvisibility=hidden构建并显式标记您想要导出的函数为__attribute__((visibility("default"))),使您的::operator new::operator delete成为您库的私有函数。或者,您可以使用链接器版本脚本来实现相同的结果。

我知道Linux的.so库和Windows的.dll库非常不同。但是我不知道在可执行文件中解析动态符号会像归档文件一样链接,需要在所有链接代码中具有单一定义。因此,在*nix中似乎无法实现...太糟糕了。还是谢谢! 我已经使用-fvisibility=hidden编译二进制文件并在代码中标记导出函数。 - JATothrim
1
很遗憾,这个超市操作系统不支持。我使用了“-fvisibility=hidden”标记项目,并使用“attribute((visibility("hidden")))”标记了new运算符,但我的系统库仍然被我的运算符覆盖了。 - Martin Kosicky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接