فهرست منبع

Preliminary PIE support for powerpc, i386 was used as template.
Requested by Peter Mazinger. Testing wanted.

Joakim Tjernlund 22 سال پیش
والد
کامیت
c9a8697e5b
2فایلهای تغییر یافته به همراه26 افزوده شده و 3 حذف شده
  1. 10 0
      libc/sysdeps/linux/powerpc/Makefile
  2. 16 3
      libc/sysdeps/linux/powerpc/crt0.S

+ 10 - 0
libc/sysdeps/linux/powerpc/Makefile

@@ -22,6 +22,9 @@ ASFLAGS=$(CFLAGS)
 
 CRT0_SRC = crt0.S
 CRT0_OBJ = crt0.o crt1.o
+ifeq ($(strip $(UCLIBC_PIE_SUPPORT)),y)
+CRT0_OBJ += Scrt0.o Scrt1.o
+endif
 CRT0_DEPS=gmon-start.S
 CTOR_TARGETS=$(TOPDIR)lib/crti.o $(TOPDIR)lib/crtn.o
 
@@ -41,6 +44,13 @@ $(LIBC): ar-target
 ar-target: $(OBJS) $(CRT0_OBJ) $(CTOR_TARGETS)
 	$(AR) $(ARFLAGS) $(LIBC) $(OBJS)
 	cp $(CRT0_OBJ) $(TOPDIR)lib/
+ifeq ($(strip $(UCLIBC_PIE_SUPPORT)),y)
+ifeq ($(strip $(UCLIBC_CTOR_DTOR)),y)
+	$(RM) $(TOPDIR)lib/Scrt0.o
+else
+	mv $(TOPDIR)lib/Scrt0.o $(TOPDIR)lib/Scrt1.o
+endif
+endif
 
 $(CRT0_OBJ): $(CRT0_SRC)
 	$(CC) $(CFLAGS) -DL_$* $< -c -o $*.o

+ 16 - 3
libc/sysdeps/linux/powerpc/crt0.S

@@ -35,7 +35,7 @@
 	.section ".text"
 	.globl	_start
 	.type	_start,@function
-#if defined L_crt0 || ! defined __UCLIBC_CTOR_DTOR__
+#if defined L_crt0 || L_Scrt0 || ! defined __UCLIBC_CTOR_DTOR__
 	.type	__uClibc_main,%function
 #else
 	.weak	_init
@@ -66,16 +66,29 @@ _start:
 	addi	r5,r5,1
 	rlwinm	r5,r5,2,0,29
 	add	r5,r5,r4
-
+#if defined L_Scrt0 || defined L_Scrt1
+	bl	_GLOBAL_OFFSET_TABLE_-4@local
+	mflr	r31
+#endif
 	/* Ok, now run uClibc's main() -- shouldn't return */
-#if (defined L_crt1) && defined __UCLIBC_CTOR_DTOR__
+#if (defined L_crt1 || defined L_Scrt1) && defined __UCLIBC_CTOR_DTOR__
+# ifdef L_Scrt1
+	lwz	r6,_init@got(r31)
+	lwz	r7,_fini@got(r31)
+	bl	__uClibc_start_main@plt
+# else
 	lis     r6,_init@ha	# load top 16 bits
 	addi    r6,r6,_init@l	# load bottom 16 bits
 	lis     r7,_fini@ha	# load top 16 bits of &msg
 	addi    r7,r7,_fini@l	# load bottom 16 bits
 	bl	__uClibc_start_main
+# endif
 #else
+# ifdef L_Scrt0
+	bl	__uClibc_main@plt
+# else
 	bl	__uClibc_main
+# endif
 #endif
 .size _start,.-_start