about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ports/ChangeLog.m68k4
-rw-r--r--ports/sysdeps/m68k/start.S21
2 files changed, 25 insertions, 0 deletions
diff --git a/ports/ChangeLog.m68k b/ports/ChangeLog.m68k
index 4f933c6f92..5bcd94541b 100644
--- a/ports/ChangeLog.m68k
+++ b/ports/ChangeLog.m68k
@@ -1,3 +1,7 @@
+2013-10-08  Andreas Schwab  <schwab@suse.de>
+
+	* sysdeps/m68k/start.S [SHARED]: Use PIC.
+
 2013-09-20  Andreas Schwab  <schwab@linux-m68k.org>
 
 	* sysdeps/m68k/ffs.c (__ffs): Define as hidden.
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.  */