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
相关产品推荐
相关产品推荐

