This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch hjl/pie/static created. glibc-2.26-524-g64d9570


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, hjl/pie/static has been created
        at  64d957024bd253920061cc4c75ddf1287e42c17b (commit)

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=64d957024bd253920061cc4c75ddf1287e42c17b

commit 64d957024bd253920061cc4c75ddf1287e42c17b
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 3 17:35:17 2017 -0700

    Fix --enable-static-pie

diff --git a/Makeconfig b/Makeconfig
index 3d57f1c..ac79083 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -367,6 +367,10 @@ ifndef static-start-installed-name
 static-start-installed-name = $(start-installed-name)
 endif
 
+ifeq (yes,$(enable-static-pie))
+static-start-installed-name := P$(static-start-installed-name)
+endif
+
 ifeq (yesyes,$(build-shared)$(have-z-combreloc))
 combreloc-LDFLAGS = -Wl,-z,combreloc
 LDFLAGS.so += $(combreloc-LDFLAGS)
@@ -447,7 +451,7 @@ ifndef +link-static
 +link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
 	      $(firstword $(DEFAULT-LDFLAGS-$(@F)) $(default-pie-ldflag)) \
 	      $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F))  \
-	      $(addprefix $(csu-objpfx),$(static-start-installed-name)) \
+	      $(firstword $(CRT-$(@F)) $(csu-objpfx)$(static-start-installed-name)) \
 	      $(+preinit) $(+prectorT) \
 	      $(filter-out $(addprefix $(csu-objpfx),start.o \
 						     $(start-installed-name))\
diff --git a/csu/Makefile b/csu/Makefile
index fd668a5..8f9b06a 100644
--- a/csu/Makefile
+++ b/csu/Makefile
@@ -35,9 +35,13 @@ csu-dummies = $(filter-out $(start-installed-name),crt1.o Mcrt1.o)
 extra-objs = start.o \
 	     $(start-installed-name) g$(start-installed-name) $(csu-dummies) \
 	     S$(start-installed-name)
+ifeq (yes,$(enable-static-pie))
+extra-objs += P$(start-installed-name)
+endif
 omit-deps = $(patsubst %.o,%,$(start-installed-name) g$(start-installed-name) \
 			     b$(start-installed-name) $(csu-dummies) \
-			     S$(start-installed-name))
+			     S$(start-installed-name) \
+			     P$(start-installed-name))
 install-lib = $(start-installed-name) g$(start-installed-name) $(csu-dummies)
 
 # No tests are allowed in the csu/ subdirectory because the startup
@@ -55,6 +59,10 @@ extra-objs += gmon-start.o
 endif
 install-lib += S$(start-installed-name)
 generated += start.os
+ifeq (yes,$(enable-static-pie))
+extra-objs += P$(start-installed-name)
+install-lib += P$(start-installed-name)
+endif
 else
 extra-objs += gmon-start.o
 endif
@@ -77,7 +85,7 @@ crtstuff = crti crtn
 install-lib += $(crtstuff:=.o)
 extra-objs += $(crtstuff:=.o)
 
-extra-objs += abi-note.o init.o
+extra-objs += abi-note.o init.o static-reloc.o
 asm-CPPFLAGS += -I$(objpfx).
 
 # Enable unwinding so backtrace unwinds to __libc_start_main
@@ -96,6 +104,9 @@ ifndef start-installed-name-rule
 # We link the ELF startfile along with a SHT_NOTE section indicating
 # the kernel ABI the binaries linked with this library will require.
 $(objpfx)$(start-installed-name): $(objpfx)start.o $(objpfx)abi-note.o \
+				  $(objpfx)init.o $(objpfx)static-reloc.o
+	$(link-relocatable)
+$(objpfx)P$(start-installed-name): $(objpfx)start.o $(objpfx)abi-note.o \
 				  $(objpfx)init.o
 	$(link-relocatable)
 $(objpfx)S$(start-installed-name): $(objpfx)start.os $(objpfx)abi-note.o \
diff --git a/csu/static-reloc.c b/csu/static-reloc.c
new file mode 100644
index 0000000..37be72c
--- /dev/null
+++ b/csu/static-reloc.c
@@ -0,0 +1,26 @@
+/* Special startup support for non-PIE static executables.
+   Copyright (C) 2017 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/>.  */
+
+#if ENABLE_STATIC_PIE
+#include <ldsodefs.h>
+
+void
+_dl_relocate_static_pie (void)
+{
+}
+#endif

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=8be686b5d2149f04b2328d0b3d1f6fbe40e4e47f

commit 8be686b5d2149f04b2328d0b3d1f6fbe40e4e47f
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 3 17:11:55 2017 -0700

    test-math-iscanonical.cc: Replace bool with int
    
    Fix GCC 7 compilation error:
    
    test-math-iscanonical.cc: In function â??void check_type()â??:
    test-math-iscanonical.cc:33:11: error: use of an operand of type â??boolâ?? in â??operator++â?? is deprecated [-Werror=deprecated]
         errors++;
               ^~
    
    	* math/test-math-iscanonical.cc (error): Replace bool with int.

diff --git a/math/test-math-iscanonical.cc b/math/test-math-iscanonical.cc
index aba68ac..8ced7a7 100644
--- a/math/test-math-iscanonical.cc
+++ b/math/test-math-iscanonical.cc
@@ -20,7 +20,7 @@
 #include <math.h>
 #include <stdio.h>
 
-static bool errors;
+static int errors;
 
 template <class T>
 static void

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=7dbd6f4b7e299a6448838ac2d33d2340eddc3f8f

commit 7dbd6f4b7e299a6448838ac2d33d2340eddc3f8f
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 3 16:43:10 2017 -0700

    Fix Use $(DEFAULT-LDFLAGS-$(@F)) in +link-static-before-libc

diff --git a/elf/Makefile b/elf/Makefile
index 0196ae7..cb035e6 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -153,6 +153,7 @@ tests-static-internal := tst-tls1-static tst-tls2-static \
 	       tst-ptrguard1-static tst-stackguard1-static \
 	       tst-tls1-static-non-pie
 
+CRT-tst-tls1-static-non-pie := $(csu-objpfx)crt1.o
 DEFAULT-LDFLAGS-tst-tls1-static-non-pie = $(no-pie-ldflag)
 
 tests := tst-tls9 tst-leaks1 \

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=26dba541029a992ec3bc28db72c261ca92fff62b

commit 26dba541029a992ec3bc28db72c261ca92fff62b
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 3 16:05:59 2017 -0700

    Update dl-reloc-static-pie.c

diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c
index 1dc4f13..d949b25 100644
--- a/elf/dl-reloc-static-pie.c
+++ b/elf/dl-reloc-static-pie.c
@@ -35,10 +35,6 @@ _dl_relocate_static_pie (void)
   /* Figure out the run-time load addres of static PIE.  */
   _dl_main_map.l_addr = elf_machine_load_address ();
 
-  /* Skip if this is a non-PIE static executable.  */
-  if (!_dl_main_map.l_addr)
-    return;
-
   /* Read our own dynamic section and fill in the info array.  */
   _dl_main_map.l_ld = ((void *) _dl_main_map.l_addr
 		       + elf_machine_dynamic ());

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=6f429fe0f1c7a5d16dec356cfa4c7bbca39b9f11

commit 6f429fe0f1c7a5d16dec356cfa4c7bbca39b9f11
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 3 16:04:03 2017 -0700

    Add dl-reloc-static-pie.c

diff --git a/elf/Makefile b/elf/Makefile
index 8043cdd..0196ae7 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -24,7 +24,8 @@ include ../Makeconfig
 headers		= elf.h bits/elfclass.h link.h bits/link.h
 routines	= $(all-dl-routines) dl-support dl-iteratephdr \
 		  dl-addr dl-addr-obj enbl-secure dl-profstub \
-		  dl-origin dl-libc dl-sym dl-sysdep dl-error
+		  dl-origin dl-libc dl-sym dl-sysdep dl-error \
+		  dl-reloc-static-pie
 
 # The core dynamic linking functions are in libc for the static and
 # profiled libraries.
@@ -52,7 +53,7 @@ endif
 all-dl-routines = $(dl-routines) $(sysdep-dl-routines)
 # But they are absent from the shared libc, because that code is in ld.so.
 elide-routines.os = $(all-dl-routines) dl-support enbl-secure dl-origin \
-		    dl-sysdep dl-exception
+		    dl-sysdep dl-exception dl-reloc-static-pie
 shared-only-routines += dl-caller
 
 # ld.so uses those routines, plus some special stuff for being the program
diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c
new file mode 100644
index 0000000..1dc4f13
--- /dev/null
+++ b/elf/dl-reloc-static-pie.c
@@ -0,0 +1,56 @@
+/* Support for relocating static PIE.
+   Copyright (C) 2017 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/>.  */
+
+#if ENABLE_STATIC_PIE
+#include <ldsodefs.h>
+#include "dynamic-link.h"
+
+/* Relocate static executable with PIE.  */
+
+extern struct link_map _dl_main_map __attribute__((visibility ("hidden")));
+
+void
+_dl_relocate_static_pie (void)
+{
+# define STATIC_PIE_BOOTSTRAP
+# define BOOTSTRAP_MAP (&_dl_main_map)
+# define RESOLVE_MAP(sym, version, flags) BOOTSTRAP_MAP
+# include "dynamic-link.h"
+
+  /* Figure out the run-time load addres of static PIE.  */
+  _dl_main_map.l_addr = elf_machine_load_address ();
+
+  /* Skip if this is a non-PIE static executable.  */
+  if (!_dl_main_map.l_addr)
+    return;
+
+  /* Read our own dynamic section and fill in the info array.  */
+  _dl_main_map.l_ld = ((void *) _dl_main_map.l_addr
+		       + elf_machine_dynamic ());
+  elf_get_dynamic_info (&_dl_main_map, NULL);
+
+# ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
+  ELF_MACHINE_BEFORE_RTLD_RELOC (_dl_main_map.l_info);
+# endif
+
+  /* Relocate ourselves so we can do normal function calls and
+     data access using the global offset table.  */
+  ELF_DYNAMIC_RELOCATE (&_dl_main_map, 0, 0, 0);
+  _dl_main_map.l_relocated = 1;
+}
+#endif
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 150ec00..99ad0f1 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -26,11 +26,7 @@
 #include <sys/param.h>
 #include <stdint.h>
 #include <ldsodefs.h>
