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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:30:18