C++ 自定义全局 new/delete 覆盖系统库
C++ custom global new/delete overriding system libraries
我正在覆盖 Linux 项目上的 C++ 全局 new/delete 运算符。在我自己的代码中一切都很好,直到我发现系统库中的 new/delete 符号也被我的代码替换了!这是一个非常糟糕的问题,因为它超出了 'level of evil' 我的预期。
所以问题是如何防止 linker/compiler 替换来自其他(系统)共享库的 new/delete 符号?或者更准确地说,我如何控制我的库中的共享库 link 符号?
我希望系统库仍然使用它们的默认 new/delete 实现。特别是当可执行文件稍后使用不受我控制的 dlopen() 加载其他可选动态库时。
自定义全局 new/delete 运算符实现已构建到共享库中。
我在互联网上搜索了如何控制动态 linking 但没有成功。我首先尝试更改测试可执行文件上的库 link 顺序,但这并没有改变任何东西。
I found out that the new/delete symbols in system libraries gets also replaced with my code!
您可以阅读有关发生这种情况的原因的解释 。
So question is how do I prevent the linker/compiler from replacing the new/delete syms from other (system) shared libraries?
您可以通过使用 -fvisibility=hidden
构建并明确标记您 做 想要的功能,使您的 ::operator new
和 ::operator delete
对您的图书馆私有使用 __attribute__((visibility("default")))
导出。或者,您可以使用 linker version script 来获得相同的结果。
我正在覆盖 Linux 项目上的 C++ 全局 new/delete 运算符。在我自己的代码中一切都很好,直到我发现系统库中的 new/delete 符号也被我的代码替换了!这是一个非常糟糕的问题,因为它超出了 'level of evil' 我的预期。
所以问题是如何防止 linker/compiler 替换来自其他(系统)共享库的 new/delete 符号?或者更准确地说,我如何控制我的库中的共享库 link 符号? 我希望系统库仍然使用它们的默认 new/delete 实现。特别是当可执行文件稍后使用不受我控制的 dlopen() 加载其他可选动态库时。
自定义全局 new/delete 运算符实现已构建到共享库中。
我在互联网上搜索了如何控制动态 linking 但没有成功。我首先尝试更改测试可执行文件上的库 link 顺序,但这并没有改变任何东西。
I found out that the new/delete symbols in system libraries gets also replaced with my code!
您可以阅读有关发生这种情况的原因的解释
So question is how do I prevent the linker/compiler from replacing the new/delete syms from other (system) shared libraries?
您可以通过使用 -fvisibility=hidden
构建并明确标记您 做 想要的功能,使您的 ::operator new
和 ::operator delete
对您的图书馆私有使用 __attribute__((visibility("default")))
导出。或者,您可以使用 linker version script 来获得相同的结果。