diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-08-04 12:59:35 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-08-04 12:59:51 -0700 |
commit | 1e8e527dd9718eaebe8417b73befb0c821b7b327 (patch) | |
tree | 408997f8dd08bcb0d541baf1ce39ff31d3a490bf | |
parent | e13daad7ac81968e9aaa4a87497f898bb15f4ef8 (diff) | |
download | glibc-1e8e527dd9718eaebe8417b73befb0c821b7b327.tar.gz glibc-1e8e527dd9718eaebe8417b73befb0c821b7b327.tar.xz glibc-1e8e527dd9718eaebe8417b73befb0c821b7b327.zip |
i386: Support static PIE in start.S
Since start.o may be compiled as PIC, we should check PIC instead of SHARED. Also avoid dynamic relocation against main in static PIE since _start is the entry point before the executable is relocated. * sysdeps/i386/start.S (_start): Check Check PIC instead of SHARED. Avoid dynamic relocation against main in static PIE.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | sysdeps/i386/start.S | 11 |
2 files changed, 14 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index 8291f6e05b..acfcdcc2ee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2017-08-04 H.J. Lu <hongjiu.lu@intel.com> + * sysdeps/i386/start.S (_start): Check Check PIC instead of + SHARED. Avoid dynamic relocation against main in static PIE. + +2017-08-04 H.J. Lu <hongjiu.lu@intel.com> + [BZ #21815] * elf/Makefile (CFLAGS-tst-prelink.c): New. (LDFLAGS-tst-prelink): Likewise. diff --git a/sysdeps/i386/start.S b/sysdeps/i386/start.S index ccb1e2b38f..375a93c15a 100644 --- a/sysdeps/i386/start.S +++ b/sysdeps/i386/start.S @@ -81,7 +81,7 @@ _start: pushl %edx /* Push address of the shared library termination function. */ -#ifdef SHARED +#ifdef PIC /* Load PIC register. */ call 1f addl $_GLOBAL_OFFSET_TABLE_, %ebx @@ -95,7 +95,14 @@ _start: pushl %ecx /* Push second argument: argv. */ pushl %esi /* Push first argument: argc. */ +# ifdef SHARED pushl main@GOT(%ebx) +# else + /* Avoid relocation in static PIE since _start is called before + it is relocated. */ + leal main@GOTOFF(%ebx), %eax + pushl %eax +# endif /* Call the user's main function, and exit with its value. But let the libc call main. */ @@ -117,7 +124,7 @@ _start: hlt /* Crash if somehow `exit' does return. */ -#ifdef SHARED +#ifdef PIC 1: movl (%esp), %ebx ret #endif |