在我们的iPhone XCode 3.2.1项目中,我们链接了2个外部静态C++库libBlue.a和libGreen.a。 libBlue.a全局覆盖“new”运算符,因为它本身具有内存管理功能。但是,当我们构建项目时,libGreen.a使用libBlue的new运算符结束,这会导致崩溃(大概是因为libBlue.a对分配的结构类型进行了假设)。 libBlue.a和libGreen.a均由第三方提供,因此我们无法更改其任何源代码或构建选项。

当我们从项目中删除libBlue.a时,libGreen.a没有任何问题。但是,改写库的链接顺序似乎并不能解决问题,也没有对各种链接标志进行任何实验。是否可以通过某种方式告诉XCode告诉链接器“让libGreen使用new运算符使用标准的C++ new运算符,而不是由libBlue重新定义的运算符”?

最佳答案

也许您可以使用GNU objcopy进行调查,这类似于objcopy --redefine-sym oldNew=newNew libBlue.a。我看到的最大问题是,苹果的开发人员工具套件似乎不包含objcopy。您可以从MacPorts(sudo port install binutils)安装objcopy,但是objcopy可能无法操纵ARM对象文件。 MacPorts中有几个ARM binutils,我猜arm-elf-binutils是最好的选择。

除非如此,否则您可以反汇编libBlue.a,使用sed脚本重命名它的新运算符,然后重新组装它。也许您甚至可以直接操作libBlue.a符号表。

关于c++ - 如何防止全局重写的 "new"运算符从外部库链接到,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1879400/

10-11 17:02