关于ARM的gcc代码源代码的memcpy

时间:2012-05-18 21:21:22

标签: gcc alignment memcpy

我的代码使用arm代码源编译(arm-none-eabi-gcc)(我认为精简版)。

我在函数中定义了一个struct变量,并执行了一个像

这样的memcpy
typedef struct  {
  char        src[6];           
  char        dst[6];          
  uint16_t    a;          
  uint16_t    b;    
  uint32_t    c;       
  uint16_t    d;       
} Info_t;

Info_t Info;

    memcpy(Info.src, src, sizeof(Info.src));
    memcpy(Info.dst, dst, sizeof(Info.dst));

第一个memcpy会通过,但第二个会导致中止。

我听说gcc优化了memcpy并导致了非对齐的struct acess?

我尝试将struct变量对齐到单词边界等。但它没有用。

任何人都可以提供有关gcc和对齐问题的更多详细信息。

谢谢!

1 个答案:

答案 0 :(得分:2)

据我所知,ARM中的memcopy()问题与编译器使用优化实现有关。

“在许多情况下,当编译对memcpy()的调用时,ARM C编译器将生成对专用的,优化的库函数的调用。从RVCT 2.1开始,这些专用函数是ARM体系结构的ABI的一部分(AEABI) ),并包括:

  • __ aeabi_memcpy

此函数与ANSI C memcpy相同,但返回值为void。

  • __ aeabi_memcpy4

此功能与__aeabi_memcpy相同;但可以假设指针是4字节对齐的。

  • __ aeabi_memcpy8

此函数与__aeabi_memcpy相同,但可以假设指针是8字节对齐的。“

详情请见:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3934.html