【问题标题】:Alignment question on ARM binaryARM 二进制文件的对齐问题
【发布时间】:2011-09-24 22:16:32
【问题描述】:

我又回来了,脑子里一片混乱! :)

据我了解,armcc 通常的数据对齐方式如下(取自 ARM 网站) ARM Compiler toolchain Using the Compiler: Types of data alignment

但在我的二进制文件中,我看到 print_quality{} 结构实例位于 0x205B387

[D:0x205B387] print_quality = ((0x44, 0x72, 0x61, 0x66, 0x74, 0x0, 0x0, 0x0, 0

这里 sizeof(print_quality) = 0x1E

结构是 字符打印质量[][10] = { “草案”, “普通的”, “高的” };

在流程的后期,我在执行时遇到了崩溃

ldrh r2,[r1] ;这里r1=02064769

所以我猜它崩溃是因为从错误对齐的地址读取!?

怎么了!? :( 欢迎任何想法..

BR,

/MS

【问题讨论】:

  • 您可以添加更多上下文吗?这里的信息不足以回答您的问题。例如,您的print_quality 结构是如何定义的?你提到的ldrh指令编译的C代码是什么?
  • 对不起!崩溃可能是由于不同的原因。但令我困惑的是 print_quality 位于奇怪的地址,尽管它的大小为 30 字节
  • ok Martin 添加了结构并得到了答案。它的字符结构!这可以证明住在奇怪的地址! :) 我们可以忽略 ldrh 的崩溃。我认为这是超出数组边界的指针。 c 行是 for ( ; *p != 0 ; ++p ) ;
  • 请注意:您使用的“结构”一词的含义比它在 C 语言中的含义更广泛。您的 print_quality 是一个数组,不是一个结构;在 C 中,结构是使用 struct 关键字定义的数据类型,仅此而已。

标签: c arm alignment


【解决方案1】:

根据我的经验,这通常是因为从一件事转换到另一件事(例如,使用字节对齐数组并将结构复制到其中,我自己多次犯过这个错误)。我不确定您是否可以在不实际显示代码的情况下获得任何明确的答案,但如果您在执行路径中的某处有 void*memcpy,那将是罪魁祸首。

【讨论】:

  • 同意。我今天很糟糕.. 我有太多不合适的东西.. 谢谢大家的意见.. :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 2016-11-07
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多