This is the mail archive of the
elfutils-devel@sourceware.org
mailing list for the elfutils project.
[PATCH] Make sure packed structs follow the gcc memory layout
- From: Ulf Hermann <ulf dot hermann at qt dot io>
- To: <elfutils-devel at sourceware dot org>
- Date: Wed, 3 May 2017 13:35:30 +0200
- Subject: [PATCH] Make sure packed structs follow the gcc memory layout
- Authentication-results: sourceware.org; auth=none
- Authentication-results: sourceware.org; dkim=none (message not signed) header.d=none;sourceware.org; dmarc=none action=none header.from=qt.io;
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qtcompany.onmicrosoft.com; s=selector1-qt-io; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Gg6NkdWBE7w+MGHrDoGm5Zj6p4yjEtjQN1oEqx7iwAs=; b=F5Bkv7SKLwBWD+ghLYvFOs6mKur3AWMSSRds8IWfnhlYEbtaX8xD1KM/gX/8vYikzwLviEdP1aV/tFdh8OEAqgsKHdk0v9+wI9mZY1B5x2z/l+Ab6dss+jFnlsSt1odOF3CYtWo4CWS1ocIt1QD2Av8KsWZ3icMoZ6Gcu1r3Ozg=
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
On windows gcc by default generates code that follows the MSVC layout.
We don't want that as it adds extra padding.
Signed-off-by: Ulf Hermann <ulf.hermann@qt.io>
---
ChangeLog | 5 +++++
backends/ChangeLog | 4 ++++
backends/linux-core-note.c | 2 +-
configure.ac | 13 +++++++++++++
lib/ChangeLog | 5 +++++
lib/eu-config.h | 8 ++++++++
libcpu/ChangeLog | 4 ++++
libcpu/memory-access.h | 2 +-
libdw/ChangeLog | 4 ++++
libdw/memory-access.h | 2 +-
libelf/ChangeLog | 4 ++++
libelf/gelf_xlate.c | 2 +-
12 files changed, 51 insertions(+), 4 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index eaea959..392efaa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2017-05-03 Ulf Hermann <ulf.hermann@qt.io>
+ * configure.ac: Check if the compiler supports
+ __attribute__((gcc_struct)).
+
+2017-05-03 Ulf Hermann <ulf.hermann@qt.io>
+
* configure.ac: Add check for -rdynamic.
2017-04-28 Ulf Hermann <ulf.hermann@qt.io>
diff --git a/backends/ChangeLog b/backends/ChangeLog
index 8985f7c..caefcf4 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,7 @@
+2017-05-03 Ulf Hermann <ulf.hermann@qt.io>
+
+ * linux-core-note.c: Use attribute_packed.
+
2017-04-06 Mark Wielaard <mark@klomp.org>
* i386_unwind.c: New file.
diff --git a/backends/linux-core-note.c b/backends/linux-core-note.c
index 67638d7..08282ba 100644
--- a/backends/linux-core-note.c
+++ b/backends/linux-core-note.c
@@ -111,7 +111,7 @@ struct EBLHOOK(prstatus)
FIELD (INT, pr_fpvalid);
}
#ifdef ALIGN_PRSTATUS
- __attribute__ ((packed, aligned (ALIGN_PRSTATUS)))
+ attribute_packed __attribute__ ((aligned (ALIGN_PRSTATUS)))
#endif
;
diff --git a/configure.ac b/configure.ac
index e45584e..e4b2946 100644
--- a/configure.ac
+++ b/configure.ac
@@ -185,6 +185,19 @@ if test "$ac_cv_visibility" = "yes"; then
[Defined if __attribute__((visibility())) is supported])
fi
+AC_CACHE_CHECK([whether gcc supports __attribute__((gcc_struct))],
+ ac_cv_gcc_struct, [dnl
+save_CFLAGS="$CFLAGS"
+CFLAGS="$save_CFLAGS -Werror"
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([dnl
+struct test { int x; } __attribute__((gcc_struct));
+])], ac_cv_gcc_struct=yes, ac_cv_gcc_struct=no)
+CFLAGS="$save_CFLAGS"])
+if test "$ac_cv_gcc_struct" = "yes"; then
+ AC_DEFINE([HAVE_GCC_STRUCT], [1],
+ [Defined if __attribute__((gcc_struct)) is supported])
+fi
+
AC_CACHE_CHECK([whether gcc supports -fPIC], ac_cv_fpic, [dnl
save_CFLAGS="$CFLAGS"
CFLAGS="$save_CFLAGS -fPIC -Werror"
diff --git a/lib/ChangeLog b/lib/ChangeLog
index ecc6179..6c0ac6d 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,8 @@
+2017-05-03 Ulf Hermann <ulf.hermann@qt.io>
+
+ * eu-config.h: Define attribute_packed to be either only
+ __attribute__((packed)) or to include gcc_struct if available.
+
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 0709828..135803e 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
diff --git a/libcpu/ChangeLog b/libcpu/ChangeLog
index ef5da58..a50a87b 100644
--- a/libcpu/ChangeLog
+++ b/libcpu/ChangeLog
@@ -1,3 +1,7 @@
+2017-05-03 Ulf Hermann <ulf.hermann@qt.io>
+
+ * memory-access.h: Use attribute_packed.
+
2017-02-27 Ulf Hermann <ulf.hermann@qt.io>
* Makefile.am: Use fpic_CFLAGS.
diff --git a/libcpu/memory-access.h b/libcpu/memory-access.h
index 44210e2..779825f 100644
--- a/libcpu/memory-access.h
+++ b/libcpu/memory-access.h
@@ -90,7 +90,7 @@ union unaligned
int16_t s2;
int32_t s4;
int64_t s8;
- } __attribute__ ((packed));
+ } attribute_packed;
static inline uint16_t
read_2ubyte_unaligned (const void *p)
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 0d94ad5..f4b9dfb 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,5 +1,9 @@
2017-05-03 Ulf Hermann <ulf.hermann@qt.io>
+ * memory-access.h: Use attribute_packed.
+
+2017-05-03 Ulf Hermann <ulf.hermann@qt.io>
+
* Makefile.am: Output dw.def when linking dw.dll and create dw.lib
when installing.
diff --git a/libdw/memory-access.h b/libdw/memory-access.h
index a749b5a..afb651f 100644
--- a/libdw/memory-access.h
+++ b/libdw/memory-access.h
@@ -170,7 +170,7 @@ union unaligned
int16_t s2;
int32_t s4;
int64_t s8;
- } __attribute__ ((packed));
+ } attribute_packed;
# define read_2ubyte_unaligned(Dbg, Addr) \
read_2ubyte_unaligned_1 ((Dbg)->other_byte_order, (Addr))
diff --git a/libelf/ChangeLog b/libelf/ChangeLog
index 8dfa2b7..52f69e7 100644
--- a/libelf/ChangeLog
+++ b/libelf/ChangeLog
@@ -1,5 +1,9 @@
2017-05-03 Ulf Hermann <ulf.hermann@qt.io>
+ * gelf_xlate.c: Use attribute_packed.
+
+2017-05-03 Ulf Hermann <ulf.hermann@qt.io>
+
* Makefile.am: Output elf.def when linking elf.dll and create elf.lib
when installing.
diff --git a/libelf/gelf_xlate.c b/libelf/gelf_xlate.c
index f3d3b7a..479f143 100644
--- a/libelf/gelf_xlate.c
+++ b/libelf/gelf_xlate.c
@@ -74,7 +74,7 @@ union unaligned
uint16_t u16;
uint32_t u32;
uint64_t u64;
- } __attribute__ ((packed));
+ } attribute_packed;
#define FETCH(Bits, ptr) (((const union unaligned *) ptr)->u##Bits)
#define STORE(Bits, ptr, val) (((union unaligned *) ptr)->u##Bits = val)
--
2.1.4