如何防止全局覆盖的"新"运算符从外部库链接

mar*_*rux 8 c++ iphone xcode linker new-operator

在我们的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重新定义的运算符"?

mrk*_*rkj 2

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

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