-#if ENABLE_STATIC_PIE
-# include "dynamic-link.h"
-#else
-# include <dl-machine.h>
-#endif
+#include <dl-machine.h>
 #include <libc-lock.h>
 #include <dl-cache.h>
 #include <dl-librecon.h>
@@ -76,7 +72,7 @@ int _dl_bind_not;
 
 /* A dummy link map for the executable, used by dlopen to access the global
    scope.  We don't export any symbols ourselves, so this can be minimal.  */
-static struct link_map _dl_main_map =
+struct link_map _dl_main_map __attribute__((visibility ("hidden"))) =
   {
     .l_name = (char *) "",
     .l_real = &_dl_main_map,
@@ -203,9 +199,7 @@ const ElfW(Ehdr) *_dl_sysinfo_dso;
 
 struct link_map *_dl_sysinfo_map;
 
-# if !ENABLE_STATIC_PIE
-#  include "get-dynamic-info.h"
-# endif
+# include "get-dynamic-info.h"
 #endif
 #include "setup-vdso.h"
 
@@ -308,40 +302,6 @@ _dl_aux_init (ElfW(auxv_t) *av)
 }
 #endif
 
-#if ENABLE_STATIC_PIE
-/* Relocate static executable with PIE.  */
-
-void
-_dl_relocate_static_pie (void)
-{
-# define STATIC_PIE_BOOTSTRAP
-# define BOOTSTRAP_MAP (&_dl_main_map)
-# define RESOLVE_MAP(sym, version, flags) BOOTSTRAP_MAP
-# include "dynamic-link.h"
-
-  /* Figure out the run-time load addres of static PIE.  */
-  _dl_main_map.l_addr = elf_machine_load_address ();
-
-  /* Skip if this is a non-PIE static executable.  */
-  if (!_dl_main_map.l_addr)
-    return;
-
-  /* Read our own dynamic section and fill in the info array.  */
-  _dl_main_map.l_ld = ((void *) _dl_main_map.l_addr
-		       + elf_machine_dynamic ());
-  elf_get_dynamic_info (&_dl_main_map, NULL);
-
-# ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
-  ELF_MACHINE_BEFORE_RTLD_RELOC (_dl_main_map.l_info);
-# endif
-
-  /* Relocate ourselves so we can do normal function calls and
-     data access using the global offset table.  */
-  ELF_DYNAMIC_RELOCATE (&_dl_main_map, 0, 0, 0);
-  _dl_main_map.l_relocated = 1;
-}
-#endif
-
 
 void
 _dl_non_dynamic_init (void)

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=86ffc842702faea44f7b3ebf76fac99bf326fcbc

commit 86ffc842702faea44f7b3ebf76fac99bf326fcbc
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Wed Sep 27 16:47:29 2017 -0700

    Add --enable-static-pie to build-many-glibcs.py

diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py
index 8ce1c6f..013c96d 100755
--- a/scripts/build-many-glibcs.py
+++ b/scripts/build-many-glibcs.py
@@ -1343,6 +1343,7 @@ class Glibc(object):
         cfg_cmd = [os.path.join(srcdir_copy, 'configure'),
                    '--prefix=/usr',
                    '--enable-add-ons',
+                   '--enable-static-pie',
                    '--enable-profile',
                    '--build=%s' % self.ctx.build_triplet,
                    '--host=%s' % self.triplet,

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=a8fd5b03471befddc3cdbed00d7db54298660023

commit a8fd5b03471befddc3cdbed00d7db54298660023
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 16:13:54 2017 -0700

    sparc: Check PIC instead of SHARED in start.S
    
    Since start.o may be compiled as PIC, we should check PIC instead of
    SHARED.
    
    	* sysdeps/sparc/sparc32/start.S (_start): Check PIC instead of
    	SHARED.
    	* sysdeps/sparc/sparc64/start.S (_start): Likewise.

diff --git a/sysdeps/sparc/sparc32/start.S b/sysdeps/sparc/sparc32/start.S
index a06568d..b882d1e 100644
--- a/sysdeps/sparc/sparc32/start.S
+++ b/sysdeps/sparc/sparc32/start.S
@@ -42,7 +42,7 @@
 	.global _start
 	.type _start,#function
 _start:
-#ifdef SHARED
+#ifdef PIC
 	SETUP_PIC_REG(l7)
 #endif
 
@@ -57,7 +57,7 @@ _start:
 	add	%sp, 23*4, %o2
 
   /* Load the addresses of the user entry points.  */
-#ifndef SHARED
+#ifndef PIC
 	sethi	%hi(main), %o0
 	sethi	%hi(__libc_csu_init), %o3
 	sethi	%hi(__libc_csu_fini), %o4
diff --git a/sysdeps/sparc/sparc64/start.S b/sysdeps/sparc/sparc64/start.S
index fcd4721..21d16de 100644
--- a/sysdeps/sparc/sparc64/start.S
+++ b/sysdeps/sparc/sparc64/start.S
@@ -42,7 +42,7 @@
 	.global _start
 	.type _start,#function
 _start:
-#ifdef SHARED
+#ifdef PIC
 	SETUP_PIC_REG(l7)
 #endif
 
@@ -58,7 +58,7 @@ _start:
 	add	%sp, STACK_BIAS+23*8, %o2
 
   /* Load the addresses of the user entry points.  */
-#ifndef SHARED
+#ifndef PIC
 	sethi	%hi(main), %o0
 	sethi	%hi(__libc_csu_init), %o3
 	sethi	%hi(__libc_csu_fini), %o4

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=b4a008a2de115f102d1ea4a62f50ac17bda2692c

commit b4a008a2de115f102d1ea4a62f50ac17bda2692c
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 16:13:22 2017 -0700

    microblaze: Check PIC instead of SHARED in start.S
    
    Since start.o may be compiled as PIC, we should check PIC instead of
    SHARED.
    
    	* sysdeps/microblaze/start.S (_start): Check PIC instead of SHARED.

diff --git a/sysdeps/microblaze/start.S b/sysdeps/microblaze/start.S
index f94e816..d9b13d0 100644
--- a/sysdeps/microblaze/start.S
+++ b/sysdeps/microblaze/start.S
@@ -58,7 +58,7 @@ _start:
     sw      r6,r1,r0
     addik   r7,r1,4
     addik   r1,r1,-24
-#ifdef SHARED
+#ifdef PIC
     /* Setup PIC.  */
     mfs     r20,rpc
     addik   r20,r20,_GLOBAL_OFFSET_TABLE_+8

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=26980a9466847ff15bff60a9a36498da1c7f5d46

commit 26980a9466847ff15bff60a9a36498da1c7f5d46
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 16:12:52 2017 -0700

    m68k: Check PIC instead of SHARED in start.S
    
    Since start.o may be compiled as PIC, we should check PIC instead of
    SHARED.
    
    	* sysdeps/m68k/start.S (_start): Check PIC instead of SHARED.

diff --git a/sysdeps/m68k/start.S b/sysdeps/m68k/start.S
index 71ba3b9..9f5d588 100644
--- a/sysdeps/m68k/start.S
+++ b/sysdeps/m68k/start.S
@@ -76,7 +76,7 @@ _start:
 	pea (%a1)		/* Push address of the shared library
 				   termination function.  */
 
-#ifdef SHARED
+#ifdef PIC
 	/* Load PIC register.  */
 	LOAD_GOT (%a5)
 

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=3c6968d9f5b7b47e1099b090239d6d240b8cad52

commit 3c6968d9f5b7b47e1099b090239d6d240b8cad52
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 16:12:28 2017 -0700

    hppa: Check PIC instead of SHARED in start.S
    
    Since start.o may be compiled as PIC, we should check PIC instead of
    SHARED.
    
    	* sysdeps/hppa/start.S (_start): Check PIC instead of SHARED.

diff --git a/sysdeps/hppa/start.S b/sysdeps/hppa/start.S
index 5db1ba9..c7f5972 100644
--- a/sysdeps/hppa/start.S
+++ b/sysdeps/hppa/start.S
@@ -42,7 +42,7 @@
 	/* Have the linker create plabel words so we get PLABEL32
 	   relocs and not 21/14.  The use of 21/14 relocs is only
 	   supported in the latest dynamic linker.  */
-#ifdef SHARED
+#ifdef PIC
 	.section	.data.rel.ro,"aw",@progbits
 #else
 	.section	.rodata,"a",@progbits
@@ -56,7 +56,7 @@
 	.word P%__libc_csu_fini
 .Lp__libc_csu_init:
 	.word P%__libc_csu_init
-#ifdef SHARED
+#ifdef PIC
 .Lp__global:
 	.word $global$
 #endif
@@ -101,7 +101,7 @@ _start:
 	stw	%r23, -56(%sp)
 	/* Need to setup 1, 4, 5, and 7th arguments */
 
-#ifdef SHARED
+#ifdef PIC
 	/* load main (1st argument) */
 	addil	LT'.Lpmain, %r19
 	ldw	RT'.Lpmain(%r1), %r26
@@ -130,7 +130,7 @@ _start:
 	/* void *stack_end (7th argument) */
 	stw	%sp, -60(%sp)
 
-#ifdef SHARED
+#ifdef PIC
 	/* load global */
 	addil	LT'.Lp__global, %r19
 	ldw	RT'.Lp__global(%r1), %dp

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=9a98e37b67d6a1ae6eb499b0c9dd23b664a1e165

commit 9a98e37b67d6a1ae6eb499b0c9dd23b664a1e165
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 16:11:02 2017 -0700

    aarch64: Check PIC instead of SHARED in start.S
    
    Since start.o may be compiled as PIC, we should check PIC instead of
    SHARED.
    
    	* sysdeps/aarch64/start.S (_start): Check PIC instead of SHARED.

diff --git a/sysdeps/aarch64/start.S b/sysdeps/aarch64/start.S
index c20433a..7a94650 100644
--- a/sysdeps/aarch64/start.S
+++ b/sysdeps/aarch64/start.S
@@ -60,7 +60,7 @@ _start:
 	/* Setup stack limit in argument register */
 	mov	x6, sp
 
-#ifdef SHARED
+#ifdef PIC
         adrp    x0, :got:main
 	ldr     PTR_REG (0), [x0, #:got_lo12:main]
 

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=dfa19eda45eefa5f6b2845f42ef8146cee30828d

commit dfa19eda45eefa5f6b2845f42ef8146cee30828d
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 14:55:18 2017 -0700

    sh: Update elf_machine_load_address for static PIE
    
    When --enable-static-pie is used to configure glibc, we need to use
    _dl_relocate_static_pie to compute load address in static PIE.
    
    	* sysdeps/sh/dl-machine.h (elf_machine_load_address): Use
    	_dl_relocate_static_pie instead of _dl_start to compute load
    	address in static PIE.

diff --git a/sysdeps/sh/dl-machine.h b/sysdeps/sh/dl-machine.h
index 7106afb..cfcc4d9 100644
--- a/sysdeps/sh/dl-machine.h
+++ b/sysdeps/sh/dl-machine.h
@@ -50,6 +50,7 @@ static inline Elf32_Addr __attribute__ ((unused))
 elf_machine_load_address (void)
 {
   Elf32_Addr addr;
+#ifdef SHARED
   asm ("mov.l 1f,r0\n\
 	mov.l 3f,r2\n\
 	add r12,r2\n\
@@ -61,6 +62,19 @@ elf_machine_load_address (void)
 	3: .long _dl_start@GOTOFF\n\
 	2: mov r2,%0"
        : "=r" (addr) : : "r0", "r1", "r2");
+#else
+  asm ("mov.l 1f,r0\n\
+	mov.l 3f,r2\n\
+	add r12,r2\n\
+	mov.l @(r0,r12),r0\n\
+	bra 2f\n\
+	 sub r0,r2\n\
+	.align 2\n\
+	1: .long _dl_relocate_static_pie@GOT\n\
+	3: .long _dl_relocate_static_pie@GOTOFF\n\
+	2: mov r2,%0"
+       : "=r" (addr) : : "r0", "r1", "r2");
+#endif
   return addr;
 }
 

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=761b339e1530aae4fa43d3b5972d6b6d980ced71

commit 761b339e1530aae4fa43d3b5972d6b6d980ced71
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 14:53:06 2017 -0700

    s390: Update elf_machine_load_address for static PIE
    
    When --enable-static-pie is used to configure glibc, we need to use
    _dl_relocate_static_pie to compute load address in static PIE.
    
    	* sysdeps/s390/s390-32/dl-machine.h (elf_machine_dynamic): Use
    	_dl_relocate_static_pie instead of _dl_start to compute load
    	address in static PIE.
    	* sysdeps/s390/s390-64/dl-machine.h (elf_machine_dynamic):
    	Likewise.

diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
index c302c9d..da6817e 100644
--- a/sysdeps/s390/s390-32/dl-machine.h
+++ b/sysdeps/s390/s390-32/dl-machine.h
@@ -70,6 +70,7 @@ elf_machine_load_address (void)
 {
   Elf32_Addr addr;
 
+#ifdef SHARED
   __asm__( "   bras  1,2f\n"
 	   "1: .long _GLOBAL_OFFSET_TABLE_ - 1b\n"
 	   "   .long (_dl_start - 1b - 0x80000000) & 0x00000000ffffffff\n"
@@ -78,6 +79,16 @@ elf_machine_load_address (void)
 	   "   al    1,0(1)\n"
 	   "   sl    %0,_dl_start@GOT(1)"
 	   : "=&d" (addr) : : "1" );
+#else
+  __asm__( "   bras  1,2f\n"
+	   "1: .long _GLOBAL_OFFSET_TABLE_ - 1b\n"
+	   "   .long (_dl_relocate_static_pie - 1b - 0x80000000) & 0x00000000ffffffff\n"
+	   "2: l     %0,4(1)\n"
+	   "   ar    %0,1\n"
+	   "   al    1,0(1)\n"
+	   "   sl    %0,_dl_relocate_static_pie@GOT(1)"
+	   : "=&d" (addr) : : "1" );
+#endif
   return addr;
 }
 
diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h
index 7513520..5ef1c60 100644
--- a/sysdeps/s390/s390-64/dl-machine.h
+++ b/sysdeps/s390/s390-64/dl-machine.h
@@ -63,11 +63,19 @@ elf_machine_load_address (void)
 {
   Elf64_Addr addr;
 
+#ifdef SHARED
   __asm__( "   larl	 %0,_dl_start\n"
 	   "   larl	 1,_GLOBAL_OFFSET_TABLE_\n"
 	   "   lghi	 2,_dl_start@GOT\n"
 	   "   slg	 %0,0(2,1)"
 	   : "=&d" (addr) : : "1", "2" );
+#else
+  __asm__( "   larl	 %0,_dl_relocate_static_pie\n"
+	   "   larl	 1,_GLOBAL_OFFSET_TABLE_\n"
+	   "   lghi	 2,_dl_relocate_static_pie@GOT\n"
+	   "   slg	 %0,0(2,1)"
+	   : "=&d" (addr) : : "1", "2" );
+#endif
   return addr;
 }
 

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=4209ccbd250c858db5972bad8eef985d0e558d02

commit 4209ccbd250c858db5972bad8eef985d0e558d02
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 14:46:26 2017 -0700

    m68k: Update elf_machine_load_address for static PIE
    
    When --enable-static-pie is used to configure glibc, we need to use
    _dl_relocate_static_pie to compute load address in static PIE.
    
    	* sysdeps/m68k/dl-machine.h (elf_machine_load_address): Use
    	_dl_relocate_static_pie instead of _dl_start to compute load
    	address in static PIE.

diff --git a/sysdeps/m68k/dl-machine.h b/sysdeps/m68k/dl-machine.h
index fd8fb00..33a5f76 100644
--- a/sysdeps/m68k/dl-machine.h
+++ b/sysdeps/m68k/dl-machine.h
@@ -51,9 +51,15 @@ static inline Elf32_Addr
 elf_machine_load_address (void)
 {
   Elf32_Addr addr;
+#ifdef SHARED
   asm (PCREL_OP ("lea", "_dl_start", "%0", "%0", "%%pc") "\n\t"
        "sub.l _dl_start@GOT.w(%%a5), %0"
        : "=a" (addr));
+#else
+  asm (PCREL_OP ("lea", "_dl_relocate_static_pie", "%0", "%0", "%%pc") "\n\t"
+       "sub.l _dl_relocate_static_pie@GOT.w(%%a5), %0"
+       : "=a" (addr));
+#endif
   return addr;
 }
 

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=42b7a7665875ae3e8cabd1ab53379357509d490c

commit 42b7a7665875ae3e8cabd1ab53379357509d490c
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 14:36:33 2017 -0700

    aarch64: Update elf_machine_load_address for static PIE
    
    When --enable-static-pie is used to configure glibc, we need to use
    _dl_relocate_static_pie to compute load address in static PIE.
    
    	* sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Use
    	_dl_relocate_static_pie instead of _dl_start to compute load
    	address in static PIE.

diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
index 6047203..b87a817 100644
--- a/sysdeps/aarch64/dl-machine.h
+++ b/sysdeps/aarch64/dl-machine.h
@@ -61,6 +61,7 @@ elf_machine_load_address (void)
   ElfW(Addr) static_addr;
   ElfW(Addr) dynamic_addr;
 
+#ifdef SHARED
   asm ("					\n"
 "	adrp	%1, _dl_start;			\n"
 #ifdef __LP64__
@@ -84,6 +85,31 @@ elf_machine_load_address (void)
 #endif
 "2:						\n"
     : "=r" (static_addr),  "=r" (dynamic_addr));
+#else
+  asm ("						\n"
+"	adrp	%1, _dl_relocate_static_pie;		\n"
+#ifdef __LP64__
+"	add	%1, %1, #:lo12:_dl_relocate_static_pie	\n"
+#else
+"	add	%w1, %w1, #:lo12:_dl_relocate_static_pie\n"
+#endif
+"	ldr	%w0, 1f					\n"
+"	b	2f					\n"
+"1:							\n"
+#ifdef __LP64__
+"	.word	_dl_relocate_static_pie			\n"
+#else
+# ifdef __AARCH64EB__
+"	.short  0                               	\n"
+# endif
+"	.short  _dl_relocate_static_pie                 \n"
+# ifndef __AARCH64EB__
+"	.short  0                               	\n"
+# endif
+#endif
+"2:						\n"
+    : "=r" (static_addr),  "=r" (dynamic_addr));
+#endif
   return dynamic_addr - static_addr;
 }
 

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=c3b2185725b349597a399116010960520097f255

commit c3b2185725b349597a399116010960520097f255
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Aug 22 15:37:10 2017 -0700

    Don't use hidden visibility in libc.a with PIE on i386
    
    On i386, when multi-arch is enabled, all external functions must be
    called via PIC PLT in PIE, which requires setting up EBX register,
    since they may be IFUNC functions.
    
    	* config.h.in (NO_HIDDEN_EXTERN_FUNC_IN_PIE): New.
    	* include/libc-symbols.h (__hidden_proto_hiddenattr): Add check
    	for PIC and NO_HIDDEN_EXTERN_FUNC_IN_PIE.
    	* sysdeps/i386/configure.ac (NO_HIDDEN_EXTERN_FUNC_IN_PIE): New
    	AC_DEFINE if multi-arch is enabled.
    	* sysdeps/i386/configure: Regenerated.

diff --git a/config.h.in b/config.h.in
index 3a7851d..f7db916 100644
--- a/config.h.in
+++ b/config.h.in
@@ -86,6 +86,10 @@
 #undef	PI_STATIC_AND_HIDDEN
 
 /* Define this to disable the 'hidden_proto' et al macros in
+   include/libc-symbols.h that avoid PLT slots in PIE.  */
+#undef  NO_HIDDEN_EXTERN_FUNC_IN_PIE
+
+/* Define this to disable the 'hidden_proto' et al macros in
    include/libc-symbols.h that avoid PLT slots in the shared objects.  */
 #undef	NO_HIDDEN
 
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index e0d4dc3..8726262 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -507,6 +507,7 @@ for linking")
 #else
 # ifndef __ASSEMBLER__
 #  if !defined SHARED && IS_IN (libc) && !defined LIBC_NONSHARED \
+      && (!defined PIC || !defined NO_HIDDEN_EXTERN_FUNC_IN_PIE) \
       && !defined NO_HIDDEN
 #   define __hidden_proto_hiddenattr(attrs...) \
   __attribute__ ((visibility ("hidden"), ##attrs))
diff --git a/sysdeps/i386/configure b/sysdeps/i386/configure
index f0b29a6..90c63ca 100644
--- a/sysdeps/i386/configure
+++ b/sysdeps/i386/configure
@@ -26,7 +26,7 @@ libc_compiler_builtin_inlined=no
 cat > conftest.c <<EOF
 int _start (void) { int a, b, c; __sync_val_compare_and_swap (&a, b, c); return 0; }
 EOF
-if ! { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
+if ! { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
 		     -O0 -nostdlib -nostartfiles
 		     -S conftest.c -o - | fgrep "__sync_val_compare_and_swap"
 		     1>&5'
@@ -112,3 +112,8 @@ fi
 
 $as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h
 
+
+if test x"$multi_arch" != xno; then
+  $as_echo "#define NO_HIDDEN_EXTERN_FUNC_IN_PIE 1" >>confdefs.h
+
+fi
diff --git a/sysdeps/i386/configure.ac b/sysdeps/i386/configure.ac
index 210706e..6d2068d 100644
--- a/sysdeps/i386/configure.ac
+++ b/sysdeps/i386/configure.ac
@@ -71,3 +71,9 @@ fi
 dnl It is always possible to access static and hidden symbols in an
 dnl position independent way.
 AC_DEFINE(PI_STATIC_AND_HIDDEN)
+
+dnl When multi-arch is enabled, all external functions must be called
+dnl via PIC PLT in PIE, which requires setting up EBX register.
+if test x"$multi_arch" != xno; then
+  AC_DEFINE(NO_HIDDEN_EXTERN_FUNC_IN_PIE)
+fi

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=2792d2c0983d9d89569216a4dd5ee5e388c40a40

commit 2792d2c0983d9d89569216a4dd5ee5e388c40a40
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Mon Jul 17 08:17:32 2017 -0700

    Add --enable-static-pie configure option to build static PIE [BZ #19574]
    
    Dynamic linker, ld.so, is a standalone program which can be loaded at
    any address.  This patch adds a configure option, --enable-static-pie,
    to embed the part of ld.so in static executable to create static position
    independent executable (static PIE).  A static PIE is similar to static
    executable, but can be loaded at any address without help from a dynamic
    linker.  When --enable-static-pie is used to configure glibc, libc.a is
    built as PIE and all static executables, including tests, are built as
    static PIE.  The resulting libc.a can be used together with GCC 8 or
    above to build static PIE with the compiler option, -static-pie.  But
    GCC 8 isn't required to build glibc with --enable-static-pie.  When an
    older GCC is used to build glibc with --enable-static-pie, proper input
    files are passed to linker to create static executables as static PIE,
    together with "-z text" to prevent dynamic relocations in read-only
    segments, which are allowed in static PIE.
    
    Static PIE can work on all architectures which support PIE, provided
    
    1. Target must support accessing of local functions without dynamic
    relocations, which is needed in start.S to call __libc_start_main with
    function addresses of __libc_csu_init, __libc_csu_fini and main.  All
    functions in statice PIE are local functions.
    2. start.S is updated to check PIC instead SHARED for PIC code path and
    avoid dynamic relocation, when PIC is defined and SHARED isn't defined,
    to support static PIE.  Patches are submitted for aarch64, arm, hppa,
    m68k, microblaze and sparc.
    3. All assembly codes are updated check PIC instead SHARED for PIC code
    path to avoid dynamic relocations in read-only sections.
    4. All assembly codes are updated check SHARED instead PIC for static
    symbol name.  A patch is submitted for tile.
    5. elf_machine_load_address in dl-machine.h are updated to support static
    PIE.  Patches are submitted for aarch64, arm, hppa, ia64, m68k, microblaze,
    mips, nios2, powerpc, s390, sh, sparc and tile.
    
    NB: When glibc is built with GCC defaulted to PIE, libc.a is compiled
    with -fPIE, regardless if --enable-static-pie is used to configure glibc.
    When glibc is configured with --enable-static-pie, libc.a is compiled
    with -fPIE, regardless wether GCC defaults to PIE or not.  The same libc.a
    can be used to build both static executable and static PIE.  There is no
    need for separate PIE copy of libc.a.
    
    Linker requirements to build glibc with --enable-static-pie:
    
    1. Linker supports --no-dynamic-linker to remove PT_INTERP segment from
    static PIE.
    2. Linker can create working static PIE.  The x86-64 linker needs the
    fix for
    
    https://sourceware.org/bugzilla/show_bug.cgi?id=21782
    
    The i386 linker needs to be able to convert "movl main@GOT(%ebx), %eax"
    to "leal main@GOTOFF(%ebx), %eax" if main is defined locally.
    
    Binutils 2.29 or above are OK for i686 and x86-64.  But linker status for
    other targets need to be verified.
    
    Tested on i686 and x86-64.
    
    Build results of build-many-glibcs.py with --enable-static-pie with all
    patches for static PIE applied are
    
    PASS: glibcs-aarch64_be-linux-gnu build
    PASS: glibcs-aarch64-linux-gnu build
    PASS: glibcs-armeb-linux-gnueabi build
    PASS: glibcs-armeb-linux-gnueabi-be8 build
    PASS: glibcs-armeb-linux-gnueabihf build
    PASS: glibcs-armeb-linux-gnueabihf-be8 build
    PASS: glibcs-arm-linux-gnueabi build
    PASS: glibcs-arm-linux-gnueabihf build
    PASS: glibcs-hppa-linux-gnu build
    PASS: glibcs-i486-linux-gnu build
    PASS: glibcs-i586-linux-gnu build
    PASS: glibcs-i686-linux-gnu build
    PASS: glibcs-i686-linux-gnu-disable-multi-arch build
    PASS: glibcs-m68k-linux-gnu build
    PASS: glibcs-microblazeel-linux-gnu build
    PASS: glibcs-microblaze-linux-gnu build
    PASS: glibcs-mips64el-linux-gnu-n64 build
    PASS: glibcs-mips64el-linux-gnu-n64-nan2008 build
    PASS: glibcs-mips64el-linux-gnu-n64-nan2008-soft build
    PASS: glibcs-mips64el-linux-gnu-n64-soft build
    PASS: glibcs-mips64-linux-gnu-n64 build
    PASS: glibcs-mips64-linux-gnu-n64-nan2008 build
    PASS: glibcs-mips64-linux-gnu-n64-nan2008-soft build
    PASS: glibcs-mips64-linux-gnu-n64-soft build
    PASS: glibcs-nios2-linux-gnu build
    PASS: glibcs-powerpc64le-linux-gnu build
    PASS: glibcs-powerpc64-linux-gnu build
    PASS: glibcs-s390x-linux-gnu build
    PASS: glibcs-x86_64-linux-gnu build
    PASS: glibcs-x86_64-linux-gnu-disable-multi-arch build
    PASS: glibcs-x86_64-linux-gnu-x32 build
    
    FAIL: glibcs-alpha-linux-gnu build
    
    elf/sln is failed to link due to:
    
    assertion fail bfd/elf64-alpha.c:4125
    
    This is caused by linker bug and/or non-PIC code in PIE libc.a.
    
    FAIL: glibcs-ia64-linux-gnu build
    
    elf/sln is failed to link due to:
    
    libc.a(sched_yield.o): non-pic code with imm relocation against dynamic symbol `_dl_sysinfo'
    
    This is caused by non-PIC version of DO_CALL macro in ia64 sysdep.h.  PIE
    libc.a should use PIC version of DO_CALL, except during startup in static
    PIE.  An ia64 startup.h, similar to i386 startup.h, is needed to handle
    this.
    
    FAIL: glibcs-mips64el-linux-gnu-n32 build
    FAIL: glibcs-mips64el-linux-gnu-n32-nan2008 build
    FAIL: glibcs-mips64el-linux-gnu-n32-nan2008-soft build
    FAIL: glibcs-mips64el-linux-gnu-n32-soft build
    FAIL: glibcs-mips64-linux-gnu-n32 build
    FAIL: glibcs-mips64-linux-gnu-n32-nan2008 build
    FAIL: glibcs-mips64-linux-gnu-n32-nan2008-soft build
    FAIL: glibcs-mips64-linux-gnu-n32-soft build
    FAIL: glibcs-mipsel-linux-gnu build
    FAIL: glibcs-mipsel-linux-gnu-nan2008 build
    FAIL: glibcs-mipsel-linux-gnu-nan2008-soft build
    FAIL: glibcs-mipsel-linux-gnu-soft build
    FAIL: glibcs-mips-linux-gnu build
    FAIL: glibcs-mips-linux-gnu-nan2008 build
    FAIL: glibcs-mips-linux-gnu-nan2008-soft build
    FAIL: glibcs-mips-linux-gnu-soft build
    
    elf/sln is failed to link due to:
    
    crt1.o: relocation R_MIPS_HI16 against `_gp' can not be used when making a shared object; recompile with -fPIC
    
    This is caused by linker bug and/or non-PIC code in crt1.o.
    
    FAIL: glibcs-powerpc-linux-gnu build
    FAIL: glibcs-powerpc-linux-gnu-soft build
    FAIL: glibcs-powerpc-linux-gnuspe build
    FAIL: glibcs-powerpc-linux-gnuspe-e500v1 build
    
    elf/sln is failed to link due to:
    
    ld: read-only segment has dynamic relocations.
    
    This is caused by linker bug and/or non-PIC code in PIE libc.a.
    
    FAIL: glibcs-powerpc-linux-gnu-power4 build
    
    elf/sln is failed to link due to:
    
    findlocale.c:96:(.text+0x22c): @local call to ifunc memchr
    
    This is caused by linker bug and/or non-PIC code in PIE libc.a.
    
    FAIL: glibcs-s390-linux-gnu build
    
    elf/sln is failed to link due to:
    
    collect2: fatal error: ld terminated with signal 11 [Segmentation fault], core dumped
    
    assertion fail bfd/elflink.c:14242
    
    This is caused by linker bug and/or non-PIC code in PIE libc.a.
    
    FAIL: glibcs-sh3eb-linux-gnu build
    FAIL: glibcs-sh3-linux-gnu build
    FAIL: glibcs-sh4eb-linux-gnu build
    FAIL: glibcs-sh4eb-linux-gnu-soft build
    FAIL: glibcs-sh4-linux-gnu build
    FAIL: glibcs-sh4-linux-gnu-soft build
    
    elf/sln is failed to link due to:
    
    ld: read-only segment has dynamic relocations.
    
    This is caused by linker bug and/or non-PIC code in PIE libc.a.
    
    FAIL: glibcs-sparc64-linux-gnu build
    FAIL: glibcs-sparcv9-linux-gnu build
    
    elf/sln is failed to link due to:
    
    ld: read-only segment has dynamic relocations.
    
    This is caused by linker bug and/or non-PIC code in PIE libc.a.
    
    FAIL: glibcs-tilegxbe-linux-gnu build
    FAIL: glibcs-tilegxbe-linux-gnu-32 build
    FAIL: glibcs-tilegx-linux-gnu build
    FAIL: glibcs-tilegx-linux-gnu-32 build
    FAIL: glibcs-tilepro-linux-gnu build
    
    elf/sln is failed to link due to:
    
    ld: read-only segment has dynamic relocations.
    
    This is caused by linker bug and/or non-PIC code in PIE libc.a.
    
    	[BZ #19574]
    	* INSTALL: Regenerated.
    	* Makeconfig (pic-default): Updated for --enable-static-pie.
    	(pie-default): New for --enable-static-pie.
    	(default-pie-ldflag): Likewise.
    	(+link-static-before-libc): Add $(default-pie-ldflag).
    	(+prectorT): Updated for --enable-static-pie.
    	(+postctorT): Likewise.
    	(CFLAGS-.o): Add $(pie-default).
    	(CFLAGS-.op): Likewise.
    	* NEWS: Mention --enable-static-pie.
    	* config.h.in (ENABLE_STATIC_PIE): New.
    	* configure.ac (--enable-static-pie): New configure option.
    	(have-no-dynamic-linker): New LIBC_CONFIG_VAR.
    	(have-static-pie): Likewise.
    	Enable static PIE if linker supports --no-dynamic-linker.
    	(ENABLE_STATIC_PIE): New AC_DEFINE.
    	(enable-static-pie): New LIBC_CONFIG_VAR.
    	* configure: Regenerated.
    	* csu/libc-start.c (LIBC_START_MAIN): Call _dl_relocate_static_pie
    	in libc.a.
    	* csu/libc-tls.c (__libc_setup_tls): Add main_map->l_addr to
    	initimage.
    	* elf/dl-support.c: Include "dynamic-link.h" and don't include
    	"get-dynamic-info.h" for --enable-static-pie.
    	(_dl_relocate_static_pie): New function for --enable-static-pie.
    	(STATIC_PIE_BOOTSTRAP): New for --enable-static-pie.
    	(BOOTSTRAP_MAP): Likewise.
    	(RESOLVE_MAP): Likewise.
    	* elf/dynamic-link.h (ELF_DURING_STARTUP): Also check
    	STATIC_PIE_BOOTSTRAP.
    	* elf/get-dynamic-info.h (elf_get_dynamic_info): Likewise.
    	* manual/install.texi: Document --enable-static-pie.
    	* sysdeps/generic/ldsodefs.h (_dl_relocate_static_pie): New.
    	* sysdeps/i386/configure.ac: Check if linker supports static PIE.
    	* sysdeps/x86_64/configure.ac: Likewise.
    	* sysdeps/i386/configure: Regenerated.
    	* sysdeps/x86_64/configure: Likewise.

diff --git a/INSTALL b/INSTALL
index 4d9024c..55361a0 100644
--- a/INSTALL
+++ b/INSTALL
@@ -106,6 +106,14 @@ will be used, and CFLAGS sets optimization options for the compiler.
      systems support shared libraries; you need ELF support and
      (currently) the GNU linker.
 
+'--enable-static-pie'
+     Build static executables, including tests, as position independent
+     executable (static PIE) which is similar to static executable, but
+     can be loaded at any address without help from a dynamic linker.
+     The resulting libc.a can be used with the GCC option, -static-pie,
+     which is available with GCC 8 or above, to create static PIE. Only
+     i686, x86-64 and x32 targets are verified to work.
+
 '--disable-profile'
      Don't build libraries with profiling information.  You may want to
      use this option if you don't plan to do profiling.
diff --git a/Makeconfig b/Makeconfig
index 0ceff92..3d57f1c 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -386,6 +386,16 @@ LDFLAGS.so += $(hashstyle-LDFLAGS)
 LDFLAGS-rtld += $(hashstyle-LDFLAGS)
 endif
 
+ifeq (yes,$(enable-static-pie))
+pic-default = -DPIC
+pie-default = $(pie-ccflag)
+ifeq (yes,$(have-static-pie))
+default-pie-ldflag = -static-pie
+else
+default-pie-ldflag = -Wl,-pie,--no-dynamic-linker,--eh-frame-hdr,-z,text
+endif
+endif
+
 # If lazy relocations are disabled, add the -z now flag.  Use
 # LDFLAGS-lib.so instead of LDFLAGS.so, to avoid adding the flag to
 # test modules.
@@ -435,7 +445,7 @@ endif
 # Command for statically linking programs with the C library.
 ifndef +link-static
 +link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
-	      $(DEFAULT-LDFLAGS-$(@F)) \
+	      $(firstword $(DEFAULT-LDFLAGS-$(@F)) $(default-pie-ldflag)) \
 	      $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F))  \
 	      $(addprefix $(csu-objpfx),$(static-start-installed-name)) \
 	      $(+preinit) $(+prectorT) \
@@ -652,8 +662,13 @@ endif
 +prectorS = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtbeginS.o`
 +postctorS = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtendS.o`
 # Variants of the two previous definitions for statically linking programs.
+ifeq (yes,$(enable-static-pie))
++prectorT = $(+prectorS)
++postctorT = $(+postctorS)
+else
 +prectorT = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtbeginT.o`
 +postctorT = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtend.o`
+endif
 csu-objpfx = $(common-objpfx)csu/
 elf-objpfx = $(common-objpfx)elf/
 
@@ -974,7 +989,7 @@ libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
 all-object-suffixes := .o .os .oS
 object-suffixes :=
 CPPFLAGS-.o = $(pic-default)
-CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
+CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) $(pie-default)
 libtype.o := lib%.a
 object-suffixes += .o
 ifeq (yes,$(build-shared))
@@ -999,7 +1014,7 @@ ifeq (yes,$(build-profile))
 all-object-suffixes += .op
 object-suffixes += .op
 CPPFLAGS-.op = -DPROF $(pic-default)
-CFLAGS-.op = -pg
+CFLAGS-.op = -pg $(pie-default)
 libtype.op = lib%_p.a
 endif
 
diff --git a/NEWS b/NEWS
index f582141..60f5def 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,12 @@ Version 2.27
 
 Major new features:
 
+* Add --enable-static-pie configure option to build static PIE.  The
+  resulting libc.a can be used with the GCC option, -static-pie, which
+  is available with GCC 8 or above, to create static position independent
+  executable (static PIE).  Only i686, x86-64 and x32 targets are verified
+  to work.
+
 * Optimized x86-64 asin, atan2, exp, expf, log, pow, atan, sin and tan
   with FMA, contributed by Arjan van de Ven and H.J. Lu from Intel.
 
diff --git a/config.h.in b/config.h.in
index 0d38476..3a7851d 100644
--- a/config.h.in
+++ b/config.h.in
@@ -240,6 +240,9 @@
 /* Build glibc with tunables support.  */
 #define HAVE_TUNABLES 0
 
+/* Define if static PIE is enabled.  */
+#define ENABLE_STATIC_PIE 0
+
 /* Some compiler options may now allow to use ebp in __asm__ (used mainly
    in i386 6 argument syscall issue).  */
 #define CAN_USE_REGISTER_ASM_EBP 0
diff --git a/configure b/configure
index 067d92d..cd5cf57 100755
--- a/configure
+++ b/configure
@@ -767,6 +767,7 @@ with_default_link
 enable_sanity_checks
 enable_shared
 enable_profile
+enable_static_pie
 enable_timezone_tools
 enable_hardcoded_path_in_tests
 enable_stackguard_randomization
@@ -1424,6 +1425,7 @@ Optional Features:
                           in special situations) [default=yes]
   --enable-shared         build shared library [default=yes if GNU ld]
   --enable-profile        build profiled library [default=no]
+  --enable-static-pie     build static executables as PIE [default=no]
   --disable-timezone-tools
                           do not install timezone tools [default=install]
   --enable-hardcoded-path-in-tests
@@ -3372,6 +3374,13 @@ else
   profile=no
 fi
 
+# Check whether --enable-static-pie was given.
+if test "${enable_static_pie+set}" = set; then :
+  enableval=$enable_static_pie; static_pie=$enableval
+else
+  static_pie=no
+fi
+
 # Check whether --enable-timezone-tools was given.
 if test "${enable_timezone_tools+set}" = set; then :
   enableval=$enable_timezone_tools; enable_timezone_tools=$enableval
@@ -5994,6 +6003,62 @@ fi
 $as_echo "$libc_linker_feature" >&6; }
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports --no-dynamic-linker" >&5
+$as_echo_n "checking for linker that supports --no-dynamic-linker... " >&6; }
+libc_linker_feature=no
+if test x"$gnu_ld" = x"yes"; then
+  libc_linker_check=`$LD -v --help 2>/dev/null | grep "\--no-dynamic-linker"`
+  if test -n "$libc_linker_check"; then
+    cat > conftest.c <<EOF
+int _start (void) { return 42; }
+EOF
+    if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
+				-Wl,--no-dynamic-linker -nostdlib -nostartfiles
+				-fPIC -shared -o conftest.so conftest.c
+				1>&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+    then
+      libc_linker_feature=yes
+    fi
+    rm -f conftest*
+  fi
+fi
+if test $libc_linker_feature = yes; then
+  libc_cv_no_dynamic_linker=yes
+else
+  libc_cv_no_dynamic_linker=no
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
+$as_echo "$libc_linker_feature" >&6; }
+config_vars="$config_vars
+have-no-dynamic-linker = $libc_cv_no_dynamic_linker"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -static-pie" >&5
+$as_echo_n "checking for -static-pie... " >&6; }
+if ${libc_cv_static_pie+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if { ac_try='${CC-cc} -static-pie -xc /dev/null -S -o /dev/null'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  libc_cv_static_pie=yes
+else
+  libc_cv_static_pie=no
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_static_pie" >&5
+$as_echo "$libc_cv_static_pie" >&6; }
+config_vars="$config_vars
+have-static-pie = $libc_cv_static_pie"
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fpie" >&5
 $as_echo_n "checking for -fpie... " >&6; }
 if ${libc_cv_fpie+:} false; then :
