[uClibc-cvs] CVS uClibc/libc/sysdeps/linux/arm

CVS User andersen andersen at codepoet.org
Sun Dec 12 05:02:43 UTC 2004


Update of /var/cvs/uClibc/libc/sysdeps/linux/arm
In directory nail:/tmp/cvs-serv12169/libc/sysdeps/linux/arm

Modified Files:
	crt0.S 
Log Message:
Patch from Paul Brook:

The Arm crt0.S contains non-PIC code for locating _init and _fini sections.
This caused problems on my uclinux system when static constructors were
enabled.

The attached patch implements a PIC version of this code.

Paul



--- /var/cvs/uClibc/libc/sysdeps/linux/arm/crt0.S	2004/08/21 21:19:23	1.23
+++ /var/cvs/uClibc/libc/sysdeps/linux/arm/crt0.S	2004/12/12 05:02:43	1.24
@@ -93,11 +93,22 @@
 #endif
 
 #if (defined L_crt1 ) && defined __UCLIBC_CTOR_DTOR__
+#ifdef __PIC__
+	/* Store the address of _init in r3 as an argument to main() */
+	adr r5, .L_init
+	ldr r3, .L_init
+	add r3, r3, r5
+
+	/* Push _fini onto the stack as the final argument to main() */
+	ldr r4, .L_init + 4
+	add r4, r4, r5
+#else
 	/* Store the address of _init in r3 as an argument to main() */
 	ldr r3, =_init
 
 	/* Push _fini onto the stack as the final argument to main() */
 	ldr r4, =_fini
+#endif
 	stmfd sp!, {r4}
 
 	/* Ok, now run uClibc's main() -- shouldn't return */
@@ -109,6 +120,12 @@
 	/* Crash if somehow `exit' returns anyways.  */
 	bl abort
 
+#if (defined L_crt1 ) && defined __UCLIBC_CTOR_DTOR__ && defined __PIC__
+.L_init:
+	.word _init - .L_init
+	.word _fini - .L_init
+#endif
+
 /* We need this stuff to make gdb behave itself, otherwise
    gdb will chokes with SIGILL when trying to debug apps.
 */



More information about the uClibc-cvs mailing list