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

Reply via email to