diff options
author | Florian Weimer <fweimer@redhat.com> | 2020-11-11 11:59:11 +0100 |
---|---|---|
committer | Sergei Trofimovich <slyfox@gentoo.org> | 2020-12-07 20:03:15 +0000 |
commit | 144a4e0522111e8c03cfeb408d4af3db65b568e7 (patch) | |
tree | dd56973dde16490196fc2cf6c08950733cdd4961 | |
parent | resolv: Serialize processing in resolv/tst-resolv-txnid-collision (diff) | |
download | glibc-144a4e0522111e8c03cfeb408d4af3db65b568e7.tar.gz glibc-144a4e0522111e8c03cfeb408d4af3db65b568e7.tar.bz2 glibc-144a4e0522111e8c03cfeb408d4af3db65b568e7.zip |
struct _Unwind_Exception alignment should not depend on compiler flags
__attribute__((__aligned__)) selects an alignment that depends on
the micro-architecture selected by GCC flags. Enabling vector
extensions may increase the allignment. This is a problem when
building glibc as a collection of ELF multilibs with different
GCC flags because ld.so and libc.so/libpthread.so/&c may end up
with a different layout of struct pthread because of the
changing offset of its struct _Unwind_Exception field.
Tested-By: Matheus Castanho <msc@linux.ibm.com>
(cherry picked from commit 30af7c7fa13e17d82c3f1f91536384715844f432)
-rw-r--r-- | sysdeps/generic/unwind.h | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/sysdeps/generic/unwind.h b/sysdeps/generic/unwind.h index b667a5b652..c229603af3 100644 --- a/sysdeps/generic/unwind.h +++ b/sysdeps/generic/unwind.h @@ -75,15 +75,21 @@ typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code, struct _Unwind_Exception { - _Unwind_Exception_Class exception_class; - _Unwind_Exception_Cleanup_Fn exception_cleanup; - _Unwind_Word private_1; - _Unwind_Word private_2; - - /* @@@ The IA-64 ABI says that this structure must be double-word aligned. - Taking that literally does not make much sense generically. Instead we - provide the maximum alignment required by any type for the machine. */ -} __attribute__((__aligned__)); + union + { + struct + { + _Unwind_Exception_Class exception_class; + _Unwind_Exception_Cleanup_Fn exception_cleanup; + _Unwind_Word private_1; + _Unwind_Word private_2; + }; + + /* The IA-64 ABI says that this structure must be double-word aligned. */ + _Unwind_Word unwind_exception_align[2] + __attribute__ ((__aligned__ (2 * sizeof (_Unwind_Word)))); + }; +}; /* The ACTIONS argument to the personality routine is a bitwise OR of one |