我正在编译和链接裸机应用程序。在这种情况下是用于 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/