Halium boot编译时vdso_offset_sigtramp未声明及偏移文件空求助
根因
生成的vdso-offsets.h为空,是gen_vdso_offset.sh的符号匹配规则和当前内核的vdso实际符号不匹配导致的:当前sed规则仅匹配带VDSO_前缀的符号,但你所用的LineageOS 16适配内核(4.9/4.14版本)的arm64 vdso内,sigtramp等核心符号没有加VDSO_前缀,脚本过滤不到任何内容,最终头文件为空,编译时找不到vdso_offset_sigtramp的宏定义。
修复步骤
- 先验证vdso实际符号
手动执行命令查看已生成的vdso二进制内的符号:nm -n arch/arm64/vdso/vdso.so | grep sigtramp
确认实际符号名(常见为sigtramp或__kernel_sigtramp,无VDSO_前缀)。 - 修改
gen_vdso_offset.sh的sed匹配规则
替换原脚本中仅匹配VDSO_前缀的sed行,改为适配实际符号:
如果实际符号为sigtramp,使用如下规则:
注意:生成的宏名必须和LC_ALL=C sed -n -e 's/^00*/0/' -e \ 's/^\([0-9a-fA-F]*\) [tT] \(sigtramp\|gettimeofday\|clock_gettime\|getcpu\)$/\#define vdso_offset_\2\t0x\1/p'arch/arm64/kernel/signal.c中VDSO_SYMBOL调用传入的参数完全一致,否则还是会报未定义错误。如果实际符号带__kernel_前缀,可在sed规则中截取后缀名,保证宏名和调用参数匹配。 - 检查vdso相关Makefile调用逻辑
打开arch/arm64/vdso/Makefile,确认生成vdso-offsets.h的命令正确将vdso的符号表管道传给gen_vdso_offset.sh,正常调用逻辑应为:
若缺少cmd_vdso_offsets = NM $(NMFLAGS) $(obj)/vdso.so | $(srctree)/$(src)/gen_vdso_offset.sh > $@nm调用,脚本没有输入流,自然生成空文件。 - 清理缓存后重新编译
删除arch/arm64/vdso/目录下所有已生成的临时文件,再执行make halium-boot,避免旧的空头文件被缓存复用。
验证方法
修改后手动执行脚本测试输出:nm -n arch/arm64/vdso/vdso.so | sh arch/arm64/vdso/gen_vdso_offset.sh
确认终端输出包含vdso_offset_sigtramp的宏定义,再重新编译即可。
内容的提问来源于stack exchange,提问作者Jonathan Meirelles
相关产品推荐
相关产品推荐

