You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 13:54:03