"undefined reference to memcpy" 在 u-boot-spl 构建期间。如何使用架构辅助的 memcpy?
"undefined reference to memcpy" during u-boot-spl build. How can I use the archtecture assisted memcpy?
当我为我们的开发板构建 u-boot-spl 时,我看到了这些 link 错误。 (u-boot 版本 v2021.10,提交 50c84208ad,Tom Rini,2021 年 10 月 4 日)
u-boot/common/spl/spl.c:669: undefined reference to `memcpy'
u-boot/common/spl/spl.c:684: undefined reference to `mem_malloc_init'
...
但是arch/arm/Kconfig说(我的板子是ARM64)
config USE_ARCH_MEMCPY
bool "Use an assembly optimized implementation of memcpy"
default y if !ARM64
depends on !ARM64 || (ARM64 && (GCC_VERSION >= 90400))
help
Enable the generation of an optimized version of memcpy.
Such an implementation may be faster under some conditions
but may increase the binary size.
所以如果ARM64和GCC版本高于9.04,USE_ARCH_MEMCPY应该打开
在我的例子中,我可以检查 include/config/auto.conf 这两个条件是否为真。
CONFIG_ARM64=y
CONFIG_GCC_VERSION=100201
但是USE_ARCH_MEMCPY没有出现在include/cofig/auto.conf中(这正常吗?)。
反正我觉得这个CONFIG_USE_ARCH_MEMCPY应该是y
。为什么它给我这个 memcpy 未定义的错误?
我签入了lib/Makefile,我看到了
obj-y += string.o
这是无条件的,这个 string.c 包含 memcpy 函数。不过这个函数当然是被#ifndef包围的__HAVE_ARCH_MEMCPY,反正不是我想要的
有没有我应该打开的选项来使用这个硬件辅助的 memcpy?
添加:我尝试添加 CONFIG_LTO 但它没有用。
我搜索了 Kconfig 文件,发现有 CONFIG_USE_ARCH_MEMCPY、CONFIG_SPL_USE_ARCH_MEMCPY、CONFIG_USE_ARCH_MEMSET、CONFIG_SPL_USE_ARCH_MEMSET 等。所以我选择了这些配置用于我的木板。这些错误消失了(设置了 CONFIG_LTO-link 时间优化,因此不使用 stdlib)。对于 strncmp、timer_init、puts、hang、mem_malloc_init 等,我还有一些 'undefined' 错误。我不确定我是否可以使用类似的方法修复这些错误,或者这种方法是否正确, 可取的方法。如果我更喜欢软件程序,我应该怎么做?
等待更好的答案。
添加(2021.11.29):
来自 u-boot 电子邮件列表的 Ovidiu Panait 告诉我可以通过将 CONFIG_SPL_LIBGENERIC_SUPPORT 和 CONFIG_SPL_LIBCOMMON_SUPPORT 设置为 'y' 来消除一些 'undefined symbol' 错误。设置后,我发现那些 memcpy、memset link 错误也没有设置 USE_ARCH_xxx 或 USE_SPL_ARCH_xxx 配置。
当我为我们的开发板构建 u-boot-spl 时,我看到了这些 link 错误。 (u-boot 版本 v2021.10,提交 50c84208ad,Tom Rini,2021 年 10 月 4 日)
u-boot/common/spl/spl.c:669: undefined reference to `memcpy'
u-boot/common/spl/spl.c:684: undefined reference to `mem_malloc_init'
...
但是arch/arm/Kconfig说(我的板子是ARM64)
config USE_ARCH_MEMCPY
bool "Use an assembly optimized implementation of memcpy"
default y if !ARM64
depends on !ARM64 || (ARM64 && (GCC_VERSION >= 90400))
help
Enable the generation of an optimized version of memcpy.
Such an implementation may be faster under some conditions
but may increase the binary size.
所以如果ARM64和GCC版本高于9.04,USE_ARCH_MEMCPY应该打开
在我的例子中,我可以检查 include/config/auto.conf 这两个条件是否为真。
CONFIG_ARM64=y
CONFIG_GCC_VERSION=100201
但是USE_ARCH_MEMCPY没有出现在include/cofig/auto.conf中(这正常吗?)。
反正我觉得这个CONFIG_USE_ARCH_MEMCPY应该是y
。为什么它给我这个 memcpy 未定义的错误?
我签入了lib/Makefile,我看到了
obj-y += string.o
这是无条件的,这个 string.c 包含 memcpy 函数。不过这个函数当然是被#ifndef包围的__HAVE_ARCH_MEMCPY,反正不是我想要的
有没有我应该打开的选项来使用这个硬件辅助的 memcpy?
添加:我尝试添加 CONFIG_LTO 但它没有用。
我搜索了 Kconfig 文件,发现有 CONFIG_USE_ARCH_MEMCPY、CONFIG_SPL_USE_ARCH_MEMCPY、CONFIG_USE_ARCH_MEMSET、CONFIG_SPL_USE_ARCH_MEMSET 等。所以我选择了这些配置用于我的木板。这些错误消失了(设置了 CONFIG_LTO-link 时间优化,因此不使用 stdlib)。对于 strncmp、timer_init、puts、hang、mem_malloc_init 等,我还有一些 'undefined' 错误。我不确定我是否可以使用类似的方法修复这些错误,或者这种方法是否正确, 可取的方法。如果我更喜欢软件程序,我应该怎么做?
等待更好的答案。
添加(2021.11.29):
来自 u-boot 电子邮件列表的 Ovidiu Panait 告诉我可以通过将 CONFIG_SPL_LIBGENERIC_SUPPORT 和 CONFIG_SPL_LIBCOMMON_SUPPORT 设置为 'y' 来消除一些 'undefined symbol' 错误。设置后,我发现那些 memcpy、memset link 错误也没有设置 USE_ARCH_xxx 或 USE_SPL_ARCH_xxx 配置。