https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110044
Bug ID: 110044 Summary: #pragma pack(push, 1) may not force packing, while __attribute__((packed, aligned(1))) works Product: gcc Version: 12.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: vital.had at gmail dot com CC: iains at gcc dot gnu.org Target Milestone: --- Target: powerpc-apple-darwin Problem: #pragma pack(push, 1) may not work correctly on ppc (32-bit); seems to be present across GCC versions, confirmed to affect gcc7, gcc11 and gcc12. Old Apple GCC 4.2 is not affected, at the same time. Test code: #include <iostream> #include <stdint.h> #pragma pack(push, 1) /* struct from OpenEXR; should be packed with the pragma directive */ typedef struct { uint32_t x_size; uint32_t y_size; uint8_t level_and_round; } exr_attr_tiledesc_t; /* same struct but reordered */ typedef struct { uint8_t level_and_round; uint32_t x_size; uint32_t y_size; } new1_exr_attr_tiledesc_t; /* same as first struct but with packed forced */ typedef struct { uint32_t x_size; uint32_t y_size; uint8_t level_and_round; } __attribute__((packed, aligned(1))) new2_exr_attr_tiledesc_t; #pragma pack(pop) int main() { std::cout << sizeof(exr_attr_tiledesc_t) << " " << sizeof(new1_exr_attr_tiledesc_t) << " " << sizeof(new2_exr_attr_tiledesc_t) << "\n"; return 0; } On Mac OS X Leopart (10.5 PowerPC): `g++-mp-7 main.cxx && ./a.out` gives: 12 9 9 `g++ main.cxx && ./a.out` gives: 9 9 9 `g++* -arch ppc64 && ./a.out` gives: 9 9 9 On Mac OS X Snow Leopard (10A190 PowerPC): `g++-mp-11 main.cxx && ./a.out` gives: 12 9 9 `g++-mp-12 main.cxx && ./a.out` gives: 12 9 9 `g++ main.cxx && ./a.out` gives: 9 9 9 where g++ stands for Xcode gcc-4.2. Discussion in: https://github.com/macports/macports-ports/pull/18872 Also see: https://trac.macports.org/ticket/63490