首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使-fno-lto被传递,lld仍运行LTO。

即使-fno-lto被传递,lld仍运行LTO。
EN

Stack Overflow用户
提问于 2022-05-10 17:02:52
回答 1查看 501关注 0票数 5

我有一个CMake项目,其中有几个子项目,这些子项目创建了用-flto=thin构建的静态库。

该项目有许多与上述库相关联的测试。使用LTO需要大量时间来构建测试,因此我已经禁用了使用-fno-lto进行测试的LTO。

不过,我注意到的是,lld在测试中执行LTO,即使使用-fno-lto也是如此。如果我使用--time-trace运行链接器,我可以看到大部分时间都花在LTO上。

我的问题是:

  1. ,这是意料之中吗?如果是这样的话,我可以假设lld在它链接的对象中找到LTO信息时就执行LTO。
  2. 如果没有,有什么方法可以禁用这种行为?将-fno-lto添加到编译器中似乎不起作用,而且lld没有显式禁用LTO.
  3. 的param,如果不是,这是错误吗?

更新1:

这就是我如何在lto中处理CMake:

代码语言:javascript
复制
# Enable Thin LTO only on non-test targets.
if(ENABLE_LTO)
  if (IS_TEST)
    target_compile_options(${TARGET} PRIVATE -fno-lto)
    # Probably pointless.
    target_link_options(${TARGET} PRIVATE -fno-lto)
  else()
    message(STATUS "ENABLE_LTO on target ${TARGET})")
    target_compile_options(${TARGET} PRIVATE -flto=thin)
    target_link_options(${TARGET} PRIVATE -flto=thin -Wl,--thinlto-cache-dir=${CMAKE_BINARY_DIR}/lto.cache)
  endif()
endif()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-15 15:48:59

如果使用-flto编译库,那么至少对于gcc来说,对象文件将只包含中间语言,而不包含二进制代码。

这意味着当您将它们链接到用-fno编译的测试用例时,没有任何二进制代码可链接到。链接器别无选择,只能首先为每个需要的函数将中间语言编译成二进制,这将被看作是LTO阶段。

在gcc中,有一个选项-ffat对象,它告诉gcc在对象文件中同时包含中间语言和二进制代码。然后,它们可以用于与LTO连接,也可以用于不使用LTO。缺点是这需要更长的时间来编译并生成更大的对象文件。

您必须检查clang是否有相同的选项,它们通常与选项相当兼容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72190379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档