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.
This commit is contained in:
H.J. Lu 2017-08-04 12:59:35 -07:00
parent e13daad7ac
commit 1e8e527dd9
2 changed files with 14 additions and 2 deletions

View File

@ -1,3 +1,8 @@
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]

View File

@ -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