kernel4.19 rk3568 buildroot perf 编译踩坑记录
我遇到的就3个问题
问题1: Kernel → Linux Kernel Tools 下没有perf
问题 1:Kernel → Linux Kernel Tools 下没有 perf 选项
原因:perf 的启用条件涉及 GCC 版本和内核版本:
- GCC 不高于 10 或内核版本为 5.10
- 默认情况下,如果 GCC 版本过高,perf 选项会被隐藏
解决方法:
- 在 Buildroot 菜单中打开 Toolchain → GCC Version,将 GCC 版本降级到 9.x(C++14 兼容)
- 再进入 Kernel → Linux Kernel Tools,perf 选项就会出现并可选中
⚠️ 降级 GCC 对 C++14 项目通常没有影响,但需要注意内核版本兼容性
可以看到这里的前置条件有两个: 要不GCC版本不要高于10,要不就算内核版本为5.10
对于我而言,我使用的C++14,所以降级GCC并不影响我的使用,反倒实际内核可能导致以下意料外的问题,因此到"Toolchain"找寻到GCC版本选择的位置,修改版本
比如我降级到了9.x
然后再去Kernel → Linux Kernel Tools 下看,就有perf的选项了
问题2: build/linux-custom/tools/perf/libtraceevent-dynamic-list:2: ignoring invalid character '@' in script
这个问题在2022-05-18年已被 Konstantin Kharlamov提交补丁修复
如果遇到,大概率是没有补丁
解决方法也很简单
- 第一步先把文件里的’@'去掉
cd [SDK PATH]/buildroot/output/rockchip_rk3568/build/linux-custom/tools/perf
sed -i 's/@[^;]*//g' libtraceevent-dynamic-list
- 第二步添加补丁
mkdir -p [SDK PATH]/buildroot/package/linux-tools/patches
这里提供两种方法:
- 下载补丁 补丁下载
- 手动添加 把内容写入到
buildroot/package/linux-tools/patches/0001-plugins-sanitize-out-VERSION-string-in-symbols.patch
From 29a21ac5b07f0022747891cfcd349b0ff738f417 Mon Sep 17 00:00:00 2001
From: Konstantin Kharlamov <Hi-Angel@yandex.ru>
Date: Tue, 19 May 2020 00:20:05 +0300
Subject: [PATCH] plugins: sanitize out `@@VERSION` string in symbolsAt least on nm version 2.34.50.20200508 symbols may look like this:U statx@@GLIBC_2.28U stpncpy@@GLIBC_2.2.5U strchr@@GLIBC_2.2.5The @@ postfix breaks the build. Let's sanitize it outBugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=207779Signed-off-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
---tools/lib/traceevent/plugins/Makefile | 2 +-1 file changed, 1 insertion(+), 1 deletion(-)diff --git a/tools/lib/traceevent/plugins/Makefile b/tools/lib/traceevent/plugins/Makefile
index 349bb81482ab..b28d386ee129 100644
--- a/tools/lib/traceevent/plugins/Makefile
+++ b/tools/lib/traceevent/plugins/Makefile
@@ -197,7 +197,7 @@ define do_generate_dynamic_list_filexargs echo "U w W" | tr 'w ' 'W\n' | sort -u | xargs echo`;\if [ "$$symbol_type" = "U W" ];then \(echo '{'; \
- $(NM) -u -D $1 | awk 'NF>1 {print "\t"$$2";"}' | sort -u;\
+ $(NM) -u -D $1 | awk -F '[ |\t|@]+' 'NF>1 {print "\t"$$3";"}' | sort -u;\echo '};'; \) > $2; \else \
--
2.26.2
建议先查询一下实际位置,比如我的就不是在197行
mouj@MateBook:~/rk3568/buildroot/output/rockchip_rk3568/build/linux-custom$ grep -n "define do_generate_dynamic_list_file" . -r
./tools/lib/traceevent/Makefile:261:define do_generate_dynamic_list_file
然后自己修改一下
如果觉得麻烦了,其实有更简单的方法,编辑
buildroot/output/rockchip_rk3568/build/linux-custom/tools/lib/traceevent/Makefile
,
找到
$(NM) -u -D $1 | awk 'NF>1 {print "\t"$$2";"}' | sort -u;\
,
将其注释,在下一行添加
$(NM) -u -D $1 | awk -F '[ |\t|@]+' 'NF>1 {print "\t"$$3";"}' | sort -u;\
即可
如果不行就
$(NM) -u -D $1 | awk 'NF>1 {print $$2}' | sed 's/@.*//' | sort -u | awk '{print "\t"$$1";"}'; \
第一种依赖 awk 的正则字段分隔,第二种更稳健。如果你的环境中 awk 不同,第一种可能解析失败;第二种通常安全
问题3: ``buildroot/output/rockchip_rk3568/host/bin/python3: No module named asciidoc
这里是perf生成文档的错误,perf 使用 Python3 脚本生成文档需要
asciidoc` 模块
对于我而言,嵌入式设备上并不需要文档,因此解决方法就是绕过DOC的生成
具体方法如下:
cd buildroot/output/rockchip_rk3568/build/linux-custom/tools/perf
- 编辑
Makefile.perf
文件,找到DOC_TARGETS
行:
DOC_TARGETS := doc man html info pdf
将其注释或清空:
# DOC_TARGETS := doc man html info pdf
- 保存后重新编译,即可跳过文档生成阶段