i386: Support static PIE in start.S
Commit Message
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
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
>
@@ -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