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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARM-NONE-EABI链接链中对memcpy的未定义引用相关的知识,希望对你有一定的参考价值。

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

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

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函数内部的行需要将数据从一个内存区复制到另一个内存区。 (如果我错了,请纠正我)。现在我已经读过memcpy是在libgcc.a中定义的。我甚至为它设备(在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 };
另一答案

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

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

编译它:

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

$(CROSS_COMPILE)gcc $(CFLAGS) -c -o main.o main.c

当我链接到:

$(CROSS_COMPILE)ld -Txxx.lds -o main main.o

错误:

main.c:(.text+0x48): undefined reference to `memcpy'

我修改了我的代码:

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]);
      }
    }

很好。

所以我认为功能qazxsw我依赖memcpy()。

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

另一答案

通常你应该完全依赖编译驱动程序而不是显式调用链接器,但是如果你真的想这样做,你必须明确告诉链接器链接标准库(通常标记为unsigned char arr[]={'a','b','c'};)。

允许编译器更改位置,它可以使用memcpy优化代码,编译器要求它存在。

以上是关于ARM-NONE-EABI链接链中对memcpy的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

将 newlib nano 与 arm-none-eabi gnu 工具链链接:未定义对 __libc_init_array 的引用

arm-none-eabi 全局初始化变量值不正确

linux下如何把一个.c文件通过arm-none-eabi-交叉编译生成一个.bin的文件然后在qemu上运行

用arm-none-eabi进行交叉编译

arm-none-eabi 和 arm-linux-gnueabi 之间的区别?

arm gcc 工具链作为 arm-elf 或 arm-none-eabi,有啥区别?