我在Linux项目上覆盖了C ++全局新/删除运算符。这一切都在我自己的代码中很好地工作,直到我发现系统库中的新/删除符号也被我的代码替换了!这是一个非常糟糕的问题,因为它超出了我想要的“邪恶程度”。
所以问题是如何阻止链接器/编译器从其他(系统)共享库替换新/删除syms?或者更准确地说,我如何控制共享库链接我的库中的syms? 我希望系统库仍然使用他们的默认新/删除实现。特别是当可执行文件稍后使用不受我控制的dlopen()加载其他可选动态库时。
自定义全局new / delete运算符实现构建到共享库中。
我在互联网上搜索如何控制动态链接但没有成功。我首先尝试更改测试可执行文件的库链接顺序,但这并未改变任何内容。
答案 0 :(得分:2)
我发现系统库中的新/删除符号也被我的代码替换了!
您可以阅读有关为何发生这种情况的解释here。
所以问题是我如何阻止链接器/编译器从其他(系统)共享库中替换新的/删除syms?
您可以使用::operator new
构建::operator delete
和-fvisibility=hidden
私有您的图书馆,并明确标记您所做的要导出的功能__attribute__((visibility("default")))
1}}。或者,您可以使用linker version script来获得相同的结果。