【问题标题】:How to overwrite existing symbol when linking?链接时如何覆盖现有符号?
【发布时间】:2021-06-10 04:30:48
【问题描述】:

我有两个库 AB。那里有相同的功能same_func,我不想修改A 的代码以删除A 中的same_func,但在链接时覆盖符号。有什么方法可以表明 B lib 中的函数,如果符号冲突,则优先选择优先级更高的函数。

【问题讨论】:

  • 如果使用正确的命名空间,这个问题的可能性会大大降低。
  • “我不想……”你应该少想创造更多的黑客而不是清理凌乱的代码。

标签: c++ c linker greenhills


【解决方案1】:

更安全的解决方案可能是将 libA 中的所有或相关符号设为“弱”。您可以使用选项 --weaken 使用 objcopy 执行此操作。这将确保链接器从 libB 中选择定义(如果它在 A 和 B 中都可用)。 另一种解决方案是利用链接器脚本在特定对象中包含或排除特定部分。

【讨论】:

    【解决方案2】:

    命令行上库的顺序通常决定。将库“B”放在库“A”之前。

    如果您的应用程序引用了same_func(),并且您将库“B”设置为第一个,则链接器会将其解析为 B 的same_func()。由于现在已解析引用,因此与库“A”链接只会解析尚未解析的引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 2012-10-16
      • 1970-01-01
      相关资源
      最近更新 更多