Subject: Re: arm, net and '__attribute__ ((__packed__))'
To: Sami Kantoluoto <sami.kantoluoto@embedtronics.fi>
From: Richard Earnshaw <Richard.Earnshaw@buzzard.freeserve.co.uk>
List: tech-embed
Date: 02/05/2005 14:04:14
On Sat, 05 Feb 2005 15:48:39 +0200, Sami Kantoluoto wrote:
> Hi,
> 
> We're using the network stack and wi driver ported from NetBSD to our
> embedded operating system and I'm wondering if there's something wrong with
> missing '__attribute__ ((__packed__))'s or something. So, I noticed that
> 'sizeof(struct llc)' returned 10 (arm-elf-gcc 3.4.2). Then I removed the
> comments (and 'XXX' and '???') from 'llc_un'. Which means:
> 
> struct llc {
> 	u_int8_t llc_dsap;
> 	u_int8_t llc_ssap;
> 	union {
> 		.
> 		.
> 		.
> 	} llc_un __attribute__((__packed__));
> } __attribute__((__packed__));
> 
> This had no effect. Then I swapped 'llc_un' and
> '__attribute__((__packed__))' and it worked (sizeof(struct llc) == 8). So:
> 
> struct llc {
> 	u_int8_t llc_dsap;
> 	u_int8_t llc_ssap;
> 	union {
> 		.
> 		.
> 		.
> 	} __attribute__((__packed__)) llc_un;
> } __attribute__((__packed__));
> 
> 
> I can't believe that NetBSD has any problems with these so maybe I'm missing
> some compiler options or has NetBSD's gcc been patched or something else?
> 

NetBSD uses gcc configured with structure-size-boundary set to 8, rather 
than 32 (the default for a standard arm-elf compiler).  Which is why you 
are seeing this problem.  Try building *all* your code with 
-mstructure-size-boundary=8.

But yes, this is probably a bug in the header file.  Could you file a PR?

R.