@@ -6888,6 +6953,19 @@ fi
 $as_echo "$libc_cv_pie_default" >&6; }
 
 
+if test "$static_pie" = yes; then
+  # The linker must support --no-dynamic-linker.
+  if test "$libc_cv_no_dynamic_linker" != yes; then
+    as_fn_error $? "linker support for --no-dynamic-linker needed" "$LINENO" 5
+  fi
+  # Default to PIE.
+  libc_cv_pie_default=yes
+  $as_echo "#define ENABLE_STATIC_PIE 1" >>confdefs.h
+
+fi
+config_vars="$config_vars
+enable-static-pie = $static_pie"
+
 
 
 
diff --git a/configure.ac b/configure.ac
index d412104..09e1c7f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -176,6 +176,11 @@ AC_ARG_ENABLE([profile],
 			     [build profiled library @<:@default=no@:>@]),
 	      [profile=$enableval],
 	      [profile=no])
+AC_ARG_ENABLE([static-pie],
+	      AC_HELP_STRING([--enable-static-pie],
+			     [build static executables as PIE @<:@default=no@:>@]),
+	      [static_pie=$enableval],
+	      [static_pie=no])
 AC_ARG_ENABLE([timezone-tools],
 	      AC_HELP_STRING([--disable-timezone-tools],
 			     [do not install timezone tools @<:@default=install@:>@]),
@@ -1460,6 +1465,19 @@ LIBC_LINKER_FEATURE([-z execstack], [-Wl,-z,execstack],
 		    [libc_cv_z_execstack=yes], [libc_cv_z_execstack=no])
 AC_SUBST(libc_cv_z_execstack)
 
+LIBC_LINKER_FEATURE([--no-dynamic-linker],
+		    [-Wl,--no-dynamic-linker],
+		    [libc_cv_no_dynamic_linker=yes],
+		    [libc_cv_no_dynamic_linker=no])
+LIBC_CONFIG_VAR([have-no-dynamic-linker], [$libc_cv_no_dynamic_linker])
+
+AC_CACHE_CHECK(for -static-pie, libc_cv_static_pie, [dnl
+LIBC_TRY_CC_OPTION([-static-pie],
+		   [libc_cv_static_pie=yes],
+		   [libc_cv_static_pie=no])
+])
+LIBC_CONFIG_VAR([have-static-pie], [$libc_cv_static_pie])
+
 AC_CACHE_CHECK(for -fpie, libc_cv_fpie, [dnl
 LIBC_TRY_CC_OPTION([-fpie], [libc_cv_fpie=yes], [libc_cv_fpie=no])
 ])
@@ -1962,6 +1980,17 @@ fi
 rm -f conftest.*])
 AC_SUBST(libc_cv_pie_default)
 
+if test "$static_pie" = yes; then
+  # The linker must support --no-dynamic-linker.
+  if test "$libc_cv_no_dynamic_linker" != yes; then
+    AC_MSG_ERROR([linker support for --no-dynamic-linker needed])
+  fi
+  # Default to PIE.
+  libc_cv_pie_default=yes
+  AC_DEFINE(ENABLE_STATIC_PIE)
+fi
+LIBC_CONFIG_VAR([enable-static-pie], [$static_pie])
+
 AC_SUBST(profile)
 AC_SUBST(static_nss)
 
diff --git a/csu/libc-start.c b/csu/libc-start.c
index 24c63be..34dd125 100644
--- a/csu/libc-start.c
+++ b/csu/libc-start.c
@@ -141,6 +141,8 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
   __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up;
 
 #ifndef SHARED
+  _dl_relocate_static_pie ();
+
   char **ev = &argv[argc + 1];
 
   __environ = ev;
diff --git a/csu/libc-tls.c b/csu/libc-tls.c
index 00138eb..1f8ddaf 100644
--- a/csu/libc-tls.c
+++ b/csu/libc-tls.c
@@ -114,6 +114,8 @@ __libc_setup_tls (void)
   size_t tcb_offset;
   const ElfW(Phdr) *phdr;
 
+  struct link_map *main_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
+
   /* Look through the TLS segment if there is any.  */
   if (_dl_phdr != NULL)
     for (phdr = _dl_phdr; phdr < &_dl_phdr[_dl_phnum]; ++phdr)
@@ -122,7 +124,7 @@ __libc_setup_tls (void)
 	  /* Remember the values we need.  */
 	  memsz = phdr->p_memsz;
 	  filesz = phdr->p_filesz;
-	  initimage = (void *) phdr->p_vaddr;
+	  initimage = (void *) phdr->p_vaddr + main_map->l_addr;
 	  align = phdr->p_align;
 	  if (phdr->p_align > max_align)
 	    max_align = phdr->p_align;
@@ -163,8 +165,6 @@ __libc_setup_tls (void)
   _dl_static_dtv[0].counter = (sizeof (_dl_static_dtv) / sizeof (_dl_static_dtv[0])) - 2;
   // _dl_static_dtv[1].counter = 0;		would be needed if not already done
 
-  struct link_map *main_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
-
   /* Initialize the TLS block.  */
 #if TLS_TCB_AT_TP
   _dl_static_dtv[2].pointer.val = ((char *) tlsblock + tcb_offset
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 5e3de90..150ec00 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -26,7 +26,11 @@
 #include <sys/param.h>
 #include <stdint.h>
 #include <ldsodefs.h>
-#include <dl-machine.h>
+#if ENABLE_STATIC_PIE
+# include "dynamic-link.h"
+#else
+# include <dl-machine.h>
+#endif
 #include <libc-lock.h>
 #include <dl-cache.h>
 #include <dl-librecon.h>
@@ -199,7 +203,9 @@ const ElfW(Ehdr) *_dl_sysinfo_dso;
 
 struct link_map *_dl_sysinfo_map;
 
-# include "get-dynamic-info.h"
+# if !ENABLE_STATIC_PIE
+#  include "get-dynamic-info.h"
+# endif
 #endif
 #include "setup-vdso.h"
 
@@ -302,6 +308,40 @@ _dl_aux_init (ElfW(auxv_t) *av)
 }
 #endif
 
+#if ENABLE_STATIC_PIE
+/* Relocate static executable with PIE.  */
+
+void
+_dl_relocate_static_pie (void)
+{
+# define STATIC_PIE_BOOTSTRAP
+# define BOOTSTRAP_MAP (&_dl_main_map)
+# define RESOLVE_MAP(sym, version, flags) BOOTSTRAP_MAP
+# include "dynamic-link.h"
+
+  /* Figure out the run-time load addres of static PIE.  */
+  _dl_main_map.l_addr = elf_machine_load_address ();
+
+  /* Skip if this is a non-PIE static executable.  */
+  if (!_dl_main_map.l_addr)
+    return;
+
+  /* Read our own dynamic section and fill in the info array.  */
+  _dl_main_map.l_ld = ((void *) _dl_main_map.l_addr
+		       + elf_machine_dynamic ());
+  elf_get_dynamic_info (&_dl_main_map, NULL);
+
+# ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
+  ELF_MACHINE_BEFORE_RTLD_RELOC (_dl_main_map.l_info);
+# endif
+
+  /* Relocate ourselves so we can do normal function calls and
+     data access using the global offset table.  */
+  ELF_DYNAMIC_RELOCATE (&_dl_main_map, 0, 0, 0);
+  _dl_main_map.l_relocated = 1;
+}
+#endif
+
 
 void
 _dl_non_dynamic_init (void)
diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h
index ebea756..6278649 100644
--- a/elf/dynamic-link.h
+++ b/elf/dynamic-link.h
@@ -94,7 +94,7 @@ elf_machine_lazy_rel (struct link_map *map,
 
 #ifdef RESOLVE_MAP
 
-# ifdef RTLD_BOOTSTRAP
+# if defined RTLD_BOOTSTRAP || defined STATIC_PIE_BOOTSTRAP
 #  define ELF_DURING_STARTUP (1)
 # else
 #  define ELF_DURING_STARTUP (0)
diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h
index 7525c3a..eb26d23 100644
--- a/elf/get-dynamic-info.h
+++ b/elf/get-dynamic-info.h
@@ -38,7 +38,7 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
   typedef Elf64_Xword d_tag_utype;
 #endif
 
-#ifndef RTLD_BOOTSTRAP
+#if !defined RTLD_BOOTSTRAP && !defined STATIC_PIE_BOOTSTRAP
   if (dyn == NULL)
     return;
 #endif
@@ -139,9 +139,11 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
   /* Only the bind now flags are allowed.  */
   assert (info[VERSYMIDX (DT_FLAGS_1)] == NULL
 	  || (info[VERSYMIDX (DT_FLAGS_1)]->d_un.d_val & ~DF_1_NOW) == 0);
+  /* Flags must not be set for ld.so.  */
   assert (info[DT_FLAGS] == NULL
 	  || (info[DT_FLAGS]->d_un.d_val & ~DF_BIND_NOW) == 0);
-  /* Flags must not be set for ld.so.  */
+#endif
+#if defined RTLD_BOOTSTRAP || defined STATIC_PIE_BOOTSTRAP
   assert (info[DT_RUNPATH] == NULL);
   assert (info[DT_RPATH] == NULL);
 #else
diff --git a/manual/install.texi b/manual/install.texi
index 35948b1..54df6ab 100644
--- a/manual/install.texi
+++ b/manual/install.texi
@@ -136,6 +136,14 @@ Don't build shared libraries even if it is possible.  Not all systems
 support shared libraries; you need ELF support and (currently) the GNU
 linker.
 
+@item --enable-static-pie
+Build static executables, including tests, as position independent
+executable (static PIE) which is similar to static executable, but can
+be loaded at any address without help from a dynamic linker.  The
+resulting libc.a can be used with the GCC option, -static-pie, which
+is available with GCC 8 or above, to create static PIE.  Only i686, x86-64
+and x32 targets are verified to work.
+
 @item --disable-profile
 Don't build libraries with profiling information.  You may want to use
 this option if you don't plan to do profiling.
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 5efae2d..dbcc1ec 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -1048,6 +1048,13 @@ extern void _dl_determine_tlsoffset (void) attribute_hidden;
    stack protector, among other things).  */
 void __libc_setup_tls (void);
 
+# if ENABLE_STATIC_PIE
+/* Relocate static executable with PIE.  */
+void _dl_relocate_static_pie (void) attribute_hidden;
+# else
+#  define _dl_relocate_static_pie()
+# endif
+
 /* Initialization of libpthread for statically linked applications.
    If libpthread is not linked in, this is an empty function.  */
 void __pthread_initialize_minimal (void) weak_function;
diff --git a/sysdeps/i386/configure b/sysdeps/i386/configure
index 4d6685f..f0b29a6 100644
--- a/sysdeps/i386/configure
+++ b/sysdeps/i386/configure
@@ -50,6 +50,39 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_compiler_builtin_inlined" >&5
 $as_echo "$libc_compiler_builtin_inlined" >&6; }
 
+if test "$static_pie" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker static PIE support" >&5
+$as_echo_n "checking for linker static PIE support... " >&6; }
+if ${libc_cv_ld_static_pie+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.s <<\EOF
+	.text
+	.global _start
+_start:
+	movl	_start@GOT(%ebx), %eax
+EOF
+  libc_cv_pie_option="-Wl,-pie"
+  libc_cv_ld_static_pie=no
+  if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostartfiles -nostdlib $no_ssp $libc_cv_pie_option -o conftest conftest.s 1>&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    if $READELF -r conftest | grep 'There are no relocations in this file.' > /dev/null; then
+      libc_cv_ld_static_pie=yes
+    fi
+  fi
+rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ld_static_pie" >&5
+$as_echo "$libc_cv_ld_static_pie" >&6; }
+  if test "$libc_cv_ld_static_pie" != yes; then
+    as_fn_error $? "linker support for static PIE needed" "$LINENO" 5
+  fi
+fi
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Intel MPX support" >&5
 $as_echo_n "checking for Intel MPX support... " >&6; }
 if ${libc_cv_asm_mpx+:} false; then :
diff --git a/sysdeps/i386/configure.ac b/sysdeps/i386/configure.ac
index f7766ad..210706e 100644
--- a/sysdeps/i386/configure.ac
+++ b/sysdeps/i386/configure.ac
@@ -30,6 +30,29 @@ LIBC_COMPILER_BUILTIN_INLINED(
 *** Please use host i786, i686, i586, or i486.
 *** For example: /source/glibc/configure CFLAGS='-O2 -march=i686' ...])])
 
+dnl Check if linker can convert "movl main@GOT(%ebx), %eax" to
+dnl "leal main@GOTOFF(%ebx), %eax" for static PIE.
+if test "$static_pie" = yes; then
+  AC_CACHE_CHECK(for linker static PIE support, libc_cv_ld_static_pie, [dnl
+cat > conftest.s <<\EOF
+	.text
+	.global _start
+_start:
+	movl	_start@GOT(%ebx), %eax
+EOF
+  libc_cv_pie_option="-Wl,-pie"
+  libc_cv_ld_static_pie=no
+  if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostartfiles -nostdlib $no_ssp $libc_cv_pie_option -o conftest conftest.s 1>&AS_MESSAGE_LOG_FD); then
+    if $READELF -r conftest | grep 'There are no relocations in this file.' > /dev/null; then
+      libc_cv_ld_static_pie=yes
+    fi
+  fi
+rm -f conftest*])
+  if test "$libc_cv_ld_static_pie" != yes; then
+    AC_MSG_ERROR([linker support for static PIE needed])
+  fi
+fi
+
 dnl Check whether asm supports Intel MPX
 AC_CACHE_CHECK(for Intel MPX support, libc_cv_asm_mpx, [dnl
 cat > conftest.s <<\EOF
diff --git a/sysdeps/x86_64/configure b/sysdeps/x86_64/configure
index efef46b..8674d14 100644
--- a/sysdeps/x86_64/configure
+++ b/sysdeps/x86_64/configure
@@ -85,6 +85,39 @@ if test x"$build_mathvec" = xnotset; then
   build_mathvec=yes
 fi
 
+if test "$static_pie" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker static PIE support" >&5
+$as_echo_n "checking for linker static PIE support... " >&6; }
+if ${libc_cv_ld_static_pie+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.s <<\EOF
+	.text
+	.global _start
+	.weak foo
+_start:
+	leaq	foo(%rip), %rax
+EOF
+  libc_cv_pie_option="-Wl,-pie"
+  if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostartfiles -nostdlib $no_ssp $libc_cv_pie_option -o conftest conftest.s 1>&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    libc_cv_ld_static_pie=yes
+  else
+    libc_cv_ld_static_pie=no
+  fi
+rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ld_static_pie" >&5
+$as_echo "$libc_cv_ld_static_pie" >&6; }
+  if test "$libc_cv_ld_static_pie" != yes; then
+    as_fn_error $? "linker support for static PIE needed" "$LINENO" 5
+  fi
+fi
+
 $as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h
 
 
diff --git a/sysdeps/x86_64/configure.ac b/sysdeps/x86_64/configure.ac
index fa86e95..b7d2c01 100644
--- a/sysdeps/x86_64/configure.ac
+++ b/sysdeps/x86_64/configure.ac
@@ -44,6 +44,31 @@ if test x"$build_mathvec" = xnotset; then
   build_mathvec=yes
 fi
 
+dnl Check if linker supports static PIE with the fix for
+dnl
+dnl https://sourceware.org/bugzilla/show_bug.cgi?id=21782
+dnl
+if test "$static_pie" = yes; then
+  AC_CACHE_CHECK(for linker static PIE support, libc_cv_ld_static_pie, [dnl
+cat > conftest.s <<\EOF
+	.text
+	.global _start
+	.weak foo
+_start:
+	leaq	foo(%rip), %rax
+EOF
+  libc_cv_pie_option="-Wl,-pie"
+  if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostartfiles -nostdlib $no_ssp $libc_cv_pie_option -o conftest conftest.s 1>&AS_MESSAGE_LOG_FD); then
+    libc_cv_ld_static_pie=yes
+  else
+    libc_cv_ld_static_pie=no
+  fi
+rm -f conftest*])
+  if test "$libc_cv_ld_static_pie" != yes; then
+    AC_MSG_ERROR([linker support for static PIE needed])
+  fi
+fi
+
 dnl It is always possible to access static and hidden symbols in an
 dnl position independent way.
 AC_DEFINE(PI_STATIC_AND_HIDDEN)

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=4d73532f5636be52b6445be9d0a2eafee5f4ba24

commit 4d73532f5636be52b6445be9d0a2eafee5f4ba24
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 3 06:54:54 2017 -0700

    i386: Use "movl main@GOT(%ebx), %eax" in start.S
    
    Don't use "leal main@GOTOFF(%ebx), %eax" since main may be in a
    shared object.  Linker will convert "movl main@GOT(%ebx), %eax"
    to "leal main@GOTOFF(%ebx), %eax" if main is defined locally.
    
    	* sysdeps/i386/start.S: Replace "leal main@GOT(%ebx), %eax" with
    	"movl main@GOTOFF(%ebx), %eax".

diff --git a/sysdeps/i386/start.S b/sysdeps/i386/start.S
index 375a93c..916fcd2 100644
--- a/sysdeps/i386/start.S
+++ b/sysdeps/i386/start.S
@@ -99,8 +99,11 @@ _start:
 	pushl main@GOT(%ebx)
 # else
 	/* Avoid relocation in static PIE since _start is called before
-	   it is relocated.  */
-	leal main@GOTOFF(%ebx), %eax
+	   it is relocated.  Don't use "leal main@GOTOFF(%ebx), %eax"
+	   since main may be in a shared object.  Linker will convert
+	   "movl main@GOT(%ebx), %eax" to "leal main@GOTOFF(%ebx), %eax"
+	   if main is defined locally.  */
+	movl main@GOT(%ebx), %eax
 	pushl %eax
 # endif
 

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=6e0cd13bf81411f222810240328aa03b2313a966

