diff options
author | Eric Andersen <andersen@codepoet.org> | 2001-02-09 06:40:46 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2001-02-09 06:40:46 +0000 |
commit | 411597d4f47de6b37275ee4fdf9fc45cc2a30fcb (patch) | |
tree | 6f42b12d32aec4804c99d6733ac0c22e3bcbc88e /libc/sysdeps/linux | |
parent | 69b2edf81ec8955b59fba03b2a553bd8b5995b58 (diff) |
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
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r-- | libc/sysdeps/linux/arm/crt0.S | 26 | ||||
-rw-r--r-- | libc/sysdeps/linux/arm/crt0pic.S | 67 | ||||
-rw-r--r-- | libc/sysdeps/linux/i386/crt0.S | 22 |
3 files changed, 43 insertions, 72 deletions
diff --git a/libc/sysdeps/linux/arm/crt0.S b/libc/sysdeps/linux/arm/crt0.S index 72a45a29f..3660f4167 100644 --- a/libc/sysdeps/linux/arm/crt0.S +++ b/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 diff --git a/libc/sysdeps/linux/arm/crt0pic.S b/libc/sysdeps/linux/arm/crt0pic.S index a668ac31f..04b1cb755 100644 --- a/libc/sysdeps/linux/arm/crt0pic.S +++ b/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 diff --git a/libc/sysdeps/linux/i386/crt0.S b/libc/sysdeps/linux/i386/crt0.S index 1d01a5dcc..a87287bc3 100644 --- a/libc/sysdeps/linux/i386/crt0.S +++ b/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 |