[compiler-rt] 947f969 - Fix sanitizer-common build with glibc 2.31

Evgenii Stepanov via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 26 11:02:59 PST 2019


On Tue, Nov 26, 2019 at 6:53 AM Tom Stellard <tstellar at redhat.com> wrote:

> On 11/25/2019 02:38 PM, Evgenii Stepanov via llvm-commits wrote:
> >
> > Author: Evgenii Stepanov
> > Date: 2019-11-25T14:38:10-08:00
> > New Revision: 947f9692440836dcb8d88b74b69dd379d85974ce
> >
> > URL:
> https://github.com/llvm/llvm-project/commit/947f9692440836dcb8d88b74b69dd379d85974ce
> > DIFF:
> https://github.com/llvm/llvm-project/commit/947f9692440836dcb8d88b74b69dd379d85974ce.diff
> >
> > LOG: Fix sanitizer-common build with glibc 2.31
> >
>
> Hi Evgenii,
>
> Should we backport this to the release/9.x branch?
>

We could. I don't know what the policy is - this is not a regression, just
a bug fix - but it is pretty safe and kind of important for people on newer
glibc.


> -Tom
>
> > Summary:
> > As mentioned in D69104, glibc changed ABI recently with the [[
> https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=2f959dfe849e0646e27403f2e4091536496ac0f0|
> 2f959dfe ]] change.
> > D69104 dealt with just 32-bit ARM, but that is just one of the many
> affected architectures.
> > E.g. x86_64, i?86, riscv64, sparc 32-bit, s390 31-bit are affected too
> (and various others).
> >
> > This patch instead of adding a long list of further architectures that
> wouldn't be checked ever next to arm 32-bit changes the structures to match
> the 2.31 layout and performs the checking on Linux for ipc_perm mode
> position/size only on non-Linux or on Linux with glibc 2.31 or later.  I
> think this matches what is done for aarch64 already.
> > If needed, we could list architectures that haven't changed ABI (e.g.
> powerpc), so that they would be checked even with older glibcs.  AFAIK
> sanitizers don't actually use ipc_perm.mode and
> > so all they care about is the size and alignment of the whole structure.
> >
> > Note, s390 31-bit and arm 32-bit big-endian changed ABI even further,
> there will now be shmctl with old symbol version and shmctl@@GLIBC_2.31
> which will be incompatible.  I'm afraid this isn't really solvable unless
> the sanitizer libraries are symbol versioned and use matching symbol
> versions to glibc symbols for stuff they intercept, plus use dlvsym.
> > This patch doesn't try to address that.
> >
> > Patch by Jakub Jelinek.
> >
> > Reviewers: kcc, eugenis, dvyukov
> >
> > Reviewed By: eugenis
> >
> > Subscribers: jyknight, kristof.beyls, fedor.sergeev, simoncook, PkmX,
> s.egerton, steven.zhang, #sanitizers, llvm-commits
> >
> > Tags: #sanitizers, #llvm
> >
> > Differential Revision: https://reviews.llvm.org/D70662
> >
> > Added:
> >
> >
> > Modified:
> >     compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
> >     compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
> >
> > Removed:
> >
> >
> >
> >
> ################################################################################
> > diff  --git
> a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
> b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
> > index b4f8f67b664c..aa845df4dde4 100644
> > ---
> a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
> > +++
> b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
> > @@ -1128,11 +1128,9 @@ CHECK_SIZE_AND_OFFSET(ipc_perm, uid);
> >  CHECK_SIZE_AND_OFFSET(ipc_perm, gid);
> >  CHECK_SIZE_AND_OFFSET(ipc_perm, cuid);
> >  CHECK_SIZE_AND_OFFSET(ipc_perm, cgid);
> > -#if (!defined(__aarch64__) || !SANITIZER_LINUX || __GLIBC_PREREQ (2,
> 21)) && \
> > -    !defined(__arm__)
> > -/* On aarch64 glibc 2.20 and earlier provided incorrect mode field.  */
> > -/* On Arm newer glibc provide a
> > diff erent mode field, it's hard to detect
> > -   so just disable the check.  */
> > +#if !SANITIZER_LINUX || __GLIBC_PREREQ (2, 31)
> > +/* glibc 2.30 and earlier provided 16-bit mode field instead of 32-bit
> > +   on many architectures.  */
> >  CHECK_SIZE_AND_OFFSET(ipc_perm, mode);
> >  #endif
> >
> >
> > diff  --git
> a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
> b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
> > index 7789bc5887a4..5337b26b29b8 100644
> > --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
> > +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
> > @@ -207,26 +207,13 @@ struct __sanitizer_ipc_perm {
> >    u64 __unused1;
> >    u64 __unused2;
> >  #elif defined(__sparc__)
> > -#if defined(__arch64__)
> >    unsigned mode;
> > -  unsigned short __pad1;
> > -#else
> > -  unsigned short __pad1;
> > -  unsigned short mode;
> >    unsigned short __pad2;
> > -#endif
> >    unsigned short __seq;
> >    unsigned long long __unused1;
> >    unsigned long long __unused2;
> > -#elif defined(__mips__) || defined(__aarch64__) || defined(__s390x__)
> > -  unsigned int mode;
> > -  unsigned short __seq;
> > -  unsigned short __pad1;
> > -  unsigned long __unused1;
> > -  unsigned long __unused2;
> >  #else
> > -  unsigned short mode;
> > -  unsigned short __pad1;
> > +  unsigned int mode;
> >    unsigned short __seq;
> >    unsigned short __pad2;
> >  #if defined(__x86_64__) && !defined(_LP64)
> >
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191126/6b75cab3/attachment-0001.html>


More information about the llvm-commits mailing list