U-Boot SPL编译报memcpy未定义,如何启用ARM64架构优化memcpy
关于CONFIG_USE_ARCH_MEMCPY未出现在auto.conf的问题
这个情况是正常的。你只关注了USE_ARCH_MEMCPY的依赖条件,忽略了Kconfig中的默认值规则:
default y if !ARM64
也就是说ARM64架构下该选项默认值为n,依赖满足仅代表该选项可被手动开启,不代表默认会选中,未选中的配置不会写入include/config/auto.conf。
关于memcpy未定义的报错原因
报错是两个因素共同导致的:
- 你当前编译的是SPL组件,SPL的配置集和主U-Boot是独立的,即使主U-Boot配置了相关函数实现,SPL未单独配置的话也不会包含对应代码
- 你的编译环境中
__HAVE_ARCH_MEMCPY宏被提前定义(通常是架构头文件的默认行为),导致lib/string.c中的通用memcpy实现被屏蔽,但你又未开启USE_ARCH_MEMCPY,没有编译ARM64汇编优化的memcpy实现,最终链接时找不到函数定义。
另外mem_malloc_init未定义是因为你没有开启SPL的内存分配配置CONFIG_SPL_MALLOC=y。
开启ARM64架构优化memcpy的方法
直接在你的自研板对应defconfig文件中添加如下两行配置即可:
CONFIG_USE_ARCH_MEMCPY=y CONFIG_SPL_USE_ARCH_MEMCPY=y
如果还要解决mem_malloc_init的报错,额外添加:
CONFIG_SPL_MALLOC=y CONFIG_SPL_SYS_MALLOC_SIZE=0x10000 # 可根据你的板载内存大小调整分配的堆空间
你之前尝试的CONFIG_LTO和该问题无关,不会生效。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

