Parcourir la source

Revert stdio to initializing itself. Not quite a pretty but that ensures that
we don't blow up by using too much stack space, and simplifies the job of
supporting new architectures, since they don't have to mess with calling foo
init functions in crt0 and cleaning up the resulting damage.
-Erik

Eric Andersen il y a 25 ans
Parent
commit
411597d4f4

+ 34 - 1
libc/stdio/stdio.c

@@ -121,9 +121,16 @@ void __stdio_close_all(void)
 
 void __init_stdio(void)
 {
+	static int stdio_initialized = 0;
 #if FIXED_BUFFERS > 2
 	int i;
+#endif
+
+	if (stdio_initialized!=0)
+	    return;
+	stdio_initialized++;
 
+#if FIXED_BUFFERS > 2
 	for ( i = 2 ; i < FIXED_BUFFERS ; i++ ) {
 		_fixed_buffers[i].used = 0;
 	}
@@ -135,7 +142,7 @@ void __init_stdio(void)
 	if (isatty(1)) {
 		stdout->mode |= _IOLBF;
 	}
-#if 0
+#if 1
 	/* Taken care of in _start.S and atexit.c now. */
 	atexit(__stdio_close_all);
 #endif
@@ -149,6 +156,8 @@ FILE *fp;
 {
 	register int v;
 
+	 __init_stdio();
+
 	v = fp->mode;
 	/* If last op was a read ... */
 	if ((v & __MODE_READING) && fflush(fp))
@@ -194,6 +203,8 @@ FILE *fp;
 {
 	int ch;
 
+	 __init_stdio();
+
 	if (fp->mode & __MODE_WRITING)
 		fflush(fp);
 
@@ -236,6 +247,8 @@ FILE *fp;
 	int len, cc, rv = 0;
 	char *bstart;
 
+	 __init_stdio();
+
 	if (fp == NULL) {			/* On NULL flush the lot. */
 		if (fflush(stdin))
 			return EOF;
@@ -314,6 +327,8 @@ FILE *f;
 	register size_t i;
 	register int ch;
 
+	 __init_stdio();
+
 	ret = s;
 	for (i = count-1; i > 0; i--) {
 		ch = getc(f);
@@ -343,6 +358,8 @@ char *str;
 	register char *p = str;
 	register int c;
 
+	 __init_stdio();
+
 	while (((c = getc(stdin)) != EOF) && (c != '\n'))
 		*p++ = c;
 	*p = '\0';
@@ -357,6 +374,8 @@ FILE *fp;
 {
 	register int n = 0;
 
+	 __init_stdio();
+
 	while (*str) {
 		if (putc(*str++, fp) == EOF)
 			return (EOF);
@@ -372,6 +391,8 @@ const char *str;
 {
 	register int n;
 
+	 __init_stdio();
+
 	if (((n = fputs(str, stdout)) == EOF)
 		|| (putc('\n', stdout) == EOF))
 		return (EOF);
@@ -397,6 +418,8 @@ FILE *fp;
 	int len, v;
 	unsigned bytes, got = 0;
 
+	 __init_stdio();
+
 	v = fp->mode;
 
 	/* Want to do this to bring the file pointer up to date */
@@ -453,6 +476,8 @@ FILE *fp;
 	int len;
 	unsigned bytes, put;
 
+	 __init_stdio();
+
 #ifdef STUB_FWRITE
 	bytes = size * nelm;
 	while (bytes > 0) {
@@ -524,6 +549,8 @@ FILE *fp;
 void rewind(fp)
 FILE *fp;
 {
+	 __init_stdio();
+
 	fseek(fp, (long) 0, 0);
 	clearerr(fp);
 }
@@ -600,6 +627,8 @@ const char *mode;
 	int fopen_mode = 0;
 	FILE *nfp = 0;
 
+	 __init_stdio();
+
 	/* If we've got an fp close the old one (freopen) */
 	if (fp) {
 		/* Careful, don't de-allocate it */
@@ -710,6 +739,8 @@ FILE *fp;
 {
 	int rv = 0;
 
+	 __init_stdio();
+
 	if (fp == 0) {
 		errno = EINVAL;
 		return EOF;
@@ -817,6 +848,8 @@ int ungetc(c, fp)
 int c;
 FILE *fp;
 {
+	 __init_stdio();
+
 	if (fp->mode & __MODE_WRITING)
 		fflush(fp);
 

+ 0 - 3
libc/stdlib/atexit.c

@@ -50,15 +50,12 @@ int atexit(vfuncp ptr)
 #endif
 
 #ifdef L_exit
-void __stdio_close_all(void);	/* note: see _start.S - could be faked */
-
 vfuncp __cleanup = 0;
 
 void exit(int rv)
 {
 	if (__cleanup)
 		__cleanup();
-	__stdio_close_all();
 	_exit(rv);
 }
 #endif

+ 2 - 24
libc/sysdeps/linux/arm/crt0.S

@@ -3,6 +3,7 @@
         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
 	
@@ -40,18 +41,10 @@ This file now uses the register naming from the ARM Procedure Calling Standard
 	.global _start
 	.global exit
 	.global main
-	.global __libc_init
-	.global __init_stdio
-	.global __stdio_close_all
-	.global _void_void_null_func
 
 	.type   _start,%function
 	.type   exit,%function
 	.type   main,%function
-	.type   __libc_init,%function
-	.type   __init_stdio,%function
-	.type   __stdio_close_all,%function
-	.type   _void_void_null_func,%function
 
 .text
 _start:
@@ -73,27 +66,12 @@ _start:
 	add     a3, a3, #4
 	str     a3, [a4, #0]
 
-	/* Tell libc to initialize whatever it needs */
-        bl __libc_init		    
-        bl __init_stdio
 	bl      main
 	bl      exit
 
-_void_void_null_func:
-	mov     pc, lr
-
-.weak __libc_init
-__libc_init = _void_void_null_func
-
-.weak __init_stdio
-__init_stdio = _void_void_null_func
-
-.weak __stdio_close_all
-__stdio_close_all = _void_void_null_func
-
 .align 2
 .L3:
-	.word environ
+	.word __environ
 
 
 .data

+ 40 - 27
libc/sysdeps/linux/arm/crt0pic.S

@@ -1,21 +1,49 @@
+/* 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
+	
+   When we are done here, we want
+	a1=argc
+	a2=argv[0]
+	a3=argv[argc+1]
+
+ARM register quick reference:
+
+    Name    Number      APCS Role
+
+    a1      0           argument 1 / integer result / scratch register / argc
+    a2      1           argument 2 / scratch register / argv
+    a3      2           argument 3 / scratch register / envp
+    a4      3           argument 4 / scratch register
+    v1      4           register variable
+    v2      5           register variable
+    v3      6           register variable
+    v4      7           register variable
+    v5      8           register variable
+    sb/v6   9           static base / register variable
+    sl/v7   10          stack limit / stack chunk handle / reg. variable
+    fp      11          frame pointer
+    ip      12          scratch register / new-sb in inter-link-unit calls
+    sp      13          lower end of current stack frame
+    lr      14          link address / scratch register
+    pc      15          program counter
+*/
+
 .text
 	.align 2
 	.global __environ
 	.global _start
 	.global exit
 	.global main
-	.global __libc_init
-	.global __init_stdio
-	.global __stdio_close_all
-	.global _void_void_null_func
 
 	.type   _start,%function
 	.type   exit,%function
 	.type   main,%function
-	.type   __libc_init,%function
-	.type   __init_stdio,%function
-	.type   __stdio_close_all,%function
-	.type   _void_void_null_func,%function
 
 
 
@@ -23,21 +51,18 @@
 @ r1 = argv
 @ r2 = envp
 @ sl = data segment
+#define BASEREG	    r9
 
 .text
 _start:
 	@ adjust the data segment base pointer
 	ldr r3,=__data_start
 	sub sl,sl,r3
-	mov r9,sl
+	mov BASEREG,sl
 
 	ldr r3, .L3
-	str r2,[r9,r3]
+	str r2,[BASEREG,r3]
 	
-	/* Tell libc to initialize whatever it needs */
-        bl __libc_init		    
-        bl __init_stdio
-
 	/* pull argc, argv and envp off the stack */
 	ldr r0,[sp, #0]
 	ldr r1,[sp, #4]
@@ -47,21 +72,9 @@ _start:
 /*	ldr r0,=0  */
 	bl      exit
 
-_void_void_null_func:
-	mov     pc, lr
-
-.weak __libc_init
-__libc_init = _void_void_null_func
-
-.weak __init_stdio
-__init_stdio = _void_void_null_func
-
-.weak __stdio_close_all
-__stdio_close_all = _void_void_null_func
-
 .align 2
 .L3:
-	.word environ
+	.word __environ
 
 
 .data

+ 1 - 21
libc/sysdeps/linux/i386/crt0.S

@@ -25,6 +25,7 @@ Cambridge, MA 02139, USA.  */
         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
 */
@@ -33,8 +34,6 @@ Cambridge, MA 02139, USA.  */
 .global _start
 .global exit
 .global main
-.global __stdio_close_all
-.global _void_void_null_func
 .global _start_exit
 
 .text
@@ -78,11 +77,6 @@ _start:
 	movl 8(%esp),%eax
 	movl %eax,__environ
 
-	/* Tell libc to initialize anything it needs to do */
-	call __libc_init
-	/* call __malloc_init */
-	call __init_stdio
-
 	/* Ok, now run main() */
 	call main
 	pushl %eax
@@ -99,20 +93,6 @@ _start_exit:
 _void_void_null_func:
 	ret
 
-.weak __libc_init
-__libc_init = _void_void_null_func
-
-/*
-.weak __malloc_init
-__malloc_init = _void_void_null_func
-*/
-
-.weak __init_stdio
-__init_stdio = _void_void_null_func
-
-.weak __stdio_close_all
-__stdio_close_all = _void_void_null_func
-	
 .data
 __environ:
         .long 0