c - ARM-NONE-EABI 链接链中对 memcpy 的 undefined reference

标签 c arm linker-errors

我正在编译和链接裸机应用程序。在这种情况下是用于 AES 加密的简单标准 c 代码(不是我自己编写的,但我仔细阅读了它,它似乎不需要任何库)。

链接时出现问题。这是使用的链接器命令。

arm-none-eabi-ld boot_and_link/startup.o drivers/gpio.o  ../programs/aes_e/aes.o ../programs/aes_e/aes_test.o ../programs/aes_e/key_expansion.o -nostartfiles -T boot_and_link/linker.ld -o ../programs/aes_e/aes_e.elf -L/usr/lib/gcc/arm-none-eabi/4.8/armv6-m -lgcc

我已经编写了自己的链接描述文件和启动代码。我收到三个这样的错误:

.../programs/aes_e/aes_test.c:41: undefined reference to `memcpy'

像这样的三行:

unsigned char key[16] =
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };

在主函数中。我可以通过简单地删除这三行并将它们放在 main 函数之外来消除这些错误。这告诉我 main 函数中上面的行需要将数据从内存的一个部分复制到另一部分。 (如果我错了,请纠正我)。现在我读到 memcpy 是在 libgcc.a 中定义的。我什至已经为它进行了 grepped(在 armv6-m 架构的目录中)并且我得到了一个匹配项(二进制文件 ./libgcc.a 匹配作为 grep 命令的结果)。

所以我的问题是为什么这个错误仍然存​​在?我需要链接到其他图书馆吗?

只是为了澄清,除了我自己编写的其他文件(没有 string.hn stddefs.h 或任何其他文件)之外,我的任何源文件中都没有包含。

最佳答案

数组是您例程中的一个变量,编译器使用 memcpy 将其复制到堆栈中。

如果您将其定义为'static const',它将进入静态存储并且不需要复制。

static const unsigned char key[16] =
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 
  0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };

关于c - ARM-NONE-EABI 链接链中对 memcpy 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29344048/

相关文章:

c - 如何使用 libtool 从一堆静态库中创建一个静态库

c - 为什么 -(int) int 是任何 int 值,即右值?

c - ARM板什么时候安装操作系统?调用端口地址会映射到真实地址还是虚拟地址?

open-source - 如果您为 ARM ISA 实现开源处理器,是否违反任何法律/专利/许可?

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

gcc - 在 Debian、libc6 上升级到 gcc-4.8 后出现 g++ 链接器错误

c - 带负数的模运算

c - 将 ARM asm 反编译回 C

c++ - 从 std::exception 继承的提升示例代码不链接

c++ - 使用 scanf 和 while 循环与 vector push_back