On Fri, Nov 7, 2008 at 10:52 PM, Marcus Tangermann
<[EMAIL PROTECTED]> 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 [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to