【问题标题】:memcpy on gcc code sourcery for ARMARM 的 gcc 代码源上的 memcpy
【发布时间】:2012-05-26 10:59:29
【问题描述】:

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

我在函数中定义了一个结构变量,然后像这样做一个 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 变量与单词边界等对齐,但没有成功。

谁能提供更多关于 gcc 的 memcpy 和对齐问题的详细信息。

谢谢!

【问题讨论】:

  • srcdstmemcpy 的参数是什么?
  • 什么是srcdst? “中止”是什么意思?你的范围重叠吗?
  • 会不会是dstNULL 或无效指针?
  • @KevinDTimm:我没有收到错误消息,处理器只是停止并且符号丢失了。
  • 你的意思是你得到一个核心转储?如果你编译一个调试二进制文件,它应该有符号。但是,是的,这听起来像是一个未对齐的访问。不确定您的 ARM/Linux 系统,但它通常应该是 SIGBUS。

标签: gcc alignment memcpy


【解决方案1】:

据我所知,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

【讨论】:

  • 大家好,感谢您的回复。 1)src和dst参数也是6字节的char数组变量。 2)我所说的中止是说没有可用的符号。i.everthing 会丢失。3)我会尝试使用 packed 属性并返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 2016-11-19
  • 2023-03-31
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
相关资源
最近更新 更多