【发布时间】: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