elf: drop elf/tls-macros.h in favor of thread tls_mode attribute.
use __ehdr_start for __GLOBAL_OFFSET_TABLE[0]
This commit is contained in:
parent
3da7d02c62
commit
39ba937215
1810
Remove-sysdeps-tls-macros.h.patch
Normal file
1810
Remove-sysdeps-tls-macros.h.patch
Normal file
File diff suppressed because it is too large
Load Diff
82
arm-Simplify-elf_machine_-load_address-dynamic.patch
Normal file
82
arm-Simplify-elf_machine_-load_address-dynamic.patch
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
From bca0f5cbc9257c13322b99e55235c4f21ba0bd82 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Fangrui Song <maskray@google.com>
|
||||||
|
Date: Wed, 18 Aug 2021 11:13:03 -0700
|
||||||
|
Subject: [PATCH] arm: Simplify elf_machine_{load_address,dynamic}
|
||||||
|
|
||||||
|
and drop reliance on _GLOBAL_OFFSET_TABLE_[0] being the link-time
|
||||||
|
address of _DYNAMIC. &__ehdr_start is a better way to get the load address.
|
||||||
|
|
||||||
|
This is similar to commits b37b75d269883a2c553bb7019a813094eb4e2dd1
|
||||||
|
(x86-64) and 43d06ed218fc8be58987bdfd00e21e5720f0b862 (aarch64).
|
||||||
|
|
||||||
|
Reviewed-by: Joseph Myers <joseph@codesourcery.com>
|
||||||
|
---
|
||||||
|
sysdeps/arm/dl-machine.h | 47 ++++++++++-------------------------------------
|
||||||
|
1 file changed, 10 insertions(+), 37 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
|
||||||
|
index ff5e09e..eb13cb8 100644
|
||||||
|
--- a/sysdeps/arm/dl-machine.h
|
||||||
|
+++ b/sysdeps/arm/dl-machine.h
|
||||||
|
@@ -37,48 +37,21 @@ elf_machine_matches_host (const Elf32_Ehdr *ehdr)
|
||||||
|
return ehdr->e_machine == EM_ARM;
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
-/* Return the link-time address of _DYNAMIC. Conveniently, this is the
|
||||||
|
- first element of the GOT. */
|
||||||
|
-static inline Elf32_Addr __attribute__ ((unused))
|
||||||
|
-elf_machine_dynamic (void)
|
||||||
|
-{
|
||||||
|
- /* Declaring this hidden ensures that a PC-relative reference is used. */
|
||||||
|
- extern const Elf32_Addr _GLOBAL_OFFSET_TABLE_[] attribute_hidden;
|
||||||
|
- return _GLOBAL_OFFSET_TABLE_[0];
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
/* Return the run-time load address of the shared object. */
|
||||||
|
-static inline Elf32_Addr __attribute__ ((unused))
|
||||||
|
+static inline ElfW(Addr) __attribute__ ((unused))
|
||||||
|
elf_machine_load_address (void)
|
||||||
|
{
|
||||||
|
- Elf32_Addr pcrel_addr;
|
||||||
|
-#ifdef SHARED
|
||||||
|
- extern Elf32_Addr __dl_start (void *) asm ("_dl_start");
|
||||||
|
- Elf32_Addr got_addr = (Elf32_Addr) &__dl_start;
|
||||||
|
- asm ("adr %0, _dl_start" : "=r" (pcrel_addr));
|
||||||
|
-#else
|
||||||
|
- extern Elf32_Addr __dl_relocate_static_pie (void *)
|
||||||
|
- asm ("_dl_relocate_static_pie") attribute_hidden;
|
||||||
|
- Elf32_Addr got_addr = (Elf32_Addr) &__dl_relocate_static_pie;
|
||||||
|
- asm ("adr %0, _dl_relocate_static_pie" : "=r" (pcrel_addr));
|
||||||
|
-#endif
|
||||||
|
-#ifdef __thumb__
|
||||||
|
- /* Clear the low bit of the function address.
|
||||||
|
-
|
||||||
|
- NOTE: got_addr is from GOT table whose lsb is always set by linker if it's
|
||||||
|
- Thumb function address. PCREL_ADDR comes from PC-relative calculation
|
||||||
|
- which will finish during assembling. GAS assembler before the fix for
|
||||||
|
- PR gas/21458 was not setting the lsb but does after that. Always do the
|
||||||
|
- strip for both, so the code works with various combinations of glibc and
|
||||||
|
- Binutils. */
|
||||||
|
- got_addr &= ~(Elf32_Addr) 1;
|
||||||
|
- pcrel_addr &= ~(Elf32_Addr) 1;
|
||||||
|
-#endif
|
||||||
|
- return pcrel_addr - got_addr;
|
||||||
|
+ extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
|
||||||
|
+ return (ElfW(Addr)) &__ehdr_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Return the link-time address of _DYNAMIC. */
|
||||||
|
+static inline ElfW(Addr) __attribute__ ((unused))
|
||||||
|
+elf_machine_dynamic (void)
|
||||||
|
+{
|
||||||
|
+ extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
|
||||||
|
+ return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
|
||||||
|
+}
|
||||||
|
|
||||||
|
/* Set up the loaded object described by L so its unrelocated PLT
|
||||||
|
entries will jump to the on-demand fixup code in dl-runtime.c. */
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
543
elf-Drop-elf-tls-macros.h-in-favor-of-__thread-and-t.patch
Normal file
543
elf-Drop-elf-tls-macros.h-in-favor-of-__thread-and-t.patch
Normal file
@ -0,0 +1,543 @@
|
|||||||
|
From 33c50ef42878b07ee6ead8b3f1a81d8c2c74697c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Fangrui Song <maskray@google.com>
|
||||||
|
Date: Mon, 16 Aug 2021 09:59:30 -0700
|
||||||
|
Subject: [PATCH] elf: Drop elf/tls-macros.h in favor of __thread and tls_model
|
||||||
|
attributes [BZ #28152] [BZ #28205]
|
||||||
|
|
||||||
|
elf/tls-macros.h was added for TLS testing when GCC did not support
|
||||||
|
__thread. __thread and tls_model attributes are mature now and have been
|
||||||
|
used by many newer tests.
|
||||||
|
|
||||||
|
Also delete tst-tls2.c which tests .tls_common (unused by modern GCC and
|
||||||
|
unsupported by Clang/LLD). .tls_common and .tbss definition are almost
|
||||||
|
identical after linking, so the runtime test doesn't add additional
|
||||||
|
coverage. Assembler and linker tests should be on the binutils side.
|
||||||
|
|
||||||
|
When LLD 13.0.0 is allowed in configure.ac
|
||||||
|
(https://sourceware.org/pipermail/libc-alpha/2021-August/129866.html),
|
||||||
|
`make check` result is on par with glibc built with GNU ld on aarch64
|
||||||
|
and x86_64.
|
||||||
|
|
||||||
|
As a future clean-up, TLS_GD/TLS_LD/TLS_IE/TLS_IE macros can be removed from
|
||||||
|
sysdeps/*/tls-macros.h. We can add optional -mtls-dialect={gnu2,trad}
|
||||||
|
tests to ensure coverage.
|
||||||
|
|
||||||
|
Tested on aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu.
|
||||||
|
|
||||||
|
Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||||
|
---
|
||||||
|
elf/Makefile | 4 +-
|
||||||
|
elf/tls-macros.h | 25 -----------
|
||||||
|
elf/tst-tls1.c | 64 +++++++++++-----------------
|
||||||
|
elf/tst-tls2.c | 82 ------------------------------------
|
||||||
|
elf/tst-tls3.c | 26 +++++-------
|
||||||
|
elf/tst-tlsmod1.c | 24 +++++------
|
||||||
|
elf/tst-tlsmod2.c | 6 +--
|
||||||
|
elf/tst-tlsmod3.c | 8 ++--
|
||||||
|
elf/tst-tlsmod4.c | 6 +--
|
||||||
|
elf/tst-tlsmod5.c | 4 +-
|
||||||
|
elf/tst-tlsmod6.c | 4 +-
|
||||||
|
sysdeps/powerpc/mod-tlsopt-powerpc.c | 6 +--
|
||||||
|
sysdeps/powerpc/tst-tlsifunc.c | 4 +-
|
||||||
|
13 files changed, 64 insertions(+), 199 deletions(-)
|
||||||
|
delete mode 100644 elf/tls-macros.h
|
||||||
|
delete mode 100644 elf/tst-tls2.c
|
||||||
|
|
||||||
|
diff --git a/elf/Makefile b/elf/Makefile
|
||||||
|
index d05f410..725537c 100644
|
||||||
|
--- a/elf/Makefile
|
||||||
|
+++ b/elf/Makefile
|
||||||
|
@@ -163,7 +163,7 @@ tests-static-normal := tst-array1-static tst-array5-static \
|
||||||
|
tst-single_threaded-static tst-single_threaded-pthread-static \
|
||||||
|
tst-dst-static tst-getauxval-static
|
||||||
|
|
||||||
|
-tests-static-internal := tst-tls1-static tst-tls2-static \
|
||||||
|
+tests-static-internal := tst-tls1-static \
|
||||||
|
tst-ptrguard1-static tst-stackguard1-static \
|
||||||
|
tst-tls1-static-non-pie
|
||||||
|
|
||||||
|
@@ -183,7 +183,7 @@ endif
|
||||||
|
tests := tst-tls9 tst-leaks1 \
|
||||||
|
tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 \
|
||||||
|
tst-auxv tst-stringtable
|
||||||
|
-tests-internal := tst-tls1 tst-tls2 $(tests-static-internal)
|
||||||
|
+tests-internal := tst-tls1 $(tests-static-internal)
|
||||||
|
tests-static := $(tests-static-normal) $(tests-static-internal)
|
||||||
|
|
||||||
|
ifeq (yes,$(build-shared))
|
||||||
|
diff --git a/elf/tls-macros.h b/elf/tls-macros.h
|
||||||
|
deleted file mode 100644
|
||||||
|
index e25e33b..0000000
|
||||||
|
--- a/elf/tls-macros.h
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,25 +0,0 @@
|
||||||
|
-/* Macros to support TLS testing in times of missing compiler support. */
|
||||||
|
-
|
||||||
|
-#define COMMON_INT_DEF(x) \
|
||||||
|
- asm (".tls_common " #x ",4,4")
|
||||||
|
-/* XXX Until we get compiler support we don't need declarations. */
|
||||||
|
-#define COMMON_INT_DECL(x)
|
||||||
|
-
|
||||||
|
-/* XXX This definition will probably be machine specific, too. */
|
||||||
|
-#define VAR_INT_DEF(x) \
|
||||||
|
- asm (".section .tdata\n\t" \
|
||||||
|
- ".globl " #x "\n" \
|
||||||
|
- ".balign 4\n" \
|
||||||
|
- #x ":\t.long 0\n\t" \
|
||||||
|
- ".size " #x ",4\n\t" \
|
||||||
|
- ".previous")
|
||||||
|
-/* XXX Until we get compiler support we don't need declarations. */
|
||||||
|
-#define VAR_INT_DECL(x)
|
||||||
|
-
|
||||||
|
-#include_next <tls-macros.h>
|
||||||
|
-
|
||||||
|
- /* XXX Each architecture must have its own asm for now. */
|
||||||
|
-#if !defined TLS_LE || !defined TLS_IE \
|
||||||
|
- || !defined TLS_LD || !defined TLS_GD
|
||||||
|
-# error "No support for this architecture so far."
|
||||||
|
-#endif
|
||||||
|
diff --git a/elf/tst-tls1.c b/elf/tst-tls1.c
|
||||||
|
index c31da56..b341221 100644
|
||||||
|
--- a/elf/tst-tls1.c
|
||||||
|
+++ b/elf/tst-tls1.c
|
||||||
|
@@ -1,13 +1,14 @@
|
||||||
|
/* glibc test for TLS in ld.so. */
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
-#include "tls-macros.h"
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-/* Two common 'int' variables in TLS. */
|
||||||
|
-COMMON_INT_DEF(foo);
|
||||||
|
-COMMON_INT_DEF(bar);
|
||||||
|
|
||||||
|
+__thread int foo, bar __attribute__ ((tls_model("local-exec")));
|
||||||
|
+extern __thread int foo_gd asm ("foo") __attribute__ ((tls_model("global-dynamic")));
|
||||||
|
+extern __thread int foo_ld asm ("foo") __attribute__ ((tls_model("local-dynamic")));
|
||||||
|
+extern __thread int foo_ie asm ("foo") __attribute__ ((tls_model("initial-exec")));
|
||||||
|
+extern __thread int bar_gd asm ("bar") __attribute__ ((tls_model("global-dynamic")));
|
||||||
|
+extern __thread int bar_ld asm ("bar") __attribute__ ((tls_model("local-dynamic")));
|
||||||
|
+extern __thread int bar_ie asm ("bar") __attribute__ ((tls_model("initial-exec")));
|
||||||
|
|
||||||
|
static int
|
||||||
|
do_test (void)
|
||||||
|
@@ -18,63 +19,48 @@ do_test (void)
|
||||||
|
|
||||||
|
/* Set the variable using the local exec model. */
|
||||||
|
puts ("set bar to 1 (LE)");
|
||||||
|
- ap = TLS_LE (bar);
|
||||||
|
- *ap = 1;
|
||||||
|
+ bar = 1;
|
||||||
|
|
||||||
|
|
||||||
|
/* Get variables using initial exec model. */
|
||||||
|
fputs ("get sum of foo and bar (IE)", stdout);
|
||||||
|
- ap = TLS_IE (foo);
|
||||||
|
- bp = TLS_IE (bar);
|
||||||
|
+ ap = &foo_ie;
|
||||||
|
+ bp = &bar_ie;
|
||||||
|
printf (" = %d\n", *ap + *bp);
|
||||||
|
result |= *ap + *bp != 1;
|
||||||
|
- if (*ap != 0)
|
||||||
|
- {
|
||||||
|
- printf ("foo = %d\n", *ap);
|
||||||
|
- result = 1;
|
||||||
|
- }
|
||||||
|
- if (*bp != 1)
|
||||||
|
+ if (*ap != 0 || *bp != 1)
|
||||||
|
{
|
||||||
|
- printf ("bar = %d\n", *bp);
|
||||||
|
+ printf ("foo = %d\nbar = %d\n", *ap, *bp);
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- /* Get variables using local dynamic model. */
|
||||||
|
- fputs ("get sum of foo and bar (LD)", stdout);
|
||||||
|
- ap = TLS_LD (foo);
|
||||||
|
- bp = TLS_LD (bar);
|
||||||
|
+ /* Get variables using local dynamic model or TLSDESC. */
|
||||||
|
+ fputs ("get sum of foo and bar (LD or TLSDESC)", stdout);
|
||||||
|
+ ap = &foo_ld;
|
||||||
|
+ bp = &bar_ld;
|
||||||
|
printf (" = %d\n", *ap + *bp);
|
||||||
|
result |= *ap + *bp != 1;
|
||||||
|
- if (*ap != 0)
|
||||||
|
- {
|
||||||
|
- printf ("foo = %d\n", *ap);
|
||||||
|
- result = 1;
|
||||||
|
- }
|
||||||
|
- if (*bp != 1)
|
||||||
|
+ if (*ap != 0 || *bp != 1)
|
||||||
|
{
|
||||||
|
- printf ("bar = %d\n", *bp);
|
||||||
|
+ printf ("foo = %d\nbar = %d\n", *ap, *bp);
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- /* Get variables using generic dynamic model. */
|
||||||
|
- fputs ("get sum of foo and bar (GD)", stdout);
|
||||||
|
- ap = TLS_GD (foo);
|
||||||
|
- bp = TLS_GD (bar);
|
||||||
|
+ /* Get variables using general dynamic model or TLSDESC. */
|
||||||
|
+ fputs ("get sum of foo and bar (GD or TLSDESC)", stdout);
|
||||||
|
+ ap = &foo_gd;
|
||||||
|
+ bp = &bar_gd;
|
||||||
|
printf (" = %d\n", *ap + *bp);
|
||||||
|
result |= *ap + *bp != 1;
|
||||||
|
- if (*ap != 0)
|
||||||
|
- {
|
||||||
|
- printf ("foo = %d\n", *ap);
|
||||||
|
- result = 1;
|
||||||
|
- }
|
||||||
|
- if (*bp != 1)
|
||||||
|
+ if (*ap != 0 || *bp != 1)
|
||||||
|
{
|
||||||
|
- printf ("bar = %d\n", *bp);
|
||||||
|
+ printf ("foo = %d\nbar = %d\n", *ap, *bp);
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/elf/tst-tls2.c b/elf/tst-tls2.c
|
||||||
|
deleted file mode 100644
|
||||||
|
index 963b8d6..0000000
|
||||||
|
--- a/elf/tst-tls2.c
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,82 +0,0 @@
|
||||||
|
-/* glibc test for TLS in ld.so. */
|
||||||
|
-#include <stdio.h>
|
||||||
|
-
|
||||||
|
-#include "tls-macros.h"
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-/* Two 'int' variables in TLS. */
|
||||||
|
-VAR_INT_DEF(foo);
|
||||||
|
-VAR_INT_DEF(bar);
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-static int
|
||||||
|
-do_test (void)
|
||||||
|
-{
|
||||||
|
- int result = 0;
|
||||||
|
- int *ap, *bp;
|
||||||
|
-
|
||||||
|
-
|
||||||
|
- /* Set the variable using the local exec model. */
|
||||||
|
- puts ("set bar to 1 (LE)");
|
||||||
|
- ap = TLS_LE (bar);
|
||||||
|
- *ap = 1;
|
||||||
|
-
|
||||||
|
-
|
||||||
|
- /* Get variables using initial exec model. */
|
||||||
|
- fputs ("get sum of foo and bar (IE)", stdout);
|
||||||
|
- ap = TLS_IE (foo);
|
||||||
|
- bp = TLS_IE (bar);
|
||||||
|
- printf (" = %d\n", *ap + *bp);
|
||||||
|
- result |= *ap + *bp != 1;
|
||||||
|
- if (*ap != 0)
|
||||||
|
- {
|
||||||
|
- printf ("foo = %d\n", *ap);
|
||||||
|
- result = 1;
|
||||||
|
- }
|
||||||
|
- if (*bp != 1)
|
||||||
|
- {
|
||||||
|
- printf ("bar = %d\n", *bp);
|
||||||
|
- result = 1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
-
|
||||||
|
- /* Get variables using local dynamic model. */
|
||||||
|
- fputs ("get sum of foo and bar (LD)", stdout);
|
||||||
|
- ap = TLS_LD (foo);
|
||||||
|
- bp = TLS_LD (bar);
|
||||||
|
- printf (" = %d\n", *ap + *bp);
|
||||||
|
- result |= *ap + *bp != 1;
|
||||||
|
- if (*ap != 0)
|
||||||
|
- {
|
||||||
|
- printf ("foo = %d\n", *ap);
|
||||||
|
- result = 1;
|
||||||
|
- }
|
||||||
|
- if (*bp != 1)
|
||||||
|
- {
|
||||||
|
- printf ("bar = %d\n", *bp);
|
||||||
|
- result = 1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
-
|
||||||
|
- /* Get variables using generic dynamic model. */
|
||||||
|
- fputs ("get sum of foo and bar (GD)", stdout);
|
||||||
|
- ap = TLS_GD (foo);
|
||||||
|
- bp = TLS_GD (bar);
|
||||||
|
- printf (" = %d\n", *ap + *bp);
|
||||||
|
- result |= *ap + *bp != 1;
|
||||||
|
- if (*ap != 0)
|
||||||
|
- {
|
||||||
|
- printf ("foo = %d\n", *ap);
|
||||||
|
- result = 1;
|
||||||
|
- }
|
||||||
|
- if (*bp != 1)
|
||||||
|
- {
|
||||||
|
- printf ("bar = %d\n", *bp);
|
||||||
|
- result = 1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return result;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-#include <support/test-driver.c>
|
||||||
|
diff --git a/elf/tst-tls3.c b/elf/tst-tls3.c
|
||||||
|
index 7e0abb4..222b179 100644
|
||||||
|
--- a/elf/tst-tls3.c
|
||||||
|
+++ b/elf/tst-tls3.c
|
||||||
|
@@ -1,13 +1,12 @@
|
||||||
|
/* glibc test for TLS in ld.so. */
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
-#include "tls-macros.h"
|
||||||
|
|
||||||
|
-
|
||||||
|
-/* One define int variable, two externs. */
|
||||||
|
-COMMON_INT_DECL(foo);
|
||||||
|
-VAR_INT_DECL(bar);
|
||||||
|
-VAR_INT_DEF(baz);
|
||||||
|
+__thread int foo, bar __attribute__ ((tls_model("initial-exec")));
|
||||||
|
+__thread int baz __attribute__ ((tls_model("local-exec")));
|
||||||
|
+extern __thread int foo_gd __attribute__ ((alias("foo"), tls_model("global-dynamic")));
|
||||||
|
+extern __thread int bar_gd __attribute__ ((alias("bar"), tls_model("global-dynamic")));
|
||||||
|
+extern __thread int baz_ld __attribute__ ((alias("baz"), tls_model("local-dynamic")));
|
||||||
|
|
||||||
|
|
||||||
|
extern int in_dso (void);
|
||||||
|
@@ -22,23 +21,20 @@ do_test (void)
|
||||||
|
|
||||||
|
/* Set the variable using the local exec model. */
|
||||||
|
puts ("set baz to 3 (LE)");
|
||||||
|
- ap = TLS_LE (baz);
|
||||||
|
- *ap = 3;
|
||||||
|
+ baz = 3;
|
||||||
|
|
||||||
|
|
||||||
|
/* Get variables using initial exec model. */
|
||||||
|
puts ("set variables foo and bar (IE)");
|
||||||
|
- ap = TLS_IE (foo);
|
||||||
|
- *ap = 1;
|
||||||
|
- bp = TLS_IE (bar);
|
||||||
|
- *bp = 2;
|
||||||
|
+ foo = 1;
|
||||||
|
+ bar = 2;
|
||||||
|
|
||||||
|
|
||||||
|
/* Get variables using local dynamic model. */
|
||||||
|
fputs ("get sum of foo, bar (GD) and baz (LD)", stdout);
|
||||||
|
- ap = TLS_GD (foo);
|
||||||
|
- bp = TLS_GD (bar);
|
||||||
|
- cp = TLS_LD (baz);
|
||||||
|
+ ap = &foo_gd;
|
||||||
|
+ bp = &bar_gd;
|
||||||
|
+ cp = &baz_ld;
|
||||||
|
printf (" = %d\n", *ap + *bp + *cp);
|
||||||
|
result |= *ap + *bp + *cp != 6;
|
||||||
|
if (*ap != 1)
|
||||||
|
diff --git a/elf/tst-tlsmod1.c b/elf/tst-tlsmod1.c
|
||||||
|
index 8d91567..a448c4d 100644
|
||||||
|
--- a/elf/tst-tlsmod1.c
|
||||||
|
+++ b/elf/tst-tlsmod1.c
|
||||||
|
@@ -1,12 +1,12 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
-#include "tls-macros.h"
|
||||||
|
|
||||||
|
+__thread int foo, bar __attribute__ ((tls_model("global-dynamic")));
|
||||||
|
+extern __thread int baz __attribute__ ((tls_model("global-dynamic")));
|
||||||
|
+extern __thread int foo_ie asm ("foo") __attribute__ ((tls_model("initial-exec")));
|
||||||
|
+extern __thread int bar_ie asm ("bar") __attribute__ ((tls_model("initial-exec")));
|
||||||
|
+extern __thread int baz_ie asm ("baz") __attribute__ ((tls_model("initial-exec")));
|
||||||
|
|
||||||
|
-/* One define int variable, two externs. */
|
||||||
|
-COMMON_INT_DEF(foo);
|
||||||
|
-VAR_INT_DEF(bar);
|
||||||
|
-VAR_INT_DECL(baz);
|
||||||
|
|
||||||
|
extern int in_dso (void);
|
||||||
|
|
||||||
|
@@ -19,8 +19,8 @@ in_dso (void)
|
||||||
|
/* Get variables using initial exec model. */
|
||||||
|
fputs ("get sum of foo and bar (IE)", stdout);
|
||||||
|
asm ("" ::: "memory");
|
||||||
|
- ap = TLS_IE (foo);
|
||||||
|
- bp = TLS_IE (bar);
|
||||||
|
+ ap = &foo_ie;
|
||||||
|
+ bp = &bar_ie;
|
||||||
|
printf (" = %d\n", *ap + *bp);
|
||||||
|
result |= *ap + *bp != 3;
|
||||||
|
if (*ap != 1)
|
||||||
|
@@ -35,11 +35,11 @@ in_dso (void)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- /* Get variables using generic dynamic model. */
|
||||||
|
- fputs ("get sum of foo and bar and baz (GD)", stdout);
|
||||||
|
- ap = TLS_GD (foo);
|
||||||
|
- bp = TLS_GD (bar);
|
||||||
|
- cp = TLS_GD (baz);
|
||||||
|
+ /* Get variables using generic dynamic model or TLSDESC. */
|
||||||
|
+ fputs ("get sum of foo and bar and baz (GD or TLSDESC)", stdout);
|
||||||
|
+ ap = &foo;
|
||||||
|
+ bp = &bar;
|
||||||
|
+ cp = &baz;
|
||||||
|
printf (" = %d\n", *ap + *bp + *cp);
|
||||||
|
result |= *ap + *bp + *cp != 6;
|
||||||
|
if (*ap != 1)
|
||||||
|
diff --git a/elf/tst-tlsmod2.c b/elf/tst-tlsmod2.c
|
||||||
|
index 40eb140..3223fe4 100644
|
||||||
|
--- a/elf/tst-tlsmod2.c
|
||||||
|
+++ b/elf/tst-tlsmod2.c
|
||||||
|
@@ -1,9 +1,7 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
-#include "tls-macros.h"
|
||||||
|
|
||||||
|
-
|
||||||
|
-COMMON_INT_DEF(foo);
|
||||||
|
+__thread int foo;
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -15,7 +13,7 @@ in_dso (int n, int *caller_foop)
|
||||||
|
puts ("foo"); /* Make sure PLT is used before macros. */
|
||||||
|
asm ("" ::: "memory");
|
||||||
|
|
||||||
|
- foop = TLS_GD (foo);
|
||||||
|
+ foop = &foo;
|
||||||
|
|
||||||
|
if (caller_foop != NULL && foop != caller_foop)
|
||||||
|
{
|
||||||
|
diff --git a/elf/tst-tlsmod3.c b/elf/tst-tlsmod3.c
|
||||||
|
index 6d186c4..d6e7498 100644
|
||||||
|
--- a/elf/tst-tlsmod3.c
|
||||||
|
+++ b/elf/tst-tlsmod3.c
|
||||||
|
@@ -1,10 +1,10 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
-#include "tls-macros.h"
|
||||||
|
|
||||||
|
extern int in_dso (int n, int *caller_foop);
|
||||||
|
|
||||||
|
-COMMON_INT_DEF(comm_n);
|
||||||
|
+extern __thread int foo;
|
||||||
|
+__thread int comm_n;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -20,8 +20,8 @@ in_dso2 (void)
|
||||||
|
puts ("foo"); /* Make sure PLT is used before macros. */
|
||||||
|
asm ("" ::: "memory");
|
||||||
|
|
||||||
|
- foop = TLS_GD (foo);
|
||||||
|
- np = TLS_GD (comm_n);
|
||||||
|
+ foop = &foo;
|
||||||
|
+ np = &comm_n;
|
||||||
|
|
||||||
|
if (n != *np)
|
||||||
|
{
|
||||||
|
diff --git a/elf/tst-tlsmod4.c b/elf/tst-tlsmod4.c
|
||||||
|
index 86889aa..f38919a 100644
|
||||||
|
--- a/elf/tst-tlsmod4.c
|
||||||
|
+++ b/elf/tst-tlsmod4.c
|
||||||
|
@@ -1,9 +1,7 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
-#include "tls-macros.h"
|
||||||
|
|
||||||
|
-
|
||||||
|
-COMMON_INT_DEF(baz);
|
||||||
|
+__thread int baz;
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -15,7 +13,7 @@ in_dso (int n, int *caller_bazp)
|
||||||
|
puts ("foo"); /* Make sure PLT is used before macros. */
|
||||||
|
asm ("" ::: "memory");
|
||||||
|
|
||||||
|
- bazp = TLS_GD (baz);
|
||||||
|
+ bazp = &baz;
|
||||||
|
|
||||||
|
if (caller_bazp != NULL && bazp != caller_bazp)
|
||||||
|
{
|
||||||
|
diff --git a/elf/tst-tlsmod5.c b/elf/tst-tlsmod5.c
|
||||||
|
index a97c7e5..3f39c5b 100644
|
||||||
|
--- a/elf/tst-tlsmod5.c
|
||||||
|
+++ b/elf/tst-tlsmod5.c
|
||||||
|
@@ -1,3 +1 @@
|
||||||
|
-#include "tls-macros.h"
|
||||||
|
-
|
||||||
|
-COMMON_INT_DEF(foo);
|
||||||
|
+__thread int foo;
|
||||||
|
diff --git a/elf/tst-tlsmod6.c b/elf/tst-tlsmod6.c
|
||||||
|
index e968596..7b3571f 100644
|
||||||
|
--- a/elf/tst-tlsmod6.c
|
||||||
|
+++ b/elf/tst-tlsmod6.c
|
||||||
|
@@ -1,3 +1 @@
|
||||||
|
-#include "tls-macros.h"
|
||||||
|
-
|
||||||
|
-COMMON_INT_DEF(bar);
|
||||||
|
+__thread int bar;
|
||||||
|
diff --git a/sysdeps/powerpc/mod-tlsopt-powerpc.c b/sysdeps/powerpc/mod-tlsopt-powerpc.c
|
||||||
|
index ee0db12..2a82e53 100644
|
||||||
|
--- a/sysdeps/powerpc/mod-tlsopt-powerpc.c
|
||||||
|
+++ b/sysdeps/powerpc/mod-tlsopt-powerpc.c
|
||||||
|
@@ -1,11 +1,9 @@
|
||||||
|
/* shared library to test for __tls_get_addr optimization. */
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
-#include "../../elf/tls-macros.h"
|
||||||
|
#include "dl-tls.h"
|
||||||
|
|
||||||
|
-/* common 'int' variable in TLS. */
|
||||||
|
-COMMON_INT_DEF(foo);
|
||||||
|
+__thread int foo __attribute__ ((tls_model("global-dynamic")));
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -14,7 +12,7 @@ tls_get_addr_opt_test (void)
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
/* Get variable using general dynamic model. */
|
||||||
|
- int *ap = TLS_GD (foo);
|
||||||
|
+ int *ap = &foo;
|
||||||
|
if (*ap != 0)
|
||||||
|
{
|
||||||
|
printf ("foo = %d\n", *ap);
|
||||||
|
diff --git a/sysdeps/powerpc/tst-tlsifunc.c b/sysdeps/powerpc/tst-tlsifunc.c
|
||||||
|
index 3095d41..c8c0bad 100644
|
||||||
|
--- a/sysdeps/powerpc/tst-tlsifunc.c
|
||||||
|
+++ b/sysdeps/powerpc/tst-tlsifunc.c
|
||||||
|
@@ -21,9 +21,9 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <libc-symbols.h>
|
||||||
|
-#include <tls-macros.h>
|
||||||
|
|
||||||
|
__thread int bar;
|
||||||
|
+extern __thread int bar_gd asm ("bar") __attribute__ ((tls_model("global-dynamic")));
|
||||||
|
static int *bar_ptr = NULL;
|
||||||
|
|
||||||
|
static uint32_t resolver_platform = 0;
|
||||||
|
@@ -57,7 +57,7 @@ get_platform (void)
|
||||||
|
void
|
||||||
|
init_foo (void)
|
||||||
|
{
|
||||||
|
- bar_ptr = TLS_GD (bar);
|
||||||
|
+ bar_ptr = &bar_gd;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
27
elf-Fix-missing-colon-in-LD_SHOW_AUXV-output-BZ-2825.patch
Normal file
27
elf-Fix-missing-colon-in-LD_SHOW_AUXV-output-BZ-2825.patch
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
From 82fbcd7118d760492e2ecc9fa291e358b9ba0361 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Arjun Shankar <arjun@redhat.com>
|
||||||
|
Date: Fri, 20 Aug 2021 16:24:05 +0200
|
||||||
|
Subject: [PATCH] elf: Fix missing colon in LD_SHOW_AUXV output [BZ #28253]
|
||||||
|
|
||||||
|
This commit adds a missing colon in the AT_MINSIGSTKSZ entry in
|
||||||
|
the _dl_show_auxv function.
|
||||||
|
---
|
||||||
|
elf/dl-sysdep.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c
|
||||||
|
index d47bef1..2c684c2 100644
|
||||||
|
--- a/elf/dl-sysdep.c
|
||||||
|
+++ b/elf/dl-sysdep.c
|
||||||
|
@@ -317,7 +317,7 @@ _dl_show_auxv (void)
|
||||||
|
[AT_SYSINFO_EHDR - 2] = { "SYSINFO_EHDR: 0x", hex },
|
||||||
|
[AT_RANDOM - 2] = { "RANDOM: 0x", hex },
|
||||||
|
[AT_HWCAP2 - 2] = { "HWCAP2: 0x", hex },
|
||||||
|
- [AT_MINSIGSTKSZ - 2] = { "MINSIGSTKSZ ", dec },
|
||||||
|
+ [AT_MINSIGSTKSZ - 2] = { "MINSIGSTKSZ: ", dec },
|
||||||
|
[AT_L1I_CACHESIZE - 2] = { "L1I_CACHESIZE: ", dec },
|
||||||
|
[AT_L1I_CACHEGEOMETRY - 2] = { "L1I_CACHEGEOMETRY: 0x", hex },
|
||||||
|
[AT_L1D_CACHESIZE - 2] = { "L1D_CACHESIZE: ", dec },
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
13
glibc.spec
13
glibc.spec
@ -63,7 +63,7 @@
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
Name: glibc
|
Name: glibc
|
||||||
Version: 2.34
|
Version: 2.34
|
||||||
Release: 8
|
Release: 9
|
||||||
Summary: The GNU libc libraries
|
Summary: The GNU libc libraries
|
||||||
License: %{all_license}
|
License: %{all_license}
|
||||||
URL: http://www.gnu.org/software/glibc/
|
URL: http://www.gnu.org/software/glibc/
|
||||||
@ -99,6 +99,13 @@ Patch18: elf-Unconditionally-use-__ehdr_start.patch
|
|||||||
Patch19: aarch64-Make-elf_machine_-load_address-dynamic-robus.patch
|
Patch19: aarch64-Make-elf_machine_-load_address-dynamic-robus.patch
|
||||||
Patch20: mtrace-Use-a-static-buffer-for-printing-BZ-25947.patch
|
Patch20: mtrace-Use-a-static-buffer-for-printing-BZ-25947.patch
|
||||||
Patch21: time-Fix-overflow-itimer-tests-on-32-bit-systems.patch
|
Patch21: time-Fix-overflow-itimer-tests-on-32-bit-systems.patch
|
||||||
|
Patch22: arm-Simplify-elf_machine_-load_address-dynamic.patch
|
||||||
|
Patch23: elf-Drop-elf-tls-macros.h-in-favor-of-__thread-and-t.patch
|
||||||
|
Patch24: elf-Fix-missing-colon-in-LD_SHOW_AUXV-output-BZ-2825.patch
|
||||||
|
Patch25: Remove-sysdeps-tls-macros.h.patch
|
||||||
|
Patch26: riscv-Drop-reliance-on-_GLOBAL_OFFSET_TABLE_-0.patch
|
||||||
|
Patch27: x86_64-Simplify-elf_machine_-load_address-dynamic.patch
|
||||||
|
Patch28: x86-fix-Autoconf-caching-of-instruction-support-chec.patch
|
||||||
|
|
||||||
#Patch9000: turn-REP_STOSB_THRESHOLD-from-2k-to-1M.patch
|
#Patch9000: turn-REP_STOSB_THRESHOLD-from-2k-to-1M.patch
|
||||||
Patch9001: delete-no-hard-link-to-avoid-all_language-package-to.patch
|
Patch9001: delete-no-hard-link-to-avoid-all_language-package-to.patch
|
||||||
@ -1190,6 +1197,10 @@ fi
|
|||||||
%doc hesiod/README.hesiod
|
%doc hesiod/README.hesiod
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Sep 29 2021 Qingqing Li<liqingqing3@huawei.com> - 2.34-9
|
||||||
|
- elf: drop elf/tls-macros.h in favor of thread tls_mode attribute.
|
||||||
|
- use __ehdr_start for __GLOBAL_OFFSET_TABLE[0]
|
||||||
|
|
||||||
* Wed Sep 29 2021 Qingqing Li<liqingqing3@huawei.com> - 2.34-8
|
* Wed Sep 29 2021 Qingqing Li<liqingqing3@huawei.com> - 2.34-8
|
||||||
- fix overflow ittimer tests on 32 bit system
|
- fix overflow ittimer tests on 32 bit system
|
||||||
|
|
||||||
|
|||||||
60
riscv-Drop-reliance-on-_GLOBAL_OFFSET_TABLE_-0.patch
Normal file
60
riscv-Drop-reliance-on-_GLOBAL_OFFSET_TABLE_-0.patch
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
From 34b4624b04fc8f038b2c329ca7560197320615b4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Fangrui Song <maskray@google.com>
|
||||||
|
Date: Wed, 18 Aug 2021 10:01:31 -0700
|
||||||
|
Subject: [PATCH] riscv: Drop reliance on _GLOBAL_OFFSET_TABLE_[0]
|
||||||
|
|
||||||
|
&__ehdr_start is a better way to get the load address.
|
||||||
|
|
||||||
|
This is similar to commits b37b75d269883a2c553bb7019a813094eb4e2dd1
|
||||||
|
(x86-64) and 43d06ed218fc8be58987bdfd00e21e5720f0b862 (aarch64).
|
||||||
|
|
||||||
|
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
|
||||||
|
---
|
||||||
|
sysdeps/riscv/dl-machine.h | 21 ++++++++++-----------
|
||||||
|
1 file changed, 10 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h
|
||||||
|
index aedf69f..5b07461 100644
|
||||||
|
--- a/sysdeps/riscv/dl-machine.h
|
||||||
|
+++ b/sysdeps/riscv/dl-machine.h
|
||||||
|
@@ -76,27 +76,26 @@ elf_machine_matches_host (const ElfW(Ehdr) *ehdr)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Return the run-time load address of the shared object. */
|
||||||
|
+static inline ElfW(Addr)
|
||||||
|
+elf_machine_load_address (void)
|
||||||
|
+{
|
||||||
|
+ extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
|
||||||
|
+ return (ElfW(Addr)) &__ehdr_start;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Return the link-time address of _DYNAMIC. */
|
||||||
|
static inline ElfW(Addr)
|
||||||
|
elf_machine_dynamic (void)
|
||||||
|
{
|
||||||
|
- extern ElfW(Addr) _GLOBAL_OFFSET_TABLE_ __attribute__ ((visibility ("hidden")));
|
||||||
|
- return _GLOBAL_OFFSET_TABLE_;
|
||||||
|
+ extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
|
||||||
|
+ return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
|
||||||
|
}
|
||||||
|
|
||||||
|
#define STRINGXP(X) __STRING (X)
|
||||||
|
#define STRINGXV(X) STRINGV_ (X)
|
||||||
|
#define STRINGV_(...) # __VA_ARGS__
|
||||||
|
|
||||||
|
-/* Return the run-time load address of the shared object. */
|
||||||
|
-static inline ElfW(Addr)
|
||||||
|
-elf_machine_load_address (void)
|
||||||
|
-{
|
||||||
|
- ElfW(Addr) load_addr;
|
||||||
|
- asm ("lla %0, _DYNAMIC" : "=r" (load_addr));
|
||||||
|
- return load_addr - elf_machine_dynamic ();
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
/* Initial entry point code for the dynamic linker.
|
||||||
|
The C function `_dl_start' is the real entry point;
|
||||||
|
its return value is the user program's entry point. */
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
178
x86-fix-Autoconf-caching-of-instruction-support-chec.patch
Normal file
178
x86-fix-Autoconf-caching-of-instruction-support-chec.patch
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
From 0835c0f0bad351117154b815f34f8af19ea7e325 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matt Whitlock <sourceware@mattwhitlock.name>
|
||||||
|
Date: Wed, 16 Jun 2021 23:40:47 -0400
|
||||||
|
Subject: [PATCH] x86: fix Autoconf caching of instruction support checks [BZ
|
||||||
|
#27991]
|
||||||
|
|
||||||
|
The Autoconf documentation for the AC_CACHE_CHECK macro states:
|
||||||
|
|
||||||
|
The commands-to-set-it must have no side effects except for setting
|
||||||
|
the variable cache-id, see below.
|
||||||
|
|
||||||
|
However, the tests for support of -msahf and -mmovbe were embedded in
|
||||||
|
the commands-to-set-it for lib_cv_include_x86_isa_level. This had the
|
||||||
|
consequence that libc_cv_have_x86_lahf_sahf and libc_cv_have_x86_movbe
|
||||||
|
were not defined whenever lib_cv_include_x86_isa_level was read from
|
||||||
|
cache. These variables' being undefined meant that their unquoted use
|
||||||
|
in later test expressions led to the 'test' built-in's misparsing its
|
||||||
|
arguments and emitting errors like "test: =: unexpected operator" or
|
||||||
|
"test: =: unary operator expected", depending on the particular shell.
|
||||||
|
|
||||||
|
This commit refactors the tests for LAHF/SAHF and MOVBE instruction
|
||||||
|
support into their own AC_CACHE_CHECK macro invocations to obey the
|
||||||
|
rule that the commands-to-set-it must have no side effects other than
|
||||||
|
setting the variable named by cache-id.
|
||||||
|
|
||||||
|
Signed-off-by: Matt Whitlock <sourceware@mattwhitlock.name>
|
||||||
|
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
---
|
||||||
|
sysdeps/x86/configure | 56 ++++++++++++++++++++++++++++++------------------
|
||||||
|
sysdeps/x86/configure.ac | 34 +++++++++++++++--------------
|
||||||
|
2 files changed, 53 insertions(+), 37 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure
|
||||||
|
index ead1295..62676bb 100644
|
||||||
|
--- a/sysdeps/x86/configure
|
||||||
|
+++ b/sysdeps/x86/configure
|
||||||
|
@@ -126,8 +126,6 @@ cat > conftest2.S <<EOF
|
||||||
|
4:
|
||||||
|
EOF
|
||||||
|
libc_cv_include_x86_isa_level=no
|
||||||
|
-libc_cv_have_x86_lahf_sahf=no
|
||||||
|
-libc_cv_have_x86_movbe=no
|
||||||
|
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest conftest1.S conftest2.S'
|
||||||
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
@@ -137,9 +135,22 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest c
|
||||||
|
count=`LC_ALL=C $READELF -n conftest | grep NT_GNU_PROPERTY_TYPE_0 | wc -l`
|
||||||
|
if test "$count" = 1; then
|
||||||
|
libc_cv_include_x86_isa_level=yes
|
||||||
|
- cat > conftest.c <<EOF
|
||||||
|
-EOF
|
||||||
|
- if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - conftest.c'
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+rm -f conftest*
|
||||||
|
+fi
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_include_x86_isa_level" >&5
|
||||||
|
+$as_echo "$libc_cv_include_x86_isa_level" >&6; }
|
||||||
|
+if test $libc_cv_include_x86_isa_level = yes; then
|
||||||
|
+ $as_echo "#define INCLUDE_X86_ISA_LEVEL 1" >>confdefs.h
|
||||||
|
+
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LAHF/SAHF instruction support" >&5
|
||||||
|
+$as_echo_n "checking for LAHF/SAHF instruction support... " >&6; }
|
||||||
|
+if ${libc_cv_have_x86_lahf_sahf+:} false; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ libc_cv_have_x86_lahf_sahf=no
|
||||||
|
+ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - -x c /dev/null'
|
||||||
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
@@ -147,7 +158,20 @@ EOF
|
||||||
|
test $ac_status = 0; }; } | grep -q "\-msahf"; then
|
||||||
|
libc_cv_have_x86_lahf_sahf=yes
|
||||||
|
fi
|
||||||
|
- if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - conftest.c'
|
||||||
|
+fi
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_x86_lahf_sahf" >&5
|
||||||
|
+$as_echo "$libc_cv_have_x86_lahf_sahf" >&6; }
|
||||||
|
+ if test $libc_cv_have_x86_lahf_sahf = yes; then
|
||||||
|
+ $as_echo "#define HAVE_X86_LAHF_SAHF 1" >>confdefs.h
|
||||||
|
+
|
||||||
|
+ fi
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MOVBE instruction support" >&5
|
||||||
|
+$as_echo_n "checking for MOVBE instruction support... " >&6; }
|
||||||
|
+if ${libc_cv_have_x86_movbe+:} false; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ libc_cv_have_x86_movbe=no
|
||||||
|
+ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - -x c /dev/null'
|
||||||
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
@@ -155,23 +179,13 @@ EOF
|
||||||
|
test $ac_status = 0; }; } | grep -q "\-mmovbe"; then
|
||||||
|
libc_cv_have_x86_movbe=yes
|
||||||
|
fi
|
||||||
|
- fi
|
||||||
|
-fi
|
||||||
|
-rm -f conftest*
|
||||||
|
-fi
|
||||||
|
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_include_x86_isa_level" >&5
|
||||||
|
-$as_echo "$libc_cv_include_x86_isa_level" >&6; }
|
||||||
|
-if test $libc_cv_include_x86_isa_level = yes; then
|
||||||
|
- $as_echo "#define INCLUDE_X86_ISA_LEVEL 1" >>confdefs.h
|
||||||
|
-
|
||||||
|
fi
|
||||||
|
-if test $libc_cv_have_x86_lahf_sahf = yes; then
|
||||||
|
- $as_echo "#define HAVE_X86_LAHF_SAHF 1" >>confdefs.h
|
||||||
|
-
|
||||||
|
-fi
|
||||||
|
-if test $libc_cv_have_x86_movbe = yes; then
|
||||||
|
- $as_echo "#define HAVE_X86_MOVBE 1" >>confdefs.h
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_x86_movbe" >&5
|
||||||
|
+$as_echo "$libc_cv_have_x86_movbe" >&6; }
|
||||||
|
+ if test $libc_cv_have_x86_movbe = yes; then
|
||||||
|
+ $as_echo "#define HAVE_X86_MOVBE 1" >>confdefs.h
|
||||||
|
|
||||||
|
+ fi
|
||||||
|
fi
|
||||||
|
config_vars="$config_vars
|
||||||
|
enable-x86-isa-level = $libc_cv_include_x86_isa_level"
|
||||||
|
diff --git a/sysdeps/x86/configure.ac b/sysdeps/x86/configure.ac
|
||||||
|
index bca97fd..04a12ab 100644
|
||||||
|
--- a/sysdeps/x86/configure.ac
|
||||||
|
+++ b/sysdeps/x86/configure.ac
|
||||||
|
@@ -98,30 +98,32 @@ cat > conftest2.S <<EOF
|
||||||
|
4:
|
||||||
|
EOF
|
||||||
|
libc_cv_include_x86_isa_level=no
|
||||||
|
-libc_cv_have_x86_lahf_sahf=no
|
||||||
|
-libc_cv_have_x86_movbe=no
|
||||||
|
if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest conftest1.S conftest2.S); then
|
||||||
|
count=`LC_ALL=C $READELF -n conftest | grep NT_GNU_PROPERTY_TYPE_0 | wc -l`
|
||||||
|
if test "$count" = 1; then
|
||||||
|
libc_cv_include_x86_isa_level=yes
|
||||||
|
- cat > conftest.c <<EOF
|
||||||
|
-EOF
|
||||||
|
- if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - conftest.c) | grep -q "\-msahf"; then
|
||||||
|
- libc_cv_have_x86_lahf_sahf=yes
|
||||||
|
- fi
|
||||||
|
- if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - conftest.c) | grep -q "\-mmovbe"; then
|
||||||
|
- libc_cv_have_x86_movbe=yes
|
||||||
|
- fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
rm -f conftest*])
|
||||||
|
if test $libc_cv_include_x86_isa_level = yes; then
|
||||||
|
AC_DEFINE(INCLUDE_X86_ISA_LEVEL)
|
||||||
|
-fi
|
||||||
|
-if test $libc_cv_have_x86_lahf_sahf = yes; then
|
||||||
|
- AC_DEFINE(HAVE_X86_LAHF_SAHF)
|
||||||
|
-fi
|
||||||
|
-if test $libc_cv_have_x86_movbe = yes; then
|
||||||
|
- AC_DEFINE(HAVE_X86_MOVBE)
|
||||||
|
+ AC_CACHE_CHECK([for LAHF/SAHF instruction support],
|
||||||
|
+ libc_cv_have_x86_lahf_sahf, [dnl
|
||||||
|
+ libc_cv_have_x86_lahf_sahf=no
|
||||||
|
+ if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - -x c /dev/null) | grep -q "\-msahf"; then
|
||||||
|
+ libc_cv_have_x86_lahf_sahf=yes
|
||||||
|
+ fi])
|
||||||
|
+ if test $libc_cv_have_x86_lahf_sahf = yes; then
|
||||||
|
+ AC_DEFINE(HAVE_X86_LAHF_SAHF)
|
||||||
|
+ fi
|
||||||
|
+ AC_CACHE_CHECK([for MOVBE instruction support],
|
||||||
|
+ libc_cv_have_x86_movbe, [dnl
|
||||||
|
+ libc_cv_have_x86_movbe=no
|
||||||
|
+ if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - -x c /dev/null) | grep -q "\-mmovbe"; then
|
||||||
|
+ libc_cv_have_x86_movbe=yes
|
||||||
|
+ fi])
|
||||||
|
+ if test $libc_cv_have_x86_movbe = yes; then
|
||||||
|
+ AC_DEFINE(HAVE_X86_MOVBE)
|
||||||
|
+ fi
|
||||||
|
fi
|
||||||
|
LIBC_CONFIG_VAR([enable-x86-isa-level], [$libc_cv_include_x86_isa_level])
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
55
x86_64-Simplify-elf_machine_-load_address-dynamic.patch
Normal file
55
x86_64-Simplify-elf_machine_-load_address-dynamic.patch
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
From b37b75d269883a2c553bb7019a813094eb4e2dd1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Fangrui Song <maskray@google.com>
|
||||||
|
Date: Tue, 17 Aug 2021 10:45:57 -0700
|
||||||
|
Subject: [PATCH] x86_64: Simplify elf_machine_{load_address,dynamic}
|
||||||
|
|
||||||
|
and drop reliance on _GLOBAL_OFFSET_TABLE_[0] being the link-time
|
||||||
|
address of _DYNAMIC. &__ehdr_start is a better way to get the load address.
|
||||||
|
|
||||||
|
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
|
||||||
|
---
|
||||||
|
sysdeps/x86_64/dl-machine.h | 21 +++++++--------------
|
||||||
|
1 file changed, 7 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
|
||||||
|
index a8596aa..ceee507 100644
|
||||||
|
--- a/sysdeps/x86_64/dl-machine.h
|
||||||
|
+++ b/sysdeps/x86_64/dl-machine.h
|
||||||
|
@@ -35,27 +35,20 @@ elf_machine_matches_host (const ElfW(Ehdr) *ehdr)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-/* Return the link-time address of _DYNAMIC. Conveniently, this is the
|
||||||
|
- first element of the GOT. This must be inlined in a function which
|
||||||
|
- uses global data. */
|
||||||
|
+/* Return the run-time load address of the shared object. */
|
||||||
|
static inline ElfW(Addr) __attribute__ ((unused))
|
||||||
|
-elf_machine_dynamic (void)
|
||||||
|
+elf_machine_load_address (void)
|
||||||
|
{
|
||||||
|
- /* This produces an IP-relative reloc which is resolved at link time. */
|
||||||
|
- extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] attribute_hidden;
|
||||||
|
- return _GLOBAL_OFFSET_TABLE_[0];
|
||||||
|
+ extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
|
||||||
|
+ return (ElfW(Addr)) &__ehdr_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
-/* Return the run-time load address of the shared object. */
|
||||||
|
+/* Return the link-time address of _DYNAMIC. */
|
||||||
|
static inline ElfW(Addr) __attribute__ ((unused))
|
||||||
|
-elf_machine_load_address (void)
|
||||||
|
+elf_machine_dynamic (void)
|
||||||
|
{
|
||||||
|
- /* Compute the difference between the runtime address of _DYNAMIC as seen
|
||||||
|
- by an IP-relative reference, and the link-time address found in the
|
||||||
|
- special unrelocated first GOT entry. */
|
||||||
|
extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
|
||||||
|
- return (ElfW(Addr)) &_DYNAMIC - elf_machine_dynamic ();
|
||||||
|
+ return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set up the loaded object described by L so its unrelocated PLT
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user