about summary refs log tree commit diff
path: root/ports/sysdeps/m68k
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@suse.de>2013-10-08 20:59:47 +0200
committerAndreas Schwab <schwab@suse.de>2013-10-08 21:02:23 +0200
commited4c99394440533818babac9b8ba602e666ded7c (patch)
treed296aadbcdfb915854d57ff6f590bae781fc1511 /ports/sysdeps/m68k
parente7044ea76bd95f8adc0eab0b2bdcab7f51055b48 (diff)
downloadglibc-ed4c99394440533818babac9b8ba602e666ded7c.tar.gz
glibc-ed4c99394440533818babac9b8ba602e666ded7c.tar.xz
glibc-ed4c99394440533818babac9b8ba602e666ded7c.zip
m68k: use PIC for Scrt1.o
Diffstat (limited to 'ports/sysdeps/m68k')
-rw-r--r--ports/sysdeps/m68k/start.S21
1 files changed, 21 insertions, 0 deletions
diff --git a/ports/sysdeps/m68k/start.S b/ports/sysdeps/m68k/start.S
index a09896fdc0..7ed96cf910 100644
--- a/ports/sysdeps/m68k/start.S
+++ b/ports/sysdeps/m68k/start.S
@@ -52,6 +52,8 @@
 					NULL
 */
 
+#include <sysdep.h>
+
 	.text
 	.globl _start
 	.type _start,@function
@@ -74,6 +76,24 @@ _start:
 	pea (%a1)		/* Push address of the shared library
 				   termination function.  */
 
+#ifdef SHARED
+	/* Load PIC register.  */
+	LOAD_GOT (%a5)
+
+	/* Push the address of our own entry points to `.fini' and
+	   `.init'.  */
+	move.l __libc_csu_fini@GOT(%a5), -(%sp)
+	move.l __libc_csu_init@GOT(%a5), -(%sp)
+
+	pea (%a0)		/* Push second argument: argv.  */
+	move.l %d0, -(%sp)	/* Push first argument: argc.  */
+
+	move.l main@GOT(%a5), -(%sp)
+
+	/* Call the user's main function, and exit with its value.  But
+	   let the libc call main.  */
+	jbsr __libc_start_main@PLT
+#else
 	/* Push the address of our own entry points to `.fini' and
 	   `.init'.  */
 	pea __libc_csu_fini
@@ -87,6 +107,7 @@ _start:
 	/* Call the user's main function, and exit with its value.  But
 	   let the libc call main.  */
 	jbsr __libc_start_main
+#endif
 
 	illegal			/* Crash if somehow `exit' does return.  */