Pre Merge pull request !11 from geliwei/a8-autopr
This commit is contained in:
commit
b794810270
8 changed files with 212 additions and 868 deletions
|
@ -1,148 +0,0 @@
|
||||||
From ab887596903b159107e0be6f8b25986a5597cfca Mon Sep 17 00:00:00 2001
|
|
||||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
||||||
Date: Mon, 7 Feb 2022 10:44:17 -0500
|
|
||||||
Subject: [PATCH 2/4] Add a testcase to check alignment of PT_LOAD segment [BZ
|
|
||||||
#28676]
|
|
||||||
|
|
||||||
Backport from master commit: fc2334a
|
|
||||||
|
|
||||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
|
||||||
---
|
|
||||||
elf/Makefile | 14 ++++++++++++--
|
|
||||||
elf/tst-align3.c | 38 ++++++++++++++++++++++++++++++++++++++
|
|
||||||
elf/tst-alignmod3.c | 32 ++++++++++++++++++++++++++++++++
|
|
||||||
3 files changed, 82 insertions(+), 2 deletions(-)
|
|
||||||
create mode 100644 elf/tst-align3.c
|
|
||||||
create mode 100644 elf/tst-alignmod3.c
|
|
||||||
|
|
||||||
diff --git a/elf/Makefile b/elf/Makefile
|
|
||||||
index 2093cefa..0d3366e2 100644
|
|
||||||
--- a/elf/Makefile
|
|
||||||
+++ b/elf/Makefile
|
|
||||||
@@ -187,7 +187,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
|
||||||
tst-tls4 tst-tls5 \
|
|
||||||
tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-tls15 \
|
|
||||||
tst-tls16 tst-tls17 tst-tls18 tst-tls19 tst-tls-dlinfo \
|
|
||||||
- tst-align tst-align2 \
|
|
||||||
+ tst-align tst-align2 tst-align3 \
|
|
||||||
tst-dlmodcount tst-dlopenrpath tst-deep1 \
|
|
||||||
tst-dlmopen1 tst-dlmopen3 \
|
|
||||||
unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \
|
|
||||||
@@ -221,6 +221,9 @@ tests += tst-dlopen-aout
|
|
||||||
tst-dlopen-aout-no-pie = yes
|
|
||||||
endif
|
|
||||||
test-srcs = tst-pathopt
|
|
||||||
+ifeq (yes,$(have-fpie))
|
|
||||||
+tests-pie += tst-align3
|
|
||||||
+endif
|
|
||||||
selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
|
|
||||||
ifneq ($(selinux-enabled),1)
|
|
||||||
tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog
|
|
||||||
@@ -268,7 +271,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
|
||||||
circlemod3 circlemod3a \
|
|
||||||
reldep8mod1 reldep8mod2 reldep8mod3 \
|
|
||||||
reldep9mod1 reldep9mod2 reldep9mod3 \
|
|
||||||
- tst-alignmod tst-alignmod2 \
|
|
||||||
+ tst-alignmod tst-alignmod2 tst-alignmod3 \
|
|
||||||
$(modules-execstack-$(have-z-execstack)) \
|
|
||||||
tst-dlopenrpathmod tst-deep1mod1 tst-deep1mod2 tst-deep1mod3 \
|
|
||||||
tst-dlmopen1mod tst-auditmod1 \
|
|
||||||
@@ -1060,6 +1063,13 @@ CFLAGS-tst-alignmod2.c += $(stack-align-test-flags)
|
|
||||||
$(objpfx)tst-align: $(libdl)
|
|
||||||
$(objpfx)tst-align.out: $(objpfx)tst-alignmod.so
|
|
||||||
$(objpfx)tst-align2: $(objpfx)tst-alignmod2.so
|
|
||||||
+$(objpfx)tst-align3: $(objpfx)tst-alignmod3.so
|
|
||||||
+ifeq (yes,$(have-fpie))
|
|
||||||
+CFLAGS-tst-align3.c += $(PIE-ccflag)
|
|
||||||
+endif
|
|
||||||
+LDFLAGS-tst-align3 += -Wl,-z,max-page-size=0x200000
|
|
||||||
+LDFLAGS-tst-alignmod3.so += -Wl,-z,max-page-size=0x200000
|
|
||||||
+$(objpfx)tst-alignmod3.so: $(libsupport)
|
|
||||||
|
|
||||||
$(objpfx)unload3: $(libdl)
|
|
||||||
$(objpfx)unload3.out: $(objpfx)unload3mod1.so $(objpfx)unload3mod2.so \
|
|
||||||
diff --git a/elf/tst-align3.c b/elf/tst-align3.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000..ac86d623
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/elf/tst-align3.c
|
|
||||||
@@ -0,0 +1,38 @@
|
|
||||||
+/* Check alignment of PT_LOAD segment in a shared library.
|
|
||||||
+ Copyright (C) 2021 Free Software Foundation, Inc.
|
|
||||||
+ This file is part of the GNU C Library.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
+ modify it under the terms of the GNU Lesser General Public
|
|
||||||
+ License as published by the Free Software Foundation; either
|
|
||||||
+ version 2.1 of the License, or (at your option) any later version.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
+ Lesser General Public License for more details.
|
|
||||||
+
|
|
||||||
+ You should have received a copy of the GNU Lesser General Public
|
|
||||||
+ License along with the GNU C Library; if not, see
|
|
||||||
+ <https://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+#include <support/check.h>
|
|
||||||
+#include <tst-stack-align.h>
|
|
||||||
+
|
|
||||||
+/* This should cover all possible page sizes we currently support. */
|
|
||||||
+#define ALIGN 0x200000
|
|
||||||
+
|
|
||||||
+int bar __attribute__ ((aligned (ALIGN))) = 1;
|
|
||||||
+
|
|
||||||
+extern int do_load_test (void);
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
+do_test (void)
|
|
||||||
+{
|
|
||||||
+ printf ("bar: %p\n", &bar);
|
|
||||||
+ TEST_VERIFY (is_aligned (&bar, ALIGN) == 0);
|
|
||||||
+
|
|
||||||
+ return do_load_test ();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+#include <support/test-driver.c>
|
|
||||||
diff --git a/elf/tst-alignmod3.c b/elf/tst-alignmod3.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000..0d33f237
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/elf/tst-alignmod3.c
|
|
||||||
@@ -0,0 +1,32 @@
|
|
||||||
+/* Check alignment of PT_LOAD segment in a shared library.
|
|
||||||
+ Copyright (C) 2021 Free Software Foundation, Inc.
|
|
||||||
+ This file is part of the GNU C Library.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
+ modify it under the terms of the GNU Lesser General Public
|
|
||||||
+ License as published by the Free Software Foundation; either
|
|
||||||
+ version 2.1 of the License, or (at your option) any later version.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
+ Lesser General Public License for more details.
|
|
||||||
+
|
|
||||||
+ You should have received a copy of the GNU Lesser General Public
|
|
||||||
+ License along with the GNU C Library; if not, see
|
|
||||||
+ <https://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+#include <support/check.h>
|
|
||||||
+#include <tst-stack-align.h>
|
|
||||||
+
|
|
||||||
+/* This should cover all possible page sizes we currently support. */
|
|
||||||
+#define ALIGN 0x200000
|
|
||||||
+
|
|
||||||
+int foo __attribute__ ((aligned (ALIGN))) = 1;
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
+do_load_test (void)
|
|
||||||
+{
|
|
||||||
+ printf ("foo: %p\n", &foo);
|
|
||||||
+ TEST_VERIFY (is_aligned (&foo, ALIGN) == 0);
|
|
||||||
+}
|
|
||||||
--
|
|
||||||
2.18.4
|
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
From 7ae4fdd1783cdfd30bfefdd7c3c3c9430f234406 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
||||||
Date: Tue, 15 Feb 2022 14:15:50 -0500
|
|
||||||
Subject: [PATCH] Properly check stack alignment [BZ #27901]
|
|
||||||
|
|
||||||
1. Replace
|
|
||||||
|
|
||||||
if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0)
|
|
||||||
|
|
||||||
which may be optimized out by compiler, with
|
|
||||||
|
|
||||||
int
|
|
||||||
__attribute__ ((weak, noclone, noinline))
|
|
||||||
is_aligned (void *p, int align)
|
|
||||||
{
|
|
||||||
return (((uintptr_t) p) & (align - 1)) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
2. Add TEST_STACK_ALIGN_INIT to TEST_STACK_ALIGN.
|
|
||||||
3. Add a common TEST_STACK_ALIGN_INIT to check 16-byte stack alignment
|
|
||||||
for both i386 and x86-64.
|
|
||||||
4. Update powerpc to use TEST_STACK_ALIGN_INIT.
|
|
||||||
|
|
||||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
|
||||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
|
||||||
---
|
|
||||||
sysdeps/generic/tst-stack-align.h | 40 ++++++++++++++++---------
|
|
||||||
sysdeps/i386/i686/tst-stack-align.h | 44 ---------------------------
|
|
||||||
sysdeps/i386/tst-stack-align.h | 41 -------------------------
|
|
||||||
sysdeps/powerpc/tst-stack-align.h | 27 +++++------------
|
|
||||||
sysdeps/x86/tst-stack-align.h | 28 ++++++++++++++++++
|
|
||||||
sysdeps/x86_64/tst-stack-align.h | 46 -----------------------------
|
|
||||||
6 files changed, 61 insertions(+), 165 deletions(-)
|
|
||||||
delete mode 100644 sysdeps/i386/i686/tst-stack-align.h
|
|
||||||
delete mode 100644 sysdeps/i386/tst-stack-align.h
|
|
||||||
create mode 100644 sysdeps/x86/tst-stack-align.h
|
|
||||||
delete mode 100644 sysdeps/x86_64/tst-stack-align.h
|
|
||||||
|
|
||||||
diff --git a/sysdeps/generic/tst-stack-align.h b/sysdeps/generic/tst-stack-align.h
|
|
||||||
index e5cb3310..e6050901 100644
|
|
||||||
--- a/sysdeps/generic/tst-stack-align.h
|
|
||||||
+++ b/sysdeps/generic/tst-stack-align.h
|
|
||||||
@@ -1,4 +1,5 @@
|
|
||||||
-/* Copyright (C) 2003-2018 Free Software Foundation, Inc.
|
|
||||||
+/* Check stack alignment. Generic version.
|
|
||||||
+ Copyright (C) 2003-2021 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
@@ -18,17 +19,28 @@
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
+int
|
|
||||||
+__attribute__ ((weak, noclone, noinline))
|
|
||||||
+is_aligned (void *p, int align)
|
|
||||||
+{
|
|
||||||
+ return (((uintptr_t) p) & (align - 1)) != 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+#ifndef TEST_STACK_ALIGN_INIT
|
|
||||||
+# define TEST_STACK_ALIGN_INIT() 0
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
#define TEST_STACK_ALIGN() \
|
|
||||||
- ({ \
|
|
||||||
- double _d = 12.0; \
|
|
||||||
- long double _ld = 15.0; \
|
|
||||||
- int _ret = 0; \
|
|
||||||
- printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
|
||||||
- if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- \
|
|
||||||
- printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, __alignof (long double)); \
|
|
||||||
- if ((((uintptr_t) &_ld) & (__alignof (long double) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- _ret; \
|
|
||||||
- })
|
|
||||||
+ ({ \
|
|
||||||
+ double _d = 12.0; \
|
|
||||||
+ long double _ld = 15.0; \
|
|
||||||
+ int _ret = TEST_STACK_ALIGN_INIT (); \
|
|
||||||
+ \
|
|
||||||
+ printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
|
||||||
+ _ret += is_aligned (&_d, __alignof (double)); \
|
|
||||||
+ \
|
|
||||||
+ printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, \
|
|
||||||
+ __alignof (long double)); \
|
|
||||||
+ _ret += is_aligned (&_ld, __alignof (long double)); \
|
|
||||||
+ _ret; \
|
|
||||||
+ })
|
|
||||||
diff --git a/sysdeps/i386/i686/tst-stack-align.h b/sysdeps/i386/i686/tst-stack-align.h
|
|
||||||
deleted file mode 100644
|
|
||||||
index 975f26ef..00000000
|
|
||||||
--- a/sysdeps/i386/i686/tst-stack-align.h
|
|
||||||
+++ /dev/null
|
|
||||||
@@ -1,44 +0,0 @@
|
|
||||||
-/* Copyright (C) 2003-2018 Free Software Foundation, Inc.
|
|
||||||
- This file is part of the GNU C Library.
|
|
||||||
-
|
|
||||||
- The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
- modify it under the terms of the GNU Lesser General Public
|
|
||||||
- License as published by the Free Software Foundation; either
|
|
||||||
- version 2.1 of the License, or (at your option) any later version.
|
|
||||||
-
|
|
||||||
- The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
- Lesser General Public License for more details.
|
|
||||||
-
|
|
||||||
- You should have received a copy of the GNU Lesser General Public
|
|
||||||
- License along with the GNU C Library; if not, see
|
|
||||||
- <http://www.gnu.org/licenses/>. */
|
|
||||||
-
|
|
||||||
-#include <stdio.h>
|
|
||||||
-#include <stdint.h>
|
|
||||||
-#ifndef __SSE__
|
|
||||||
-#include_next <tst-stack-align.h>
|
|
||||||
-#else
|
|
||||||
-#include <xmmintrin.h>
|
|
||||||
-
|
|
||||||
-#define TEST_STACK_ALIGN() \
|
|
||||||
- ({ \
|
|
||||||
- __m128 _m; \
|
|
||||||
- double _d = 12.0; \
|
|
||||||
- long double _ld = 15.0; \
|
|
||||||
- int _ret = 0; \
|
|
||||||
- printf ("__m128: %p %zu\n", &_m, __alignof (__m128)); \
|
|
||||||
- if ((((uintptr_t) &_m) & (__alignof (__m128) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- \
|
|
||||||
- printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
|
||||||
- if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- \
|
|
||||||
- printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, __alignof (long double)); \
|
|
||||||
- if ((((uintptr_t) &_ld) & (__alignof (long double) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- _ret; \
|
|
||||||
- })
|
|
||||||
-#endif
|
|
||||||
diff --git a/sysdeps/i386/tst-stack-align.h b/sysdeps/i386/tst-stack-align.h
|
|
||||||
deleted file mode 100644
|
|
||||||
index 394ff773..00000000
|
|
||||||
--- a/sysdeps/i386/tst-stack-align.h
|
|
||||||
+++ /dev/null
|
|
||||||
@@ -1,41 +0,0 @@
|
|
||||||
-/* Copyright (C) 2004-2018 Free Software Foundation, Inc.
|
|
||||||
- This file is part of the GNU C Library.
|
|
||||||
-
|
|
||||||
- The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
- modify it under the terms of the GNU Lesser General Public
|
|
||||||
- License as published by the Free Software Foundation; either
|
|
||||||
- version 2.1 of the License, or (at your option) any later version.
|
|
||||||
-
|
|
||||||
- The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
- Lesser General Public License for more details.
|
|
||||||
-
|
|
||||||
- You should have received a copy of the GNU Lesser General Public
|
|
||||||
- License along with the GNU C Library; if not, see
|
|
||||||
- <http://www.gnu.org/licenses/>. */
|
|
||||||
-
|
|
||||||
-#include <stdio.h>
|
|
||||||
-#include <stdint.h>
|
|
||||||
-
|
|
||||||
-typedef struct { int i[4]; } int_al16 __attribute__((aligned (16)));
|
|
||||||
-
|
|
||||||
-#define TEST_STACK_ALIGN() \
|
|
||||||
- ({ \
|
|
||||||
- int_al16 _m; \
|
|
||||||
- double _d = 12.0; \
|
|
||||||
- long double _ld = 15.0; \
|
|
||||||
- int _ret = 0; \
|
|
||||||
- printf ("int_al16: %p %zu\n", &_m, __alignof (int_al16)); \
|
|
||||||
- if ((((uintptr_t) &_m) & (__alignof (int_al16) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- \
|
|
||||||
- printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
|
||||||
- if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- \
|
|
||||||
- printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, __alignof (long double)); \
|
|
||||||
- if ((((uintptr_t) &_ld) & (__alignof (long double) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- _ret; \
|
|
||||||
- })
|
|
||||||
diff --git a/sysdeps/powerpc/tst-stack-align.h b/sysdeps/powerpc/tst-stack-align.h
|
|
||||||
index 7fd7013b..d7400b28 100644
|
|
||||||
--- a/sysdeps/powerpc/tst-stack-align.h
|
|
||||||
+++ b/sysdeps/powerpc/tst-stack-align.h
|
|
||||||
@@ -1,4 +1,5 @@
|
|
||||||
-/* Copyright (C) 2005-2018 Free Software Foundation, Inc.
|
|
||||||
+/* Check stack alignment. PowerPC version.
|
|
||||||
+ Copyright (C) 2005-2021 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
@@ -15,10 +16,7 @@
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
-#include <stdio.h>
|
|
||||||
-#include <stdint.h>
|
|
||||||
-
|
|
||||||
-#define TEST_STACK_ALIGN() \
|
|
||||||
+#define TEST_STACK_ALIGN_INIT() \
|
|
||||||
({ \
|
|
||||||
/* Altivec __vector int etc. needs 16byte aligned stack. \
|
|
||||||
Instead of using altivec.h here, use aligned attribute instead. */ \
|
|
||||||
@@ -27,20 +25,9 @@
|
|
||||||
int _i __attribute__((aligned (16))); \
|
|
||||||
int _j[3]; \
|
|
||||||
} _s = { ._i = 18, ._j[0] = 19, ._j[1] = 20, ._j[2] = 21 }; \
|
|
||||||
- double _d = 12.0; \
|
|
||||||
- long double _ld = 15.0; \
|
|
||||||
- int _ret = 0; \
|
|
||||||
printf ("__vector int: { %d, %d, %d, %d } %p %zu\n", _s._i, _s._j[0], \
|
|
||||||
_s._j[1], _s._j[2], &_s, __alignof (_s)); \
|
|
||||||
- if ((((uintptr_t) &_s) & (__alignof (_s) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- \
|
|
||||||
- printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
|
||||||
- if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- \
|
|
||||||
- printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, __alignof (long double)); \
|
|
||||||
- if ((((uintptr_t) &_ld) & (__alignof (long double) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- _ret; \
|
|
||||||
- })
|
|
||||||
+ is_aligned (&_s, __alignof (_s)); \
|
|
||||||
+ })
|
|
||||||
+
|
|
||||||
+#include_next <tst-stack-align.h>
|
|
||||||
diff --git a/sysdeps/x86/tst-stack-align.h b/sysdeps/x86/tst-stack-align.h
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000..02ecc72d
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/x86/tst-stack-align.h
|
|
||||||
@@ -0,0 +1,28 @@
|
|
||||||
+/* Check stack alignment. X86 version.
|
|
||||||
+ Copyright (C) 2021 Free Software Foundation, Inc.
|
|
||||||
+ This file is part of the GNU C Library.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
+ modify it under the terms of the GNU Lesser General Public
|
|
||||||
+ License as published by the Free Software Foundation; either
|
|
||||||
+ version 2.1 of the License, or (at your option) any later version.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
+ Lesser General Public License for more details.
|
|
||||||
+
|
|
||||||
+ You should have received a copy of the GNU Lesser General Public
|
|
||||||
+ License along with the GNU C Library; if not, see
|
|
||||||
+ <https://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+typedef struct { int i[16]; } int_al16 __attribute__((aligned (16)));
|
|
||||||
+
|
|
||||||
+#define TEST_STACK_ALIGN_INIT() \
|
|
||||||
+ ({ \
|
|
||||||
+ int_al16 _m; \
|
|
||||||
+ printf ("int_al16: %p %zu\n", &_m, __alignof (int_al16)); \
|
|
||||||
+ is_aligned (&_m, __alignof (int_al16)); \
|
|
||||||
+ })
|
|
||||||
+
|
|
||||||
+#include_next <tst-stack-align.h>
|
|
||||||
diff --git a/sysdeps/x86_64/tst-stack-align.h b/sysdeps/x86_64/tst-stack-align.h
|
|
||||||
deleted file mode 100644
|
|
||||||
index b2ef77f6..00000000
|
|
||||||
--- a/sysdeps/x86_64/tst-stack-align.h
|
|
||||||
+++ /dev/null
|
|
||||||
@@ -1,46 +0,0 @@
|
|
||||||
-/* Copyright (C) 2003-2018 Free Software Foundation, Inc.
|
|
||||||
- This file is part of the GNU C Library.
|
|
||||||
-
|
|
||||||
- The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
- modify it under the terms of the GNU Lesser General Public
|
|
||||||
- License as published by the Free Software Foundation; either
|
|
||||||
- version 2.1 of the License, or (at your option) any later version.
|
|
||||||
-
|
|
||||||
- The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
- Lesser General Public License for more details.
|
|
||||||
-
|
|
||||||
- You should have received a copy of the GNU Lesser General Public
|
|
||||||
- License along with the GNU C Library; if not, see
|
|
||||||
- <http://www.gnu.org/licenses/>. */
|
|
||||||
-
|
|
||||||
-#include <stdio.h>
|
|
||||||
-#include <stdint.h>
|
|
||||||
-
|
|
||||||
-#define TEST_STACK_ALIGN() \
|
|
||||||
- ({ \
|
|
||||||
- /* AMD64 ABI mandates 16byte aligned stack. \
|
|
||||||
- Unfortunately, current GCC doesn't support __int128 or __float128 \
|
|
||||||
- types, so use aligned attribute instead. */ \
|
|
||||||
- struct _S \
|
|
||||||
- { \
|
|
||||||
- int _i __attribute__((aligned (16))); \
|
|
||||||
- int _pad[3]; \
|
|
||||||
- } _s = { ._i = 18 }; \
|
|
||||||
- double _d = 12.0; \
|
|
||||||
- long double _ld = 15.0; \
|
|
||||||
- int _ret = 0; \
|
|
||||||
- printf ("__int128: %d %p %zu\n", _s._i, &_s, __alignof (_s)); \
|
|
||||||
- if ((((uintptr_t) &_s) & (__alignof (_s) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- \
|
|
||||||
- printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
|
||||||
- if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- \
|
|
||||||
- printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, __alignof (long double)); \
|
|
||||||
- if ((((uintptr_t) &_ld) & (__alignof (long double) - 1)) != 0) \
|
|
||||||
- _ret = 1; \
|
|
||||||
- _ret; \
|
|
||||||
- })
|
|
||||||
--
|
|
||||||
2.18.4
|
|
||||||
|
|
|
@ -1,171 +0,0 @@
|
||||||
From 9302aaad29363eb1dba30d5b9b588a165395672a Mon Sep 17 00:00:00 2001
|
|
||||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
||||||
Date: Mon, 7 Feb 2022 10:46:19 -0500
|
|
||||||
Subject: [PATCH 4/4] Support target specific ALIGN for variable alignment test
|
|
||||||
[BZ #28676]
|
|
||||||
|
|
||||||
Add <tst-file-align.h> to support target specific ALIGN for variable
|
|
||||||
alignment test:
|
|
||||||
|
|
||||||
1. Alpha: Use 0x10000.
|
|
||||||
2. MicroBlaze and Nios II: Use 0x8000.
|
|
||||||
3. All others: Use 0x200000.
|
|
||||||
|
|
||||||
Backport from master commit: 4435c29
|
|
||||||
|
|
||||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
||||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
|
||||||
---
|
|
||||||
elf/tst-align3.c | 4 +---
|
|
||||||
elf/tst-alignmod3.c | 4 +---
|
|
||||||
sysdeps/alpha/tst-file-align.h | 20 ++++++++++++++++++++
|
|
||||||
sysdeps/generic/tst-file-align.h | 20 ++++++++++++++++++++
|
|
||||||
sysdeps/microblaze/tst-file-align.h | 20 ++++++++++++++++++++
|
|
||||||
sysdeps/nios2/tst-file-align.h | 20 ++++++++++++++++++++
|
|
||||||
6 files changed, 82 insertions(+), 6 deletions(-)
|
|
||||||
create mode 100644 sysdeps/alpha/tst-file-align.h
|
|
||||||
create mode 100644 sysdeps/generic/tst-file-align.h
|
|
||||||
create mode 100644 sysdeps/microblaze/tst-file-align.h
|
|
||||||
create mode 100644 sysdeps/nios2/tst-file-align.h
|
|
||||||
|
|
||||||
diff --git a/elf/tst-align3.c b/elf/tst-align3.c
|
|
||||||
index ac86d623..87a8ff81 100644
|
|
||||||
--- a/elf/tst-align3.c
|
|
||||||
+++ b/elf/tst-align3.c
|
|
||||||
@@ -17,11 +17,9 @@
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <support/check.h>
|
|
||||||
+#include <tst-file-align.h>
|
|
||||||
#include <tst-stack-align.h>
|
|
||||||
|
|
||||||
-/* This should cover all possible page sizes we currently support. */
|
|
||||||
-#define ALIGN 0x200000
|
|
||||||
-
|
|
||||||
int bar __attribute__ ((aligned (ALIGN))) = 1;
|
|
||||||
|
|
||||||
extern int do_load_test (void);
|
|
||||||
diff --git a/elf/tst-alignmod3.c b/elf/tst-alignmod3.c
|
|
||||||
index 0d33f237..9520c352 100644
|
|
||||||
--- a/elf/tst-alignmod3.c
|
|
||||||
+++ b/elf/tst-alignmod3.c
|
|
||||||
@@ -17,11 +17,9 @@
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <support/check.h>
|
|
||||||
+#include <tst-file-align.h>
|
|
||||||
#include <tst-stack-align.h>
|
|
||||||
|
|
||||||
-/* This should cover all possible page sizes we currently support. */
|
|
||||||
-#define ALIGN 0x200000
|
|
||||||
-
|
|
||||||
int foo __attribute__ ((aligned (ALIGN))) = 1;
|
|
||||||
|
|
||||||
void
|
|
||||||
diff --git a/sysdeps/alpha/tst-file-align.h b/sysdeps/alpha/tst-file-align.h
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000..8fc3c940
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/alpha/tst-file-align.h
|
|
||||||
@@ -0,0 +1,20 @@
|
|
||||||
+/* Check file alignment. Alpha version.
|
|
||||||
+ Copyright (C) 2021 Free Software Foundation, Inc.
|
|
||||||
+ This file is part of the GNU C Library.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
+ modify it under the terms of the GNU Lesser General Public
|
|
||||||
+ License as published by the Free Software Foundation; either
|
|
||||||
+ version 2.1 of the License, or (at your option) any later version.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
+ Lesser General Public License for more details.
|
|
||||||
+
|
|
||||||
+ You should have received a copy of the GNU Lesser General Public
|
|
||||||
+ License along with the GNU C Library; if not, see
|
|
||||||
+ <https://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+/* This should cover all possible alignments we currently support. */
|
|
||||||
+#define ALIGN 0x10000
|
|
||||||
diff --git a/sysdeps/generic/tst-file-align.h b/sysdeps/generic/tst-file-align.h
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000..6ee6783a
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/generic/tst-file-align.h
|
|
||||||
@@ -0,0 +1,20 @@
|
|
||||||
+/* Check file alignment. Generic version.
|
|
||||||
+ Copyright (C) 2021 Free Software Foundation, Inc.
|
|
||||||
+ This file is part of the GNU C Library.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
+ modify it under the terms of the GNU Lesser General Public
|
|
||||||
+ License as published by the Free Software Foundation; either
|
|
||||||
+ version 2.1 of the License, or (at your option) any later version.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
+ Lesser General Public License for more details.
|
|
||||||
+
|
|
||||||
+ You should have received a copy of the GNU Lesser General Public
|
|
||||||
+ License along with the GNU C Library; if not, see
|
|
||||||
+ <https://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+/* This should cover all possible page sizes we currently support. */
|
|
||||||
+#define ALIGN 0x200000
|
|
||||||
diff --git a/sysdeps/microblaze/tst-file-align.h b/sysdeps/microblaze/tst-file-align.h
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000..43c58b29
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/microblaze/tst-file-align.h
|
|
||||||
@@ -0,0 +1,20 @@
|
|
||||||
+/* Check file alignment. MicroBlaze version.
|
|
||||||
+ Copyright (C) 2021 Free Software Foundation, Inc.
|
|
||||||
+ This file is part of the GNU C Library.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
+ modify it under the terms of the GNU Lesser General Public
|
|
||||||
+ License as published by the Free Software Foundation; either
|
|
||||||
+ version 2.1 of the License, or (at your option) any later version.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
+ Lesser General Public License for more details.
|
|
||||||
+
|
|
||||||
+ You should have received a copy of the GNU Lesser General Public
|
|
||||||
+ License along with the GNU C Library; if not, see
|
|
||||||
+ <https://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+/* This should cover all possible alignments we currently support. */
|
|
||||||
+#define ALIGN 0x8000
|
|
||||||
diff --git a/sysdeps/nios2/tst-file-align.h b/sysdeps/nios2/tst-file-align.h
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000..589a2d5a
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/nios2/tst-file-align.h
|
|
||||||
@@ -0,0 +1,20 @@
|
|
||||||
+/* Check file alignment. Nios II version.
|
|
||||||
+ Copyright (C) 2021 Free Software Foundation, Inc.
|
|
||||||
+ This file is part of the GNU C Library.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
+ modify it under the terms of the GNU Lesser General Public
|
|
||||||
+ License as published by the Free Software Foundation; either
|
|
||||||
+ version 2.1 of the License, or (at your option) any later version.
|
|
||||||
+
|
|
||||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
+ Lesser General Public License for more details.
|
|
||||||
+
|
|
||||||
+ You should have received a copy of the GNU Lesser General Public
|
|
||||||
+ License along with the GNU C Library; if not, see
|
|
||||||
+ <https://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+/* This should cover all possible alignments we currently support. */
|
|
||||||
+#define ALIGN 0x8000
|
|
||||||
--
|
|
||||||
2.18.4
|
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
From a36e3f474b748bec447de3bdd8483b52b09e5804 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
||||||
Date: Thu, 13 Jan 2022 03:48:36 +0800
|
|
||||||
Subject: [PATCH 3/4] elf: Align argument of __munmap to page size [BZ #28676]
|
|
||||||
|
|
||||||
On Linux/x86-64, for elf/tst-align3, we now get
|
|
||||||
|
|
||||||
munmap(0x7f88f9401000, 1126424) = 0
|
|
||||||
|
|
||||||
instead of
|
|
||||||
|
|
||||||
munmap(0x7f1615200018, 544768) = -1 EINVAL (Invalid argument)
|
|
||||||
|
|
||||||
Backport from master commit: fd6062e
|
|
||||||
|
|
||||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
|
||||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
|
||||||
---
|
|
||||||
elf/dl-map-segments.h | 1 +
|
|
||||||
1 file changed, 1 insertion(+)
|
|
||||||
|
|
||||||
diff --git a/elf/dl-map-segments.h b/elf/dl-map-segments.h
|
|
||||||
index 61ba04cd..f1f7ad88 100644
|
|
||||||
--- a/elf/dl-map-segments.h
|
|
||||||
+++ b/elf/dl-map-segments.h
|
|
||||||
@@ -55,6 +55,7 @@ _dl_map_segment (const struct loadcmd *c, ElfW(Addr) mappref,
|
|
||||||
if (delta)
|
|
||||||
__munmap ((void *) map_start, delta);
|
|
||||||
ElfW(Addr) map_end = map_start_aligned + maplength;
|
|
||||||
+ map_end = ALIGN_UP (map_end, GLRO(dl_pagesize));
|
|
||||||
delta = map_start + maplen - map_end;
|
|
||||||
if (delta)
|
|
||||||
__munmap ((void *) map_end, delta);
|
|
||||||
--
|
|
||||||
2.18.4
|
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
From 716c4027b04db785034b0f67ac552cfaff360463 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
||||||
Date: Tue, 18 Jan 2022 14:36:45 -0300
|
|
||||||
Subject: [PATCH] elf: Fix tst-align3
|
|
||||||
|
|
||||||
The elf/tst-align3.c declares the function using a wrong prototype.
|
|
||||||
|
|
||||||
Checked on aarch64-linux-gnu.
|
|
||||||
|
|
||||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
|
||||||
---
|
|
||||||
elf/tst-align3.c | 5 +++--
|
|
||||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/elf/tst-align3.c b/elf/tst-align3.c
|
|
||||||
index 4913c26..6853b6e 100644
|
|
||||||
--- a/elf/tst-align3.c
|
|
||||||
+++ b/elf/tst-align3.c
|
|
||||||
@@ -22,7 +22,7 @@
|
|
||||||
|
|
||||||
int bar __attribute__ ((aligned (ALIGN))) = 1;
|
|
||||||
|
|
||||||
-extern int do_load_test (void);
|
|
||||||
+extern void do_load_test (void);
|
|
||||||
|
|
||||||
static int
|
|
||||||
do_test (void)
|
|
||||||
@@ -30,7 +30,8 @@ do_test (void)
|
|
||||||
printf ("bar: %p\n", &bar);
|
|
||||||
TEST_VERIFY (is_aligned (&bar, ALIGN) == 0);
|
|
||||||
|
|
||||||
- return do_load_test ();
|
|
||||||
+ do_load_test ();
|
|
||||||
+ return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <support/test-driver.c>
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
|
@ -1,137 +0,0 @@
|
||||||
From c61fc02c61a88204a5af47f61c1b7cfb19b61e32 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
|
||||||
Date: Mon, 7 Feb 2022 10:42:01 -0500
|
|
||||||
Subject: [PATCH 1/4] elf: Properly align PT_LOAD segments [BZ #28676]
|
|
||||||
|
|
||||||
When PT_LOAD segment alignment > the page size, allocate enough space to
|
|
||||||
ensure that the segment can be properly aligned. This change helps code
|
|
||||||
segments use huge pages become simple and available.
|
|
||||||
|
|
||||||
This fixes [BZ #28676].
|
|
||||||
|
|
||||||
Backport from master commit: 718fdd8
|
|
||||||
|
|
||||||
Signed-off-by: Xu Yu <xuyu@linux.alibaba.com>
|
|
||||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
|
||||||
---
|
|
||||||
elf/dl-load.c | 2 ++
|
|
||||||
elf/dl-load.h | 3 ++-
|
|
||||||
elf/dl-map-segments.h | 50 +++++++++++++++++++++++++++++++++++++++----
|
|
||||||
3 files changed, 50 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/elf/dl-load.c b/elf/dl-load.c
|
|
||||||
index fee08d78..6785a499 100644
|
|
||||||
--- a/elf/dl-load.c
|
|
||||||
+++ b/elf/dl-load.c
|
|
||||||
@@ -1,5 +1,6 @@
|
|
||||||
/* Map in a shared object's segments from the file.
|
|
||||||
Copyright (C) 1995-2018 Free Software Foundation, Inc.
|
|
||||||
+ Copyright The GNU Toolchain Authors.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
@@ -1107,6 +1108,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
|
|
||||||
c->mapend = ALIGN_UP (ph->p_vaddr + ph->p_filesz, GLRO(dl_pagesize));
|
|
||||||
c->dataend = ph->p_vaddr + ph->p_filesz;
|
|
||||||
c->allocend = ph->p_vaddr + ph->p_memsz;
|
|
||||||
+ c->mapalign = ph->p_align;
|
|
||||||
c->mapoff = ALIGN_DOWN (ph->p_offset, GLRO(dl_pagesize));
|
|
||||||
|
|
||||||
/* Determine whether there is a gap between the last segment
|
|
||||||
diff --git a/elf/dl-load.h b/elf/dl-load.h
|
|
||||||
index 66ea2e92..d9f648ea 100644
|
|
||||||
--- a/elf/dl-load.h
|
|
||||||
+++ b/elf/dl-load.h
|
|
||||||
@@ -1,5 +1,6 @@
|
|
||||||
/* Map in a shared object's segments from the file.
|
|
||||||
Copyright (C) 1995-2018 Free Software Foundation, Inc.
|
|
||||||
+ Copyright The GNU Toolchain Authors.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
@@ -74,7 +75,7 @@ ELF_PREFERRED_ADDRESS_DATA;
|
|
||||||
Its details have been expanded out and converted. */
|
|
||||||
struct loadcmd
|
|
||||||
{
|
|
||||||
- ElfW(Addr) mapstart, mapend, dataend, allocend;
|
|
||||||
+ ElfW(Addr) mapstart, mapend, dataend, allocend, mapalign;
|
|
||||||
ElfW(Off) mapoff;
|
|
||||||
int prot; /* PROT_* bits. */
|
|
||||||
};
|
|
||||||
diff --git a/elf/dl-map-segments.h b/elf/dl-map-segments.h
|
|
||||||
index 084076a2..61ba04cd 100644
|
|
||||||
--- a/elf/dl-map-segments.h
|
|
||||||
+++ b/elf/dl-map-segments.h
|
|
||||||
@@ -1,5 +1,6 @@
|
|
||||||
/* Map in a shared object's segments. Generic version.
|
|
||||||
Copyright (C) 1995-2018 Free Software Foundation, Inc.
|
|
||||||
+ Copyright The GNU Toolchain Authors.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
@@ -18,6 +19,50 @@
|
|
||||||
|
|
||||||
#include <dl-load.h>
|
|
||||||
|
|
||||||
+/* Map a segment and align it properly. */
|
|
||||||
+
|
|
||||||
+static __always_inline ElfW(Addr)
|
|
||||||
+_dl_map_segment (const struct loadcmd *c, ElfW(Addr) mappref,
|
|
||||||
+ const size_t maplength, int fd)
|
|
||||||
+{
|
|
||||||
+ if (__glibc_likely (c->mapalign <= GLRO(dl_pagesize)))
|
|
||||||
+ return (ElfW(Addr)) __mmap ((void *) mappref, maplength, c->prot,
|
|
||||||
+ MAP_COPY|MAP_FILE, fd, c->mapoff);
|
|
||||||
+
|
|
||||||
+ /* If the segment alignment > the page size, allocate enough space to
|
|
||||||
+ ensure that the segment can be properly aligned. */
|
|
||||||
+ ElfW(Addr) maplen = (maplength >= c->mapalign
|
|
||||||
+ ? (maplength + c->mapalign)
|
|
||||||
+ : (2 * c->mapalign));
|
|
||||||
+ ElfW(Addr) map_start = (ElfW(Addr)) __mmap ((void *) mappref, maplen,
|
|
||||||
+ PROT_NONE,
|
|
||||||
+ MAP_ANONYMOUS|MAP_PRIVATE,
|
|
||||||
+ -1, 0);
|
|
||||||
+ if (__glibc_unlikely ((void *) map_start == MAP_FAILED))
|
|
||||||
+ return map_start;
|
|
||||||
+
|
|
||||||
+ ElfW(Addr) map_start_aligned = ALIGN_UP (map_start, c->mapalign);
|
|
||||||
+ map_start_aligned = (ElfW(Addr)) __mmap ((void *) map_start_aligned,
|
|
||||||
+ maplength, c->prot,
|
|
||||||
+ MAP_COPY|MAP_FILE|MAP_FIXED,
|
|
||||||
+ fd, c->mapoff);
|
|
||||||
+ if (__glibc_unlikely ((void *) map_start_aligned == MAP_FAILED))
|
|
||||||
+ __munmap ((void *) map_start, maplen);
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ /* Unmap the unused regions. */
|
|
||||||
+ ElfW(Addr) delta = map_start_aligned - map_start;
|
|
||||||
+ if (delta)
|
|
||||||
+ __munmap ((void *) map_start, delta);
|
|
||||||
+ ElfW(Addr) map_end = map_start_aligned + maplength;
|
|
||||||
+ delta = map_start + maplen - map_end;
|
|
||||||
+ if (delta)
|
|
||||||
+ __munmap ((void *) map_end, delta);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return map_start_aligned;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* This implementation assumes (as does the corresponding implementation
|
|
||||||
of _dl_unmap_segments, in dl-unmap-segments.h) that shared objects
|
|
||||||
are always laid out with all segments contiguous (or with gaps
|
|
||||||
@@ -53,10 +98,7 @@ _dl_map_segments (struct link_map *l, int fd,
|
|
||||||
- MAP_BASE_ADDR (l));
|
|
||||||
|
|
||||||
/* Remember which part of the address space this object uses. */
|
|
||||||
- l->l_map_start = (ElfW(Addr)) __mmap ((void *) mappref, maplength,
|
|
||||||
- c->prot,
|
|
||||||
- MAP_COPY|MAP_FILE,
|
|
||||||
- fd, c->mapoff);
|
|
||||||
+ l->l_map_start = _dl_map_segment (c, mappref, maplength, fd);
|
|
||||||
if (__glibc_unlikely ((void *) l->l_map_start == MAP_FAILED))
|
|
||||||
return DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT;
|
|
||||||
|
|
||||||
--
|
|
||||||
2.18.4
|
|
||||||
|
|
208
glibc-rh2061727.patch
Normal file
208
glibc-rh2061727.patch
Normal file
|
@ -0,0 +1,208 @@
|
||||||
|
This is a downstream rework of this upstream patch:
|
||||||
|
|
||||||
|
[PATCH v2 2/2] nss: Protect against errno changes in function lookup (bug 28953)
|
||||||
|
<https://sourceware.org/pipermail/libc-alpha/2022-March/137015.html>
|
||||||
|
|
||||||
|
The NSS module loading code has been rewritten upstream, which is why
|
||||||
|
only the test can be reused. NSS_DECLARE_MODULE_FUNCTIONS does not yet
|
||||||
|
exist downstream, so this part had to be skipped.
|
||||||
|
|
||||||
|
diff --git a/nss/Makefile b/nss/Makefile
|
||||||
|
index d5c28a6b5ed3661c..e8a7d9c7b3cefcdf 100644
|
||||||
|
--- a/nss/Makefile
|
||||||
|
+++ b/nss/Makefile
|
||||||
|
@@ -59,7 +59,8 @@ tests = test-netdb test-digits-dots tst-nss-getpwent bug17079 \
|
||||||
|
tst-nss-test2 \
|
||||||
|
tst-nss-test3 \
|
||||||
|
tst-nss-test4 \
|
||||||
|
- tst-nss-test5
|
||||||
|
+ tst-nss-test5 \
|
||||||
|
+ tst-nss-test_errno
|
||||||
|
xtests = bug-erange
|
||||||
|
|
||||||
|
tests-container = \
|
||||||
|
@@ -130,7 +131,7 @@ routines += $(libnss_files-routines)
|
||||||
|
static-only-routines += $(libnss_files-routines)
|
||||||
|
tests-static += tst-nss-static
|
||||||
|
endif
|
||||||
|
-extra-test-objs += nss_test1.os nss_test2.os
|
||||||
|
+extra-test-objs += nss_test1.os nss_test2.os nss_test_errno.os
|
||||||
|
|
||||||
|
include ../Rules
|
||||||
|
|
||||||
|
@@ -166,10 +167,13 @@ rtld-tests-LDFLAGS += -Wl,--dynamic-list=nss_test.ver
|
||||||
|
|
||||||
|
libof-nss_test1 = extramodules
|
||||||
|
libof-nss_test2 = extramodules
|
||||||
|
+libof-nss_test_errno = extramodules
|
||||||
|
$(objpfx)/libnss_test1.so: $(objpfx)nss_test1.os $(link-libc-deps)
|
||||||
|
$(build-module)
|
||||||
|
$(objpfx)/libnss_test2.so: $(objpfx)nss_test2.os $(link-libc-deps)
|
||||||
|
$(build-module)
|
||||||
|
+$(objpfx)/libnss_test_errno.so: $(objpfx)nss_test_errno.os $(link-libc-deps)
|
||||||
|
+ $(build-module)
|
||||||
|
$(objpfx)nss_test2.os : nss_test1.c
|
||||||
|
ifdef libnss_test1.so-version
|
||||||
|
$(objpfx)/libnss_test1.so$(libnss_test1.so-version): $(objpfx)/libnss_test1.so
|
||||||
|
@@ -179,9 +183,13 @@ ifdef libnss_test2.so-version
|
||||||
|
$(objpfx)/libnss_test2.so$(libnss_test2.so-version): $(objpfx)/libnss_test2.so
|
||||||
|
$(make-link)
|
||||||
|
endif
|
||||||
|
+$(objpfx)/libnss_test_errno.so$(libnss_files.so-version): \
|
||||||
|
+ $(objpfx)/libnss_test_errno.so
|
||||||
|
+ $(make-link)
|
||||||
|
$(patsubst %,$(objpfx)%.out,$(tests)) : \
|
||||||
|
$(objpfx)/libnss_test1.so$(libnss_test1.so-version) \
|
||||||
|
- $(objpfx)/libnss_test2.so$(libnss_test2.so-version)
|
||||||
|
+ $(objpfx)/libnss_test2.so$(libnss_test2.so-version) \
|
||||||
|
+ $(objpfx)/libnss_test_errno.so$(libnss_files.so-version)
|
||||||
|
|
||||||
|
ifeq (yes,$(have-thread-library))
|
||||||
|
$(objpfx)tst-cancel-getpwuid_r: $(shared-thread-library)
|
||||||
|
diff --git a/nss/nss_test_errno.c b/nss/nss_test_errno.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..ca75c890aa057869
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/nss/nss_test_errno.c
|
||||||
|
@@ -0,0 +1,53 @@
|
||||||
|
+/* NSS service provider with errno clobber.
|
||||||
|
+ Copyright (C) 2022 Free Software Foundation, Inc.
|
||||||
|
+ This file is part of the GNU C Library.
|
||||||
|
+
|
||||||
|
+ The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
+ modify it under the terms of the GNU Lesser General Public
|
||||||
|
+ License as published by the Free Software Foundation; either
|
||||||
|
+ version 2.1 of the License, or (at your option) any later version.
|
||||||
|
+
|
||||||
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
+ Lesser General Public License for more details.
|
||||||
|
+
|
||||||
|
+ You should have received a copy of the GNU Lesser General Public
|
||||||
|
+ License along with the GNU C Library; if not, see
|
||||||
|
+ <https://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+#include <errno.h>
|
||||||
|
+#include <nss.h>
|
||||||
|
+#include <pwd.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+
|
||||||
|
+static void __attribute__ ((constructor))
|
||||||
|
+init (void)
|
||||||
|
+{
|
||||||
|
+ /* An arbitrary error code which is otherwise not used. */
|
||||||
|
+ errno = ELIBBAD;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Lookup functions for pwd follow that do not return any data. */
|
||||||
|
+
|
||||||
|
+enum nss_status
|
||||||
|
+_nss_test_errno_setpwent (int stayopen)
|
||||||
|
+{
|
||||||
|
+ setenv ("_nss_test_errno_setpwent", "yes", 1);
|
||||||
|
+ return NSS_STATUS_SUCCESS;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+enum nss_status
|
||||||
|
+_nss_test_errno_getpwent_r (struct passwd *result,
|
||||||
|
+ char *buffer, size_t size, int *errnop)
|
||||||
|
+{
|
||||||
|
+ setenv ("_nss_test_errno_getpwent_r", "yes", 1);
|
||||||
|
+ return NSS_STATUS_NOTFOUND;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+enum nss_status
|
||||||
|
+_nss_test_errno_endpwent (void)
|
||||||
|
+{
|
||||||
|
+ setenv ("_nss_test_errno_endpwent", "yes", 1);
|
||||||
|
+ return NSS_STATUS_SUCCESS;
|
||||||
|
+}
|
||||||
|
diff --git a/nss/nsswitch.c b/nss/nsswitch.c
|
||||||
|
index 17adf1ef03f93d60..e59ab674e0426b26 100644
|
||||||
|
--- a/nss/nsswitch.c
|
||||||
|
+++ b/nss/nsswitch.c
|
||||||
|
@@ -401,6 +401,7 @@ void *
|
||||||
|
__nss_lookup_function (service_user *ni, const char *fct_name)
|
||||||
|
{
|
||||||
|
void **found, *result;
|
||||||
|
+ int saved_errno = errno;
|
||||||
|
|
||||||
|
/* We now modify global data. Protect it. */
|
||||||
|
__libc_lock_lock (lock);
|
||||||
|
@@ -523,6 +524,8 @@ __nss_lookup_function (service_user *ni, const char *fct_name)
|
||||||
|
/* Remove the lock. */
|
||||||
|
__libc_lock_unlock (lock);
|
||||||
|
|
||||||
|
+ __set_errno (saved_errno);
|
||||||
|
+
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
libc_hidden_def (__nss_lookup_function)
|
||||||
|
diff --git a/nss/tst-nss-test_errno.c b/nss/tst-nss-test_errno.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000..d2c42dd363a38b0e
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/nss/tst-nss-test_errno.c
|
||||||
|
@@ -0,0 +1,61 @@
|
||||||
|
+/* getpwent failure when dlopen clobbers errno (bug 28953).
|
||||||
|
+ Copyright (C) 2022 Free Software Foundation, Inc.
|
||||||
|
+ This file is part of the GNU C Library.
|
||||||
|
+
|
||||||
|
+ The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
+ modify it under the terms of the GNU Lesser General Public
|
||||||
|
+ License as published by the Free Software Foundation; either
|
||||||
|
+ version 2.1 of the License, or (at your option) any later version.
|
||||||
|
+
|
||||||
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
+ Lesser General Public License for more details.
|
||||||
|
+
|
||||||
|
+ You should have received a copy of the GNU Lesser General Public
|
||||||
|
+ License along with the GNU C Library; if not, see
|
||||||
|
+ <https://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+#include <nss.h>
|
||||||
|
+#include <support/check.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
+#include <stdbool.h>
|
||||||
|
+#include <pwd.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+ __nss_configure_lookup ("passwd", "files test_errno");
|
||||||
|
+
|
||||||
|
+ errno = 0;
|
||||||
|
+ setpwent ();
|
||||||
|
+ TEST_COMPARE (errno, 0);
|
||||||
|
+
|
||||||
|
+ bool root_seen = false;
|
||||||
|
+ while (true)
|
||||||
|
+ {
|
||||||
|
+ errno = 0;
|
||||||
|
+ struct passwd *e = getpwent ();
|
||||||
|
+ if (e == NULL)
|
||||||
|
+ break;
|
||||||
|
+ if (strcmp (e->pw_name, "root"))
|
||||||
|
+ root_seen = true;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ TEST_COMPARE (errno, 0);
|
||||||
|
+ TEST_VERIFY (root_seen);
|
||||||
|
+
|
||||||
|
+ errno = 0;
|
||||||
|
+ endpwent ();
|
||||||
|
+ TEST_COMPARE (errno, 0);
|
||||||
|
+
|
||||||
|
+ TEST_COMPARE_STRING (getenv ("_nss_test_errno_setpwent"), "yes");
|
||||||
|
+ TEST_COMPARE_STRING (getenv ("_nss_test_errno_getpwent_r"), "yes");
|
||||||
|
+ TEST_COMPARE_STRING (getenv ("_nss_test_errno_endpwent"), "yes");
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#include <support/test-driver.c>
|
15
glibc.spec
15
glibc.spec
|
@ -1,7 +1,6 @@
|
||||||
%define anolis_release .0.1
|
|
||||||
%define glibcsrcdir glibc-2.28
|
%define glibcsrcdir glibc-2.28
|
||||||
%define glibcversion 2.28
|
%define glibcversion 2.28
|
||||||
%define glibcrelease 189%{anolis_release}%{?dist}
|
%define glibcrelease 189.1%{?dist}
|
||||||
# Pre-release tarballs are pulled in from git using a command that is
|
# Pre-release tarballs are pulled in from git using a command that is
|
||||||
# effectively:
|
# effectively:
|
||||||
#
|
#
|
||||||
|
@ -856,13 +855,7 @@ Patch660: glibc-rh2045063-2.patch
|
||||||
Patch661: glibc-rh2045063-3.patch
|
Patch661: glibc-rh2045063-3.patch
|
||||||
Patch662: glibc-rh2045063-4.patch
|
Patch662: glibc-rh2045063-4.patch
|
||||||
Patch663: glibc-rh2045063-5.patch
|
Patch663: glibc-rh2045063-5.patch
|
||||||
|
Patch664: glibc-rh2061727.patch
|
||||||
Patch1000: glibc-Properly-check-stack-alignment-BZ-27901.patch
|
|
||||||
Patch1001: glibc-elf-Properly-align-PT_LOAD-segments-BZ-28676-1.patch
|
|
||||||
Patch1002: glibc-Add-a-testcase-to-check-alignment-of-PT_LOAD-segment-2.patch
|
|
||||||
Patch1003: glibc-elf-Align-argument-of-__munmap-to-page-size-BZ-28676-3.patch
|
|
||||||
Patch1004: glibc-Support-target-specific-ALIGN-for-variable-alignment-4.patch
|
|
||||||
Patch1005: glibc-elf-Fix-tst-align3.patch
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# Continued list of core "glibc" package information:
|
# Continued list of core "glibc" package information:
|
||||||
|
@ -2678,8 +2671,8 @@ fi
|
||||||
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Wed Apr 13 2022 Rongwei Wang <rongwei.wang@linux.alibaba.com> - 2.28-189.0.1
|
* Thu Mar 10 2022 Florian Weimer <fweimer@redhat.com> - 2.28-189.1
|
||||||
- elf: Properly align PT_LOAD segments
|
- nss: Avoid clobbering errno in get*ent via dlopen (#2061727)
|
||||||
|
|
||||||
* Thu Jan 27 2022 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.28-189
|
* Thu Jan 27 2022 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.28-189
|
||||||
- CVE-2021-3999: getcwd: align stack on clone in aarch64 and fix a memory leak
|
- CVE-2021-3999: getcwd: align stack on clone in aarch64 and fix a memory leak
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue