diff mbox

i386: Support static PIE in start.S

Message ID 20170802173332.GA13135@gmail.com
State New
Headers show

Commit Message

H.J. Lu Aug. 2, 2017, 5:33 p.m. UTC
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?

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(-)

Comments

H.J. Lu Aug. 4, 2017, 1:20 p.m. UTC | #1
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 mbox

Patch

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