ARM-NONE-EABI 链接链中对 memcpy 的未定义引用

aar*_*ich 5 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
Run Code Online (Sandbox Code Playgroud)

我已经编写了自己的链接器脚本和自己的启动代码。我收到三个这样的错误:

.../programs/aes_e/aes_test.c:41: undefined reference to `memcpy'
Run Code Online (Sandbox Code Playgroud)

从这样的三行:

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

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

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

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

小智 3

我在嵌入式系统的裸应用程序中也遇到了这个问题。而且我没有memcopy()在我的代码中使用。这是我的问题代码 main.c:

void main()
{
  unsigned char arr[]={'a','b','c'};
  for(int i=0;sizeof(arr);i++)
  {
     putc(arr[i]);
  }
}
Run Code Online (Sandbox Code Playgroud)

将其编译为:

CFLAGS= -march=armv4t -Wall -nodefaultlibs \
        -nostdlib -nostartfiles -fno-builtin\
        -nostdinc -Wstrict-prototypes -std=gnu11

$(CROSS_COMPILE)gcc $(CFLAGS) -c -o main.o main.c
Run Code Online (Sandbox Code Playgroud)

当我链接时:

$(CROSS_COMPILE)ld -Txxx.lds -o main main.o
Run Code Online (Sandbox Code Playgroud)

错误:

main.c:(.text+0x48): undefined reference to `memcpy'
Run Code Online (Sandbox Code Playgroud)

我修改了我的代码:

void main()
    {
      unsigned char arr[3];
      arr[0]='a';
      arr[1]='b';
      arr[2]='c';
      for(int i=0;sizeof(arr);i++)
      {
         putc(arr[i]);
      }
    }
Run Code Online (Sandbox Code Playgroud)

很好。

所以我认为该功能unsigned char arr[]={'a','b','c'};依赖于 memcopy()。

您可以修改您的代码或提供您自己的 memcopy()。