首页 > 解决方案 > 强制 lld 链接在不同 DWARF 版本中使用调试信息的可重定位文件

问题描述

有一个项目具有预构建的依赖项(一堆静态库),所有这些库都有以默认工具链格式生成的调试信息部分 - DWARF-4。我正在尝试使用 编译我的源代码-gdwarf-5,但链接器无法链接最终的可加载二进制文件:

  ld.lld: error: linking module flags 'Dwarf Version': IDs have conflicting values ('i32 4' from foo/bar/baz.cc with 'i32 5' from ld-temp.o)

即使不同的 TU 使用不同的 DWARF 版本,有没有办法说服链接器继续?经过一番谷歌搜索后,我找到了这张票https://reviews.llvm.org/D52952,其中同样的问题被报告为警告,这让我认为可能有一些机会来压制它。

PS 以上都是关于来自 Android NDK r20(声称是 LLVM 8)的 LLVM 工具链,链接器是 lld。

PSS 我没有机会重新编译依赖项,这就是为什么我正在寻找一种方法来允许在最终二进制文件中使用不同的 DWARF 版本。

标签: c++android-ndklinkerclangllvm

解决方案


NDK 默认传递-Wl,--fatal-warnings给链接器,因为最常见的链接器警告类型是未定义某些内容,这意味着您的应用程序已损坏。多年来,链接器中添加了更多警告,其中一些(我相信这里就是这种情况)是相当无害的。

不幸的是,据我所知,没有办法像-Werror=warning-name使用编译器那样在每个警告的基础上控制致命警告。如果您可以禁用所有致命的链接器警告,则可以使用-Wl,--no-fatal-warnings(将其添加到您的 ldflags)禁用该功能。如果您使用的是 ndk-build,您可以使用LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true.


推荐阅读