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

U-Boot集成TPM V2 API引入头文件时编译报错问题咨询

问题原因

你看到的报错来自主机端工具编译流程,U-Boot的common/image-fit-sig.c会被编译两次:

  • 一次用目标交叉编译器(CROSS_COMPILE指定的aarch64-linux-gnu-gcc)编译进U-Boot固件,运行在目标板上
  • 一次用主机gcc(HOSTCC)编译进主机工具链的mkimage等程序,运行在你的编译主机上

而lib/tpm-v2.c、lib/tpm_api.c等TPM相关实现仅参与目标板固件编译,编译时会提前引入U-Boot专属的类型头文件<linux/types.h>(定义u8/u16/u32等类型)和编译器属性头文件<compiler.h>(定义__packed等宏),因此不会报错。主机端工具编译流程不会引入这些U-Boot内核专属的定义,直接引用TPM头文件就会出现类型未定义、__packed冲突的报错。

解决方案

99%的场景下,FIT镜像的TPM签名验证逻辑仅需要在目标板U-Boot运行时执行,主机端的mkimage工具不需要这部分逻辑,因此只需要给TPM头文件的引用加上目标编译专属的条件判断即可:

步骤1:修改头文件引用

把你添加的TPM头文件包裹在!USE_HOSTCC的条件编译块内,USE_HOSTCC是U-Boot用来标记主机端编译的内置宏:

diff --git a/common/image-fit-sig.c b/common/image-fit-sig.c
index 63e5423c92..d9a7f3b2c1 100644
--- a/common/image-fit-sig.c
+++ b/common/image-fit-sig.c
@@ -18,6 +18,10 @@ DECLARE_GLOBAL_DATA_PTR;
 #include <u-boot/rsa.h>
 #include <u-boot/hash-checksum.h>
 
+#if !defined(USE_HOSTCC)
+#include <tpm-common.h>
+#include <tpm-v2.h>
+#endif
 
 #define IMAGE_MAX_HASHED_NODES         100
 
 /**

步骤2:业务代码也加条件编译

你后续编写的调用TPM V2 API的业务代码,同样需要包裹在上述的#if !defined(USE_HOSTCC)条件块内,避免主机编译时找不到符号。

步骤3:确认配置开启

确保你的板级defconfig中已经打开了TPM相关配置:

CONFIG_TPM=y
CONFIG_TPM_V2=y

如果确实有特殊需求需要在主机端工具中调用TPM逻辑,那需要手动在头文件引用前添加依赖:

#include <linux/types.h>
#include <compiler.h>

但这种场景非常少见,不推荐这么做。

内容的提问来源于stack exchange,提问作者Harsh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:54:02