On Fri, Nov 7, 2008 at 10:52 PM, Marcus Tangermann <Marcus.Tangermann@xxxxxx> wrote: > Hi, > > we use an XScale 422 (ARM) with a big endian Linux system based on the buildroot environment. It seems there is an alignment problem we have. I've tracked down the problem to the following. > 1. The data received via a netlink communication from the kernel is stored into a buffer buf. The data is correct. > 2. The address of the buffer is converted to a pointer to nlmsghdr: > struct nlmsghdr *h; > h = (struct nlmsghdr*) buf; > printf("IPSECTOOLS: Length %04d\n", h->nlmsg_len); > printf("IPSECTOOLS: Type %02d\n", h->nlmsg_type); > The results of printf are nonsens. The first fields seem to have an offset of 2 bytes, at the end there also seem to be swapped bytes. > 3. To test what might happen, I've created an own struct > struct aligntest{ > __u32 first; > __u32 int second; > __u32 third; > __u32 fourth; > }; > When you now set a point to a buffer, again the values are wrong: > s1 = (struct aligntest*) buf; > printf("1: %08X\n", s1->first); > printf("2: %08X\n", s1->second); > printf("3: %08X\n", s1->third); > printf("4: %08X\n", s1->fourth); > > It seems, that there is a problem with the unsigned int values. When you add the attribute "packed" to the definition of struct aligntest ( __attribute__(__packed__) ), all values are displayed correctly. > So, any hints what the problem can be? I'm not sure what the problem is? You can't generally misalign a struct pointer safely. -- To unsubscribe from this list: send the line "unsubscribe linux-embedded" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html