代码之家  ›  专栏  ›  技术社区  ›  marcprux

如何防止全局重写的“new”运算符从外部库链接到

  •  8
  • marcprux  · 技术社区  · 16 年前

    在我们的iPhone XCOD3.2.1项目中,我们链接了2个外部静态C++库,LBBLUL.A和LIGRIG.A。libBlue.a全局覆盖“ 新的 “操作员负责自己的内存管理。然而,当我们构建项目时,libGreen.a最终使用libBlue的 新的 运算符,这将导致崩溃(可能是因为libBlue.a正在对所分配的结构类型进行假设)。libBlue.a和libGreen.a都是由第三方提供的,所以我们不能更改他们的任何源代码或构建选项。

    当我们从项目中删除libBlue.a时,libGreen.a没有任何问题。然而,对库的链接顺序进行任何洗牌似乎都不能解决问题,对各种链接标志的任何实验也不能解决问题。有没有办法告诉XCode让链接器“让libGreen使用 新的 操作员使用标准C++

    5 回复  |  直到 16 年前
        1
  •  2
  •   mrkj    16 年前

    也许你可以调查一下使用 GNU objcopy ,类似于 objcopy --redefine-sym oldNew=newNew libBlue.a . 我看到的最大问题是,苹果的开发者工具套件似乎没有包括objcopy。您可以从安装objcopy MacPorts ( sudo port install binutils ),但该对象复制可能无法操作ARM对象文件。我猜在MacPorts里有几只手臂的比努蒂尔 arm-elf-binutils

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

        2
  •  1
  •   psublue    16 年前

    新的 在您的代码中本地。在实现中,可以复制/粘贴标准的实现 新的 操作人员当您需要创建 新的 新的 而不是全球 新的

    退房 http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=40 我希望能提供一个更好的总结。

    编辑:你是说libGreen.a中的代码将调用 从libBlue,还是说您的代码创建了一个“ 新的 类别定义为libgreen(…)”最终使用了libBlue的 新的

        3
  •  0
  •   William Bell    16 年前

    您可以在单独的进程中隔离libBlue.a和libGreen.a,从而有效地创建一个服务器,允许通过某种形式的进程间通信访问封装的功能。这显然对性能有影响,但解决了全局名称空间污染问题。

        4
  •  0
  •   Konstantin Tenzin    16 年前

    可以有非技术性的解决方案:

    1. 您可以联系libBlue的支持人员。其他人也可能有这个问题。
    2. 寻找替代方案。

    还有一点很奇怪,如果libBlue的开发者做了一些“聪明”的事情,却不知道如何解决他们引入的问题。

        5
  •  0
  •   AShelly    16 年前

    Mach-O format . 看见 this reference

    libBlue.a必须包含导出符号的列表。尝试将其“new”重命名为“neo”或其他名称。libBlue应该在内部保持一致,但是libGreen现在只会在链接时发现系统是“新的”。

    __DATA,__la_symbol_ptr 节。您可以将“new”的实例替换为应用程序中定义的执行相同工作的包装函数的名称(甚至可能直接打电话给new,但最终可能会回到libBlue。)