lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20061206155439.GA6727@hasse.suse.de>
Date:	Wed, 6 Dec 2006 16:54:39 +0100
From:	Jan Blunck <jblunck@...e.de>
To:	Phil Endecott <phil_arcwk_endecott@...zphil.org>
Cc:	linux-kernel@...r.kernel.org
Subject: Re: Subtleties of __attribute__((packed))

On Wed, Dec 06, Phil Endecott wrote:

> I don't think so.  Example:
> 
> struct test {
>   int a __attribute__((packed));
>   int b __attribute__((packed));
> };
> 
> char c = 1;
> struct test t = { .a=2, .b=3 };
> 
> $ arm-linux-gnu-gcc -O2 -S -W -Wall test1.c
> 
> 	.file	"test2.c"
> 	.global	c
> 	.data
> 	.type	c, %object
> 	.size	c, 1
> c:
> 	.byte	1
> 	.global	t
> 	.align	2               <<<<<<<<===== t is aligned
> 	.type	t, %object
> 	.size	t, 8
> t:
> 	.word	2
> 	.word	3
> 	.ident	"GCC: (GNU) 4.1.2 20061028 (prerelease) (Debian 4.1.1-19)"
> 
> 
> Compare with:
> 
> struct test {
>   int a;
>   int b;
> } __attribute__((packed));
> 
> char c = 1;
> struct test t = { .a=2, .b=3 };
> 
> $ arm-linux-gnu-gcc -O2 -S -W -Wall test2.c
> 
> 	.file	"test1.c"
> 	.global	c
> 	.data
> 	.type	c, %object
> 	.size	c, 1
> c:
> 	.byte	1
> 	.global	t                    <<<<<<  "align" has gone, t is unaligned
> 	.type	t, %object
> 	.size	t, 8
> t:
> 	.4byte	2
> 	.4byte	3
> 	.ident	"GCC: (GNU) 4.1.2 20061028 (prerelease) (Debian 4.1.1-19)"
> 

Maybe the arm backend is somehow broken. AFAIK (and I verfied it on S390 and
i386) the alignment shouldn't change.

struct foo {
	int a;
	char b;
	int c;
};

struct bar1 {
	char a __attribute__((__packed__));
	struct foo b __attribute__((__packed__));
};

struct bar2 {
	char a;
	struct foo b;
} __attribute__((__packed__));

struct bar3 {
	char a;
	struct foo b;
};

struct bar1 packed1 = { 10, { 20, 30, 40 } };
struct bar2 packed2 = { 50, { 60, 70, 80 } };
struct bar3 unpacked = { 90, { 100, 110, 120 } };

s390x-linux-gcc -S packed2.c:
packed2.c:9: warning: '__packed__' attribute ignored for field of type 'char'

	.file	"packed2.c"
.globl packed1
.data
	.align	2
	.type	packed1, @object
	.size	packed1, 13
packed1:
	.byte	10
	.4byte	20
	.byte	30
	.zero	3
	.4byte	40
.globl packed2
	.align	2
	.type	packed2, @object
	.size	packed2, 13
packed2:
	.byte	50
	.4byte	60
	.byte	70
	.zero	3
	.4byte	80
.globl unpacked
	.align	4
	.type	unpacked, @object
	.size	unpacked, 16
unpacked:
	.byte	90
	.zero	3
	.long	100
	.byte	110
	.zero	3
	.long	120
	.ident	"GCC: (GNU) 4.1.2 20060531 (prerelease) (SUSE Linux)"
	.section	.note.GNU-stack,"",@progbits
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