On Mon, Sep 01, 2014 at 09:14:31AM +0800, Peng Fan wrote: > > > On 09/01/2014 08:09 AM, Matt Thomas wrote: > > > > On Aug 31, 2014, at 11:32 AM, Joel Sherrill <joel.sherr...@oarcorp.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' > >> > >> 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. > > > armv7 and armv6 arch except armv6-m support unaligned access. a u8 pointer is > casted to u32 pointer, should gcc take the align problem into consideration > to avoid possible errors? because -mno-unaligned-access. > > While armv7 and armv6 supports unaligned access, that support has to be > > enabled by the underlying O/S. Not knowing the underlying environment, > > I can't say whether that support is enabled. One issue we had in NetBSD > > in moving to gcc4.8 was that the NetBSD/arm kernel didn't enable unaligned > > access for armv[67] CPUs. We quickly changed things so unaligned access > > is supported. > > Yeah. by set a hardware bit in arm coprocessor, unaligned access will not > cause data abort exception. > I just wonder is the following correct? should gcc take the responsibility to > take care possible unaligned pointer `u8 *data`? because > -mno-unaligned-access is passed to gcc. > > int func(u8 *data) > > { > > return *(unsigned int *)data; > > }
I guess -mno-unaligned-access only applies to (potentially) unaligned addresses that the compiler itself is aware of, like packed struct members. Otherwise gcc would have to consider *every* memory load/store as unaligned and break them down into byte loads/stores. In the above case, you are telling the compiler that you know it is word aligned (by casting), and the compiler believes you :). Regards Senthil