取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
Highlighted
Newbie
Newbie
1,032 次查看
注册日期: ‎12-21-2018

petalinx 2014.4 的gcc编译的程序 运行时alignment exception. 换其它gcc则运行正常

跳至解决方案

Petalinux 版本 2014.4. 应用程序都是用该版本自带的gcc工具链编译。

测试代码如下(出于其它原因,这里使用#pragma pack对数据结构强制1字节对齐):

#include <stdlib.h>
#include <stdio.h>
#pragma pack (push, 1)
struct MyData {
    char a;
    short b;
    float c;
};

#pragma pack (pop)

void calc(float *data)
{
    float tmp = 1.1;
    *data = tmp * 2;
}

int main()
{
    struct MyData dd;
    calc(&dd.c);
    printf("dd.c = %f\n", dd.c);
}

编译没问题:

 

$ arm-xilinx-linux-gnueabi-g++ align-test.cpp -o align-test

在ARM平台上运行出错:

 

root@linux:~# ./align-test
Alignment trap: align-test (1096) PC=0x00008558 Instr=0xedc37a00 Address=0x3ed33bab FSR 0x811
Alignment trap: not handling instruction edc37a00 at [<00008558>]
Unhandled fault: alignment exception (0x811) at 0x3ed33bab
Bus error

gcc信息:

 

arm-xilinx-linux-gnueabi-g++ (Sourcery CodeBench Lite 2014.05-23) 4.8.3 20140320 (prerelease)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

 

同样的代码,我下载了另外一个gcc (linaro)编译:

chl@builder:test$ arm-linux-gnueabi-g++ --version
arm-linux-gnueabi-g++ (Ubuntu/Linaro 4.7.3-12ubuntu1) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

chl@builder:test$ arm-linux-gnueabi-g++ align-test.cpp -o align-test2

在同一个ARM系统上运行,是好的。

 

root@linux:~# ./align-test2
dd.c = 2.200000

 

问题来了:

1. petalinux-v2014.4的gcc为什么有这样的问题?和该gcc编译时的什么选项有关吗?

2. 要怎样使gcc支持unaligned memory access?

我不想换其他gcc,因为petalinx工程中其它部分都是用自带的gcc编译的。

 

PS: 我有尝试在编译程序的时候使用'-munaligned-access'参数,没有效果。

标记 (2)
0 项奖励
1 解答

已接受的解答
Highlighted
Moderator
Moderator
913 次查看
注册日期: ‎05-23-2018

Hi, @lchen1

在ARM处理器中,SCTLR的A bit是与unaligned memory access有关的。在默认的情况下,A bit一般置为1(strict alignment fault checking enabled)。而当编译器没有为unaligned memeory access做优化时,即编译器认为A bit为0(strict alignment fault checking disabled),程序运行就会报错。因此,您应该在编译选项中加入-mno-unaligned-access,看看是否可以解决您的问题。

您也可以通过更换其他交叉编译链的方式解决您的问题。另外,2014.4的版本有些太老了,建议您使用新版本的petalinux看看是否还会出现这样的问题。

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------

在原帖中查看解决方案

0 项奖励
3 回复数
Highlighted
Moderator
Moderator
975 次查看
注册日期: ‎05-23-2018

Hi, @lchen1

可以参考一下官方kernel文档中对于alignment memory access的说明。

https://github.com/Xilinx/linux-xlnx/blob/master/Documentation/unaligned-memory-access.txt

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
Highlighted
Newbie
Newbie
927 次查看
注册日期: ‎12-21-2018

我能理解使用memcpy替代赋值可以解决unaligned access问题。事实上,现在我也使用该方法做为目前项目中的解决方案。

不过让我困惑的是,同样的目标平台我只是换了ubuntu源里自带的arm-linux-gnuabi-gcc编译同样的代码,就不会出现异常。我在想是不是和编译gcc本身时的什么选项有关。

我考虑从编译器的层面解决这一问题的原因,在于我们的历史代码中可能仍然存在unalignment access的语句(通常还只是基本的指针赋值操作,很难搜索定位)。所以除了修改代码使用memcpy,我在想编译器层面也能避免抛出异常就更保险了。

 

0 项奖励
Highlighted
Moderator
Moderator
914 次查看
注册日期: ‎05-23-2018

Hi, @lchen1

在ARM处理器中,SCTLR的A bit是与unaligned memory access有关的。在默认的情况下,A bit一般置为1(strict alignment fault checking enabled)。而当编译器没有为unaligned memeory access做优化时,即编译器认为A bit为0(strict alignment fault checking disabled),程序运行就会报错。因此,您应该在编译选项中加入-mno-unaligned-access,看看是否可以解决您的问题。

您也可以通过更换其他交叉编译链的方式解决您的问题。另外,2014.4的版本有些太老了,建议您使用新版本的petalinux看看是否还会出现这样的问题。

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------

在原帖中查看解决方案

0 项奖励