I compiled GCC 5.1 on my PowerMac today and noticed that zip archive
reading broke in my program. Upon investigation it seems like GCC is
adding padding (presumably trailing) to a structure which represents a
chunk of the archive on disk, which has been declared within #pragma
pack(1). Adding __attribute__((packed)) to the structure does bring the
structure to the correct size, but from what I understand this is a GCC
specific feature.
The following structure can demonstrate the problem on PowerPC:
struct S1 {
uint32_t x;
uint16_t y;
};
On x86 #pragma pack(1) will make sizeof(S1) == 6. On PowerPC without
__attribute__((packed)) it is 8. I do believe I found #pragma pack to
be working as some other, more complex, structures end up with less
padding, but not to the extent of the attribute. (Somewhat peculiarly,
swapping the two members results in the structure being the expected
size. I assume it's done to try to keep accesses to x aligned, and in
the swapped case not padding the end means the access would be aligned
every other array element.)
Is this difference in behavior between the two features, which sound
like they should be doing the same thing, intentional? The change
appears to have happened around GCC 4.4 as 4.2 behaves as expected
(haven't tested 4.3 yet).
- Braden Obrzut