On August 31, 2014 8:19:49 AM CDT, Peng Fan <van.free...@gmail.com> wrote:
>Hi,
>
>I am writing some code and found that system crashed. I found it was
>unaligned access which causes `data abort` exception. I write a piece
>of code and objdump
>it. I am not sure this is right or not.
>
>command:
>arm-poky-linux-gnueabi-gcc -marm -mno-thumb-interwork -mabi=aapcs-linux
>-mword-relocations -march=armv7-a -mno-unaligned-access
>-ffunction-sections -fdata-sections -fno-common -ffixed-r9 -msoft-float
>-pipe  -O2 -c 2.c -o 2.o
>
>arch is armv7-a and used '-mno-unaligned access'
>
>c code:
>typedef unsigned char u8;                                              
>        
>int func(u8 *data)                                                     
>        
>{                                                                      
>        
>return *(unsigned int *)data;                                          
>
>}
>
>The objdumped asm code is:
>                                                                       
>Disassembly of section .text.func:                                     
>        
>                                                                       
>00000000 <func>:                                                       
>        
>0: e5900000  ldr r0, [r0]                                              
>     
>   4: e12fff1e  bx  lr
>
>from the asm code, we can see that 'ldr r0, [r0]' corresponding to
>'*(unsigned int*)data'. is this correct?
>we can not guarantee that pointer data is 4bytes aligned. If pointer
>data is not 4bytes aligned, and aligned 
>access check is enabled by setting a hardware bit in arm coprocessor,
>then `data abort` may occur.
>
>

I think this is totally expected. You were passed a u8 pointer which is aligned 
for that type (no restrictions likely). You cast it to a type with stricter 
alignment requirements. The code is just flawed. Some CPUs handle unaligned 
accesses but not your ARM.

If you turn on Wall, do you get a warning? 

>Regards,
>Peng.

Reply via email to