如何在Linux系统下编译CRYSTALS-Kyber的m4版本实现?
解决CRYSTALS-Kyber M4版本编译错误的方案
1. 修复"conflicting architecture profiles M/A"错误
你使用的arm-linux-gnueabihf-gcc默认生成ARMv7-A架构代码,但Kyber M4版本的汇编文件(.S后缀)是针对Cortex-M4(M-profile)编写的,指令集不兼容导致冲突。必须在编译参数中明确指定M4架构与Thumb指令集:
- 添加
-mthumb:强制生成Thumb指令集代码(M系列核心仅支持Thumb) - 添加
-mcpu=cortex-m4:指定目标为Cortex-M4核心
2. 修复"undefined reference to aes128_encrypt_fss"错误
aes128_encrypt_fss是基于Cortex-M4硬件AES指令优化的函数,你从mupq/pqm4获取的aes.c大概率不包含该实现。需做以下调整:
- 替换
aes.c为CRYSTALS-Kyber官方M4版本配套的AES实现文件,确保包含aes128_encrypt_fss的定义,可能还需要将aes_fss.c这类补充文件加入编译列表 - 确认
randombytes.c适配M4平台:M4的随机数生成通常依赖硬件RNG模块,通用版本可能无法正常工作,需使用对应硬件的适配实现
修改后的Makefile示例
CC = arm-linux-gnueabihf-gcc # 编译参数:静态链接、指定M4架构、O3优化 CFLAGS = -static -mthumb -mcpu=cortex-m4 -O3 # 确保包含所有必要源文件,新增aes_fss.c(若需) SRCS = main.c kem.c aes256ctr.c cbd.c randombytes.c aes.c aes_fss.c fastaddsub.S fastbasemul.S fastinvntt.S fastntt.S indcpa.c ntt.c poly.c polyvec.c reduce.S verify.c TARGET = kem all: $(TARGET) $(TARGET): $(SRCS) $(CC) $(CFLAGS) $(SRCS) -o $@
额外检查事项
- 核对所有源文件是否来自同一版本的Kyber M4代码库,避免不同分支文件混合导致接口不匹配
- 若仍有链接错误,检查函数名是否存在拼写差异(如大小写、下划线后缀),确认所有被调用函数都在编译的源文件中有定义
内容的提问来源于stack exchange,提问作者rerouille
相关产品推荐
相关产品推荐