commit 6e0cd13bf81411f222810240328aa03b2313a966
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 3 06:48:11 2017 -0700

    Add a test for main () in a shared object
    
    Verify that crt1.o can be used with main () in a shared object.
    
    	* elf/Makefile (tests): Add tst-main1.
    	(modules-names): Add tst-main1mod.
    	($(objpfx)tst-main1): New.
    	(CRT-tst-main1): Likewise.
    	(LDFLAGS-tst-main1): Likewise.
    	(LDLIBS-tst-main1): Likewise.
    	(tst-main1mod.so-no-z-defs): Likewise.
    	* elf/tst-main1.c: New file.
    	* elf/tst-main1mod.c: Likewise.

diff --git a/elf/Makefile b/elf/Makefile
index 06e2e4c..8043cdd 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -185,7 +185,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
 	 tst-tlsalign tst-tlsalign-extern tst-nodelete-opened \
 	 tst-nodelete2 tst-audit11 tst-audit12 tst-dlsym-error tst-noload \
 	 tst-latepthread tst-tls-manydynamic tst-nodelete-dlclose \
-	 tst-debug1
+	 tst-debug1 tst-main1
 #	 reldep9
 tests-internal += loadtest unload unload2 circleload1 \
 	 neededtest neededtest2 neededtest3 neededtest4 \
@@ -269,7 +269,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
 		tst-audit11mod1 tst-audit11mod2 tst-auditmod11 \
 		tst-audit12mod1 tst-audit12mod2 tst-audit12mod3 tst-auditmod12 \
 		tst-latepthreadmod $(tst-tls-many-dynamic-modules) \
-		tst-nodelete-dlclose-dso tst-nodelete-dlclose-plugin
+		tst-nodelete-dlclose-dso tst-nodelete-dlclose-plugin \
+		tst-main1mod
 ifeq (yes,$(have-mtls-dialect-gnu2))
 tests += tst-gnu2-tls1
 modules-names += tst-gnu2-tls1mod
@@ -1427,3 +1428,9 @@ $(objpfx)tst-debug1.out: $(objpfx)tst-debug1mod1.so
 
 $(objpfx)tst-debug1mod1.so: $(objpfx)testobj1.so
 	$(OBJCOPY) --only-keep-debug $< $@
+
+$(objpfx)tst-main1: $(objpfx)tst-main1mod.so
+CRT-tst-main1 := $(csu-objpfx)crt1.o
+LDFLAGS-tst-main1 = $(no-pie-ldflag)
+LDLIBS-tst-main1 = $(libsupport)
+tst-main1mod.so-no-z-defs = yes
diff --git a/elf/tst-main1.c b/elf/tst-main1.c
new file mode 100644
index 0000000..1285ea2
--- /dev/null
+++ b/elf/tst-main1.c
@@ -0,0 +1,19 @@
+/* Unit test for main () in a shared object.
+   Copyright (C) 2017 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/>.  */
+
+/* This is empty.  */
diff --git a/elf/tst-main1mod.c b/elf/tst-main1mod.c
new file mode 100644
index 0000000..edbeaaf
--- /dev/null
+++ b/elf/tst-main1mod.c
@@ -0,0 +1,25 @@
+/* Unit test for main () in a shared object.
+   Copyright (C) 2017 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/>.  */
+
+static int
+do_test (void)
+{
+  return 0;
+}
+
+#include <support/test-driver.c>

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=42bbc3513379917d1760a7f60e347cc91b565fb9

commit 42bbc3513379917d1760a7f60e347cc91b565fb9
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 3 14:35:52 2017 -0700

    Revert x86: Allow undefined _DYNAMIC in static executable
    
    This code is used in non-PIE static executable and static PIE.  It checks
    if _DYNAMIC is undefined before using it to compute load address.  But
    not all targets can convert access _DYNAMIC via GOT, which needs dynamic
    relocation, to PC-relative at link-time.
    
    	* sysdeps/i386/dl-machine.h (elf_machine_load_address): Don't
    	allow undefined _DYNAMIC in PIE libc.a.
    	* sysdeps/x86_64/dl-machine.h (elf_machine_load_address):
    	Likewse.

diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
index 242c692..2e17eba 100644
--- a/sysdeps/i386/dl-machine.h
+++ b/sysdeps/i386/dl-machine.h
@@ -54,15 +54,8 @@ elf_machine_load_address (void)
   /* Compute the difference between the runtime address of _DYNAMIC as seen
      by a GOTOFF reference, and the link-time address found in the special
      unrelocated first GOT entry.  */
-#ifndef SHARED
-  extern Elf32_Dyn _DYNAMIC[] __attribute__((weak, visibility ("hidden")));
-  if (!_DYNAMIC)
-    return 0;
-#endif
-  /* The address of dynamic must be taken as non-weak to avoid dynamic
-     relocation.  */
-  extern Elf32_Dyn dynamic[] asm ("_DYNAMIC") attribute_hidden;
-  return (Elf32_Addr) &dynamic - elf_machine_dynamic ();
+  extern Elf32_Dyn bygotoff[] asm ("_DYNAMIC") attribute_hidden;
+  return (Elf32_Addr) &bygotoff - elf_machine_dynamic ();
 }
 
 /* Set up the loaded object described by L so its unrelocated PLT
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
index a79e5ca..6a04cbc 100644
--- a/sysdeps/x86_64/dl-machine.h
+++ b/sysdeps/x86_64/dl-machine.h
@@ -55,15 +55,8 @@ elf_machine_load_address (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.  */
-#ifndef SHARED
-  extern ElfW(Dyn) _DYNAMIC[] __attribute__((weak, visibility ("hidden")));
-  if (!_DYNAMIC)
-    return 0;
-#endif
-  /* The address of dynamic must be taken as non-weak to avoid dynamic
-     relocation.  */
-  extern ElfW(Dyn) dynamic[] asm ("_DYNAMIC") attribute_hidden;
-  return (ElfW(Addr)) &dynamic - elf_machine_dynamic ();
+  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
+  return (ElfW(Addr)) &_DYNAMIC - elf_machine_dynamic ();
 }
 
 /* Set up the loaded object described by L so its unrelocated PLT

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=6f3ce7fc4381fa522634755950d36ef870dc594e

commit 6f3ce7fc4381fa522634755950d36ef870dc594e
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 3 15:40:34 2017 -0700

    mips: Don't check _DYNAMIC in elf_machine_load_address
    
    Since mips can't convert access _DYNAMIC via GOT, which needs dynamic
    relocation, to PC-relative at link-time, don't check _DYNAMIC in
    elf_machine_load_address.
    
            * sysdeps/mips/dl-machine.h (elf_machine_load_address): Don't
            check _DYNAMIC.

diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h
index b4fee49..da9d633 100644
--- a/sysdeps/mips/dl-machine.h
+++ b/sysdeps/mips/dl-machine.h
@@ -147,11 +147,6 @@ elf_machine_dynamic (void)
 static inline ElfW(Addr)
 elf_machine_load_address (void)
 {
-#ifndef SHARED
-  extern ElfW(Dyn) _DYNAMIC[] __attribute__((weak, visibility ("hidden")));
-  if (!_DYNAMIC)
-    return 0;
-#endif
   ElfW(Addr) addr;
 #ifndef __mips16
   asm ("	.set noreorder\n"

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=0bf96e84ef82eba764b729c6946b482d8b8a839f

commit 0bf96e84ef82eba764b729c6946b482d8b8a839f
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 3 15:36:22 2017 -0700

    arm: Don't check _DYNAMIC in elf_machine_load_address
    
    Since arm can't convert access _DYNAMIC via GOT, which needs dynamic
    relocation, to PC-relative at link-time, don't check _DYNAMIC in
    elf_machine_load_address.
    
            * sysdeps/arm/dl-machine.h (elf_machine_load_address): Don't
            check _DYNAMIC.

diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
index efe2e1b..7e2d73e 100644
--- a/sysdeps/arm/dl-machine.h
+++ b/sysdeps/arm/dl-machine.h
@@ -59,9 +59,6 @@ elf_machine_load_address (void)
   Elf32_Addr got_addr = (Elf32_Addr) &__dl_start;
   asm ("adr %0, _dl_start" : "=r" (pcrel_addr));
 #else
-  extern Elf32_Dyn _DYNAMIC[] __attribute__((weak, visibility ("hidden")));
-  if (!_DYNAMIC)
-    return 0;
   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;

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=4ff3d69aa407f815c1ddc3623ae045dde55f2b7f

commit 4ff3d69aa407f815c1ddc3623ae045dde55f2b7f
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 3 15:02:19 2017 -0700

    Use $(DEFAULT-LDFLAGS-$(@F)) in +link-static-before-libc
    
    Use $(LDFLAGS-$(@F)) with tst-tls1-static-non-pie may not be sufficient
    when static PIE is built by default.  Use $(DEFAULT-LDFLAGS-$(@F)) in
    +link-static-before-libc to make sure that tst-tls1-static-non-pie is
    always built as non-PIE static executable.
    
    	* Makeconfig (+link-static-before-libc): Use
    	$(DEFAULT-LDFLAGS-$(@F)).
    	* elf/Makefile (LDFLAGS-tst-tls1-static-non-pie): Renamed to ...
    	(DEFAULT-LDFLAGS-tst-tls1-static-non-pie): This.

diff --git a/Makeconfig b/Makeconfig
index b51904b..0ceff92 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -435,6 +435,7 @@ endif
 # Command for statically linking programs with the C library.
 ifndef +link-static
 +link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
+	      $(DEFAULT-LDFLAGS-$(@F)) \
 	      $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F))  \
 	      $(addprefix $(csu-objpfx),$(static-start-installed-name)) \
 	      $(+preinit) $(+prectorT) \
diff --git a/elf/Makefile b/elf/Makefile
index c6edebd..06e2e4c 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -152,7 +152,7 @@ tests-static-internal := tst-tls1-static tst-tls2-static \
 	       tst-ptrguard1-static tst-stackguard1-static \
 	       tst-tls1-static-non-pie
 
-LDFLAGS-tst-tls1-static-non-pie = $(no-pie-ldflag)
+DEFAULT-LDFLAGS-tst-tls1-static-non-pie = $(no-pie-ldflag)
 
 tests := tst-tls9 tst-leaks1 \
 	tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 \

-----------------------------------------------------------------------


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]