This is the mail archive of the mailing list for the glibc project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] 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.

Any comments or objections?

	* 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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]