Index: fb/Makefile
===================================================================
--- fb/Makefile	(revision 04552a80d7eb1c2faa918744c220dbeeb00e3c9c)
+++ fb/Makefile	(revision 25f98230aa117457f7d8902fa898f6a9dfb49934)
@@ -61,5 +61,5 @@
 
 $(OUTPUT): $(OBJECTS) $(LIBS)
-	$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld  $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
+	$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
 
 disasm:
Index: kbd/Makefile
===================================================================
--- kbd/Makefile	(revision 04552a80d7eb1c2faa918744c220dbeeb00e3c9c)
+++ kbd/Makefile	(revision 25f98230aa117457f7d8902fa898f6a9dfb49934)
@@ -68,5 +68,5 @@
 
 $(OUTPUT): $(ARCH_OBJECTS) $(GENERIC_OBJECTS) $(LIBS)
-	$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld  $(GENERIC_OBJECTS) $(ARCH_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
+	$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(GENERIC_OBJECTS) $(ARCH_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
 
 disasm:
Index: libc/arch/amd64/src/entry.s
===================================================================
--- libc/arch/amd64/src/entry.s	(revision 04552a80d7eb1c2faa918744c220dbeeb00e3c9c)
+++ libc/arch/amd64/src/entry.s	(revision 25f98230aa117457f7d8902fa898f6a9dfb49934)
@@ -32,4 +32,5 @@
 
 .globl __entry
+.globl __entry_driver
 
 ## User-space task entry point
@@ -38,6 +39,10 @@
 __entry:
 	call __main
+	call __io_init
 	call main
 	call __exit
-	
-.end __entry
+
+__entry_driver:
+	call __main
+	call main
+	call __exit
Index: libc/arch/ia32/src/entry.s
===================================================================
--- libc/arch/ia32/src/entry.s	(revision 04552a80d7eb1c2faa918744c220dbeeb00e3c9c)
+++ libc/arch/ia32/src/entry.s	(revision 25f98230aa117457f7d8902fa898f6a9dfb49934)
@@ -32,4 +32,5 @@
 
 .globl __entry
+.globl __entry_driver
 
 ## User-space task entry point
@@ -43,7 +44,17 @@
 	# Do not set %gs, it contains descriptor that can see TLS
 	
-	call __main	
+	call __main
+	call __io_init
 	call main
 	call __exit
 	
-.end __entry
+__entry_driver:
+	mov %ss, %ax
+	mov %ax, %ds
+	mov %ax, %es
+	mov %ax, %fs
+	# Do not set %gs, it contains descriptor that can see TLS
+	
+	call __main
+	call main
+	call __exit
Index: libc/arch/ia64/src/entry.s
===================================================================
--- libc/arch/ia64/src/entry.s	(revision 04552a80d7eb1c2faa918744c220dbeeb00e3c9c)
+++ libc/arch/ia64/src/entry.s	(revision 25f98230aa117457f7d8902fa898f6a9dfb49934)
@@ -32,4 +32,5 @@
 
 .globl __entry
+.globl __entry_driver
 
 ## User-space task entry point
@@ -40,6 +41,12 @@
 	mov r1 = _gp 
 	{ br.call.sptk.many b0 = __main }
+	{ br.call.sptk.many b0 = __io_init }
 	{ br.call.sptk.many b0 = main }
 	{ br.call.sptk.many b0 = __exit }
-	
-.end __entry
+
+__entry_driver:
+	alloc loc0 = ar.pfs, 0, 1, 2, 0
+	mov r1 = _gp 
+	{ br.call.sptk.many b0 = __main }
+	{ br.call.sptk.many b0 = main }
+	{ br.call.sptk.many b0 = __exit }
Index: libc/arch/mips32/_link.ld.in
===================================================================
--- libc/arch/mips32/_link.ld.in	(revision 04552a80d7eb1c2faa918744c220dbeeb00e3c9c)
+++ libc/arch/mips32/_link.ld.in	(revision 25f98230aa117457f7d8902fa898f6a9dfb49934)
@@ -1,4 +1,4 @@
 STARTUP(../libc/arch/ARCH/src/entry.o)
-ENTRY(__start)
+ENTRY(__entry)
 
 PHDRS {
Index: libc/arch/mips32/src/entry.s
===================================================================
--- libc/arch/mips32/src/entry.s	(revision 04552a80d7eb1c2faa918744c220dbeeb00e3c9c)
+++ libc/arch/mips32/src/entry.s	(revision 25f98230aa117457f7d8902fa898f6a9dfb49934)
@@ -29,5 +29,6 @@
 .text
 .section .init, "ax"
-.global __start
+.global __entry
+.global __entry_driver
 .set noreorder
 .option pic2
@@ -36,6 +37,31 @@
 #
 #
-.ent __start
-__start:
+.ent __entry
+__entry:
+	.frame $sp, 32, $31
+	.cpload $25
+	
+	
+	# Mips o32 may store its arguments on stack, make space (16 bytes),
+	# so that it could work with -O0
+	# Make space additional 16 bytes for the stack frame
+
+	addiu $sp, -32
+	.cprestore 16   # Allow PIC code
+	
+	jal __main
+	nop
+	
+	jal __io_init
+	nop
+	
+	jal main
+	nop
+	
+	jal __exit
+	nop
+
+.ent __entry_driver
+__entry_driver:
 	.frame $sp, 32, $31
 	.cpload $25
@@ -57,6 +83,4 @@
 	jal __exit
 	nop
-	
-.end __start
 
 # Alignment of output section data to 0x4000
Index: libc/arch/ppc32/src/entry.s
===================================================================
--- libc/arch/ppc32/src/entry.s	(revision 04552a80d7eb1c2faa918744c220dbeeb00e3c9c)
+++ libc/arch/ppc32/src/entry.s	(revision 25f98230aa117457f7d8902fa898f6a9dfb49934)
@@ -32,4 +32,5 @@
 
 .globl __entry
+.globl __entry_driver
 
 ## User-space task entry point
@@ -37,7 +38,11 @@
 #
 __entry:
-	bl __main	
+	bl __main
+	bl __io_init
 	bl main
 	bl __exit
-	
-.end __entry
+
+__entry_driver:
+	bl __main
+	bl main
+	bl __exit
Index: libc/generic/libc.c
===================================================================
--- libc/generic/libc.c	(revision 04552a80d7eb1c2faa918744c220dbeeb00e3c9c)
+++ libc/generic/libc.c	(revision 25f98230aa117457f7d8902fa898f6a9dfb49934)
@@ -46,5 +46,7 @@
 	psthread_setup(tcb);
 	_ipc_init();
-	
+}
+
+void __io_init(void) {
 	open("stdin", 0);
 	open("stdout", 0);
Index: ns/Makefile
===================================================================
--- ns/Makefile	(revision 04552a80d7eb1c2faa918744c220dbeeb00e3c9c)
+++ ns/Makefile	(revision 25f98230aa117457f7d8902fa898f6a9dfb49934)
@@ -59,5 +59,5 @@
 
 $(OUTPUT): $(OBJECTS) $(LIBS)
-	$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld  $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
+	$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
 
 disasm:
Index: pci/Makefile
===================================================================
--- pci/Makefile	(revision 04552a80d7eb1c2faa918744c220dbeeb00e3c9c)
+++ pci/Makefile	(revision 25f98230aa117457f7d8902fa898f6a9dfb49934)
@@ -61,5 +61,5 @@
 $(OUTPUT): $(OBJECTS) $(LIBS)
 	$(MAKE) -C libpci
-	$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld  $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
+	$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
 
 disasm:
