【问题标题】:How can i get gcc profile guided optimizations to stop writing files after being 'optimized'?如何在“优化”后获得 gcc 配置文件引导优化以停止写入文件?
【发布时间】:2020-05-11 13:52:55
【问题描述】:

我在 makefile 中执行此操作,它会在第一次运行时在该目录中创建 .gcda 文件;但是一旦我做第二个,如果发现可执行文件几乎一样慢(这肯定是相关的),编译后仍在将 new 文件写入目录。据我了解,这不应该发生。删除-fprofile-arcs(或-lgcov)会使第二次编译抱怨缺少符号。我错过了什么?顺便说一句,我make clean 在这两次执行之间。

除了-lgcov之外,我还尝试了一些变体,但我通过阅读手册并意识到-fprofile-use打开了很多优化,包括-fprofile-arcs,但我尝试过的没有简单的替代方法有效。

PROFILE_DIR=/tmp/pgo/${PN}
ifeq ($(wildcard $(PROFILE_DIR)),)
all:
  CXXFLAGS += -O3 -march=native -fprofile-generate=${PROFILE_DIR} -fprofile-correction
  CFLAGS   += -O3 -march=native -fprofile-generate=${PROFILE_DIR} -fprofile-correction
  LDFLAGS  += -fprofile-arcs
  $(info profile-sampling build)
else
all:
  CXXFLAGS += -O3 -march=native -fprofile-use=${PROFILE_DIR} -fprofile-correction
  CFLAGS   += -O3 -march=native -fprofile-use=${PROFILE_DIR} -fprofile-correction
  LDFLAGS  += -fprofile-arcs
  $(info profile-guided build)
endif

gcc 版本是gcc (Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008

编辑:已包含文件的案例的最终 LDFLAGS 为:-lpthread -ldl -lrt -fPIC -shared -Wl,--no-undefined -Wl,--version-script=link.T -fprofile-arcs

如果我没记错的话,-Wl,--no-undefined 正在破坏不链接gcov 或不使用-fprofile-arcs 因为gcov 的符号在使用的文件中的某个位置,即使它们不再重要并且该选项显式地使所有缺失符号的编译失败。因此,解决方案可能会在第二次编译中省略 -fprofile-arcs 并且(以某种方式)仅允许单个库 gcov 具有未初始化的符号。我不知道如何尝试第二个。

编辑 2:不幸的是,不,它在没有该标志且没有链接到 -gcov(直接或间接)的情况下在运行时崩溃。所以 .gcda 文件中的 something 会强制 -lgcov 并强制生成的可执行文件开始写入 .gcda 文件,但如果您尝试删除 -lgcov,您可能会遇到构建失败或崩溃运行。我不明白这应该如何工作,或者为什么这些文件不仅仅是编译时工件......

【问题讨论】:

    标签: gcc optimization compilation gcov


    【解决方案1】:

    这是由于“make clean”没有删除所有创建的 .o 文件,而是删除了一个过时的部分硬编码列表。第二次编译“重用”了第一次(仪表化)编译中的一些 .o 文件,因此需要 -lgcov LDFLAG ,这自然会启动第二次编译以再次进行分析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多