diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2017-08-18 14:05:10 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2017-09-20 21:40:31 +0200 |
commit | 17d7194d291bf91d130b78e06cbe27b290e0376d (patch) | |
tree | 6197e445e38169e4672b80072dccabcca8d54dde /lib | |
parent | b10d7eb74064c5906f031cd17c0f82041c6a4ca1 (diff) | |
download | elfutils-17d7194d291bf91d130b78e06cbe27b290e0376d.tar.gz |
Make sure packed structs follow the gcc memory layout
gcc defaults to using struct layouts that follow the native conventions,
even if __attribute__((packed)) is given. In order to get the layout we
expect, we need to tell gcc to always use the gcc struct layout, at
least for packed structs. To do this, we can use the gcc_struct
attribute.
This is important, not only for porting to windows, but also potentially
for other platforms, as the bugs resulting from struct layout
differences are rather subtle and hard to find.
Signed-off-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ChangeLog | 5 | ||||
-rw-r--r-- | lib/eu-config.h | 8 |
2 files changed, 13 insertions, 0 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog index 23c0f41b..61230453 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,8 @@ +2017-08-18 Ulf Hermann <ulf.hermann@qt.io> + + * eu-config.h: Define attribute_packed to either + __attribute__((packed)) or __attribute__((packed, gcc_struct)). + 2017-04-27 Ulf Hermann <ulf.hermann@qt.io> * eu-config.h: Define attribute_hidden to be empty if the compiler diff --git a/lib/eu-config.h b/lib/eu-config.h index 07098282..135803e7 100644 --- a/lib/eu-config.h +++ b/lib/eu-config.h @@ -75,6 +75,14 @@ #define attribute_hidden /* empty */ #endif +#ifdef HAVE_GCC_STRUCT +#define attribute_packed \ + __attribute__ ((packed, gcc_struct)) +#else +#define attribute_packed \ + __attribute__ ((packed)) +#endif + /* Define ALLOW_UNALIGNED if the architecture allows operations on unaligned memory locations. */ #define SANITIZE_UNDEFINED 1 |