[uClibc] was initfini, crt[in].S changes and ET_DYN

Peter S. Mazinger ps.m at gmx.net
Sat Nov 15 15:17:57 UTC 2003


On 14 Nov 2003, Ned Ludd wrote:

> The uClibc-0.9.23-pax.patch goes in clean as a bird.
> However after adding the support for the startup file provided by the 
> PaX Team and doing a make defconfig which enables profiling I'm getting
> a conflicting label for .L1 My question for you guys is it safe to
> rename this label to .L0 or some other name for our needs?
> 
> Initial secondary patch in the works to be added after the PaX patch
> http://dev.gentoo.org/~solar/pax/uClibc-0.9.23-etdyn.diff
This is my version of the patch. It builds both versions (w/ CTOR_DTOR 
and w/o), but installs only one as crt1S.o (this will be used in the gcc 
specs-file). Also interp.c is generic for all archs, so I installed it 
into common (please correct if it is the unproper place for it). crt0S.S 
could be probably stripped down to remove all the unneeded weak ... 's.
The idea is not to change the original crt0.S file, install another one 
as for glibc (if you modify the original one, you won't have the 
possibility not using it). In this case the gcc specs-file will decide 
about usage (for gentoo the hcc configuration).
The only changes to the PaX version are L1->L0 (thanks Ned) and the 
DL_crt[01]->DL_crt[01]S for building them.
I have also attached the diff between the original crt0.S and the newly 
created crt0S.S one.

Erik,
I had to disable profiling in crt0S.S, because it introduces 
unrelocatable code (TEXTREL) into libc. (I never enabled PROFILING until 
now, so I didn't found it earlier when I reported TEXTREL problems)
After solving this, the comments at the end of crt0S.S can be removed.

Peter

-- 
Peter S. Mazinger <ps.m at gmx.net>   ID: 0xA5F059F2    NIC: IXUYHSKQLI
Key fingerprint = 92A4 31E1 56BC 3D5A 2D08  BB6E C389 975E A5F0 59F2

____________________________________________________________________
Miert fizetsz az internetert? Korlatlan, ingyenes internet hozzaferes a FreeStarttol.
Probald ki most! http://www.freestart.hu
-------------- next part --------------
--- crt0.S	Tue Mar  4 08:05:33 2003
+++ crt0S.S	Sat Nov 15 16:11:38 2003
@@ -18,6 +18,7 @@
 
 
 /*  Based on the code from GNU libc, but hacked up by John Beppu and Erik Andersen */
+/*  crt0.S adapted by Pax Team for ET_DYN binaries */
 
 /*
     When we enter this piece of code, the program stack looks like this:
@@ -37,7 +38,7 @@
 
 	.global	_start
 	.type	_start,%function
-#if defined L_crt0 || ! defined __UCLIBC_CTOR_DTOR__
+#if defined L_crt0S || ! defined __UCLIBC_CTOR_DTOR__
 	.type	__uClibc_main,%function
 #else
 	.weak	_init
@@ -74,10 +75,15 @@
 	pushl %ebp      /* callers %ebp (frame pointer) */
 	movl %esp,%ebp  /* mark callers stack frame as invalid */
 
-#if (defined L_crt1 || defined L_gcrt1 ) && defined __UCLIBC_CTOR_DTOR__
+	call .L0
+.L0:
+	pop %edx
+	addl $_GLOBAL_OFFSET_TABLE_+[.-.L0],%edx
+
+#if (defined L_crt1S || defined L_gcrt1 ) && defined __UCLIBC_CTOR_DTOR__
 	/* Push .init and .fini arguments to __uClibc_start_main() on the stack */
-	pushl $_fini
-	pushl $_init
+	pushl _fini at GOT(%edx)
+	pushl _init at GOT(%edx)
 
 	/* Push envp, argc, and argc arguments to __uClibc_start_main() on the stack */ 
 	pushl %eax	/* Environment pointer */
@@ -85,22 +91,27 @@
 	pushl %ecx	/* And the argument count */
 
 	/* Ok, now run uClibc's main() -- shouldn't return */
-	call __uClibc_start_main
+	pushl .hlt at GOT(%edx)
+	pushl __uClibc_start_main at GOT(%edx)
+	ret
 #else
 	/* Push envp, argc, and argc arguments to __uClibc_start_main() on the stack */ 
 	pushl %eax	/* Environment pointer */
 	pushl %ebx	/* Argument pointer */
 	pushl %ecx	/* And the argument count */
 
-	call __uClibc_main
+	pushl .hlt at GOT(%edx)
+	pushl __uClibc_main at GOT(%edx)
+	ret
 #endif
 
 	/* Crash if somehow `exit' returns anyways.  */
+.hlt:
 	hlt
 .size _start,.-_start
 
-
+/*
 #if defined L_gcrt1 && defined __UCLIBC_PROFILING__
 # include "./gmon-start.S"
 #endif
-
+*/
-------------- next part --------------
--- uClibc-0.9.23/libc/sysdeps/linux/common/Makefile.mps	2003-11-15 13:48:47.000000000 +0100
+++ uClibc-0.9.23/libc/sysdeps/linux/common/Makefile	2003-11-15 14:00:39.000000000 +0100
@@ -38,9 +38,12 @@
 MSRC=syscalls.c
 MOBJ=$(shell ./list_syscalls.sh)
 
+INTERPSRC=interp.c
+INTERPOBJ=interp.o
+
 OBJ=$(COBJS) $(MOBJ)
 
-all: $(STR_SYSCALLS) $(OBJ) $(LIBC)
+all: $(STR_SYSCALLS) $(OBJ) $(LIBC) $(INTERPOBJ)
 
 $(LIBC): ar-target
 
@@ -51,7 +54,7 @@
 	$(CC) $(CFLAGS) -DL_$* $< -c -o $*.o
 	$(STRIPTOOL) -x -R .note -R .comment $*.o
 
-$(COBJS): %.o : %.c
+$(COBJS) $(INTERPOBJ): %.o : %.c
 	$(CC) $(CFLAGS) -c $< -o $@
 	$(STRIPTOOL) -x -R .note -R .comment $*.o
 
--- uClibc-0.9.23/libc/sysdeps/linux/common/interp.c.mps	2003-11-15 13:55:15.000000000 +0100
+++ uClibc-0.9.23/libc/sysdeps/linux/common/interp.c	2003-11-15 13:55:46.000000000 +0100
@@ -0,0 +1,4 @@
+#include <features.h>
+#ifdef __SHARED_LIB_LOADER_PREFIX__
+const char __invoke_dynamic_linker__[] __attribute__ ((section (".interp"))) = __SHARED_LIB_LOADER_PREFIX__"/ld-uClibc.so.0";
+#endif
--- uClibc-0.9.23/libc/sysdeps/linux/i386/Makefile.mps	2003-11-15 11:41:33.000000000 +0100
+++ uClibc-0.9.23/libc/sysdeps/linux/i386/Makefile	2003-11-15 14:07:28.000000000 +0100
@@ -25,6 +25,9 @@
 CRT0_DEPS=gmon-start.S
 CTOR_TARGETS=$(TOPDIR)lib/crti.o $(TOPDIR)lib/crtn.o
 
+CRT0S_SRC = crt0S.S
+CRT0S_OBJ = crt0S.o crt1S.o
+
 SSRC=__longjmp.S vfork.S clone.S setjmp.S bsd-setjmp.S \
 	bsd-_setjmp.S syscall.S mmap64.S
 ifeq ($(strip $(UCLIBC_PROFILING)),y)
@@ -49,14 +52,24 @@
 
 $(LIBC): ar-target 
 
-ar-target: $(OBJS) $(CRT0_OBJ) $(CTOR_TARGETS)
+ar-target: $(OBJS) $(CRT0_OBJ) $(CTOR_TARGETS) $(CRT0S_OBJ) ../common/interp.o
 	$(AR) $(ARFLAGS) $(LIBC) $(OBJS)
 	cp $(CRT0_OBJ) $(TOPDIR)lib/
+ifneq ($(strip $(UCLIBC_CTOR_DTOR)),y)
+	cp crt0S.o $(TOPDIR)lib/crt1S.o
+else
+	cp crt1S.o $(TOPDIR)lib/
+endif
+	cp ../common/interp.o $(TOPDIR)lib/
 
 $(CRT0_OBJ): $(CRT0_SRC)
 	$(CC) $(CFLAGS) -DL_$* $< -c -o $*.o
 	$(STRIPTOOL) -x -R .note -R .comment $*.o
 
+$(CRT0S_OBJ): $(CRT0S_SRC)
+	$(CC) $(CFLAGS) -fPIC -DL_$* $< -c -o $*.o
+	$(STRIPTOOL) -x -R .note -R .comment $*.o
+
 $(SOBJS): %.o : %.S
 	$(CC) $(CFLAGS) -c $< -o $@
 	$(STRIPTOOL) -x -R .note -R .comment $*.o
--- uClibc-0.9.23/libc/sysdeps/linux/i386/crt0S.S.mps	2003-11-15 11:41:39.000000000 +0100
+++ uClibc-0.9.23/libc/sysdeps/linux/i386/crt0S.S	2003-11-15 13:45:12.000000000 +0100
@@ -0,0 +1,117 @@
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+
+/*  Based on the code from GNU libc, but hacked up by John Beppu and Erik Andersen */
+/*  crt0.S adapted by Pax Team for ET_DYN binaries */
+
+/*
+    When we enter this piece of code, the program stack looks like this:
+        argc            argument counter (integer)
+        argv[0]         program name (pointer)
+        argv[1...N]     program args (pointers)
+        argv[argc-1]    end of args (integer)
+	NULL
+        env[0...N]      environment variables (pointers)
+        NULL
+*/
+
+#include <features.h>
+
+.text
+	.align 4
+
+	.global	_start
+	.type	_start,%function
+#if defined L_crt0S || ! defined __UCLIBC_CTOR_DTOR__
+	.type	__uClibc_main,%function
+#else
+	.weak	_init
+	.weak	_fini
+	.type	__uClibc_start_main,%function
+#endif
+/* Stick in a dummy reference to main(), so that if an application
+ * is linking when the main() function is in a static library (.a)
+ * we can be sure that main() actually gets linked in */
+	.type	main,%function
+
+_start:
+	/* locate the start of the environment variables */
+	popl %ecx	/* Store argc into %ecx */
+	movl %esp,%ebx  /* Store argv into ebx */
+	movl %esp,%eax  /* Store argv into eax as well*/
+	movl %ecx,%edx	/* Stick argc into %edx so we can do some math in a sec */
+	leal 4(%eax,%edx,4),%eax
+
+	/*  [ register layout ]
+
+	    sizeof(char*) == 4
+	    %ecx = argc	    ; 0(esp)
+	    %ebx = argv	    ; 4(esp)
+	    %eax = env	    ; argv + (argc * 4) + 4
+	*/
+
+	/* Set up an invalid (NULL return address, NULL frame pointer)
+	   callers stack frame so anybody unrolling the stack knows where
+	   to stop */
+	xorl %ebp,%ebp  /* NULL */
+	pushl %ebp      /* callers %cs */
+	pushl %ebp      /* callers %eip (return address) */
+	pushl %ebp      /* callers %ebp (frame pointer) */
+	movl %esp,%ebp  /* mark callers stack frame as invalid */
+
+	call .L0
+.L0:
+	pop %edx
+	addl $_GLOBAL_OFFSET_TABLE_+[.-.L0],%edx
+
+#if (defined L_crt1S || defined L_gcrt1 ) && defined __UCLIBC_CTOR_DTOR__
+	/* Push .init and .fini arguments to __uClibc_start_main() on the stack */
+	pushl _fini at GOT(%edx)
+	pushl _init at GOT(%edx)
+
+	/* Push envp, argc, and argc arguments to __uClibc_start_main() on the stack */ 
+	pushl %eax	/* Environment pointer */
+	pushl %ebx	/* Argument pointer */
+	pushl %ecx	/* And the argument count */
+
+	/* Ok, now run uClibc's main() -- shouldn't return */
+	pushl .hlt at GOT(%edx)
+	pushl __uClibc_start_main at GOT(%edx)
+	ret
+#else
+	/* Push envp, argc, and argc arguments to __uClibc_start_main() on the stack */ 
+	pushl %eax	/* Environment pointer */
+	pushl %ebx	/* Argument pointer */
+	pushl %ecx	/* And the argument count */
+
+	pushl .hlt at GOT(%edx)
+	pushl __uClibc_main at GOT(%edx)
+	ret
+#endif
+
+	/* Crash if somehow `exit' returns anyways.  */
+.hlt:
+	hlt
+.size _start,.-_start
+
+/*
+#if defined L_gcrt1 && defined __UCLIBC_PROFILING__
+# include "./gmon-start.S"
+#endif
+*/


More information about the uClibc mailing list