Messages in this thread | | | Date | Wed, 6 Dec 2006 16:54:39 +0100 | From | Jan Blunck <> | 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |