2016-05-10 51 views
2

我正在重写Linux项目上的C++全局新/删除操作符。它在我自己的代码中很好地工作,直到我发现系统库中的新/删除符号也被我的代码取代!这是一个非常糟糕的问题,因为它远远超出了我想要的“恶劣程度”。C++自定义全局新/删除覆盖系统库

所以问题是如何防止链接器/编译器从其他(系统)共享库中取代新/删除syms?或者更确切地说,我如何控制共享库从我的库中链接syms? 我希望系统库仍然会使用它们的默认新建/删除实现。尤其是当可执行文件稍后将其他可选的动态库加载到不受我控制的dlopen()中时。

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

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

+2

您正在使用错误的自定义点。如果您真的想在任何地方进行此项更改,则更换全球运营商很有用。如果您只想在本地化库中自定义分配,则应该使用其他一些机制(例如分配器)来提供自定义点。 –

+2

考虑仅在您的类上重载新的和删除操作符。如果你有大部分对象的基类,就在那里做。这应该覆盖您正在使用的大部分内存。然后,您可以在需要管理STL容器内的对象的情况下创建自定义STL分配器。 –

+0

只有在普通的“root”类中重载新的/删除,在分配原始内存的情况下无法帮助我。重构大量的代码来使用自定义的基础新/删除将是乏味的。我正在寻找LD_PRELOAD分配器在其他C++程序上测试它的可能性。 – JATothrim

回答

2

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

你可以阅读为什么发生这种情况的解释here

所以问题是如何防止链接器/编译器从其他(系统)共享库中取代新/删除syms?

你可以让你::operator new::operator delete私人到库与-fvisibility=hidden建设,并明确标示您想与__attribute__((visibility("default")))导出功能。或者,您可以使用linker version script获得相同的结果。

+0

我知道linux.so库与win.dll很不相同。但我不知道在可执行文件中解析的动态syms会链接到需要跨所有链接代码具有单一定义的存档文件。所以在* nix中这似乎是不可能的。太糟糕了。还是谢谢! 我已经在使用-fvisibility = hidden来编译二进制文件并在代码中标记导出的funcs。 – JATothrim

+1

太糟糕了,它不适用于这个超市操作系统。我使用-fvisibility = hidden标记了项目,用__attribute __((visibility(“hidden”)))标记了新的操作符。仍然我的系统库被我的操作员覆盖 –