gpt4 book ai didi

c++ - 如何防止全局覆盖的 "new"运算符从外部库链接进来

转载 作者:可可西里 更新时间:2023-11-01 17:58:04 28 4
gpt4 key购买 nike

在我们的 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。我看到的最大问题是 Apple 的开发人员工具套件似乎不包含 objcopy。您可以从 MacPorts 安装 objcopy (sudo port install binutils),但 objcopy 可能无法操作 ARM 目标文件。 MacPorts 中有几个 ARM binutils,我猜 arm-elf-binutils 是您最好的选择。

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com