Message ID | 20170802173332.GA13135@gmail.com |
---|---|
State | New |
Headers | show |
On Wed, Aug 2, 2017 at 10:33 AM, H.J. Lu <hongjiu.lu@intel.com> wrote: > 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. > > Any comments or objections? I am checking it in today. > H.J. > --- > * sysdeps/i386/start.S (_start): Check Check PIC instead of > SHARED. Avoid dynamic relocation against main. > --- > sysdeps/i386/start.S | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > 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 > -- > 2.13.3 >
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