newlib: rework console initialization.

git-svn-id: svn://kolibrios.org@6074 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2016-01-18 17:02:08 +00:00
parent 36d7425fb6
commit adda605e2e
8 changed files with 29 additions and 45 deletions

View File

@ -14,7 +14,7 @@ SECTIONS
LONG(___stacktop); LONG(___stacktop);
LONG(___cmdline); LONG(___cmdline);
LONG(___pgmname); /* full path */ LONG(___pgmname); /* full path */
LONG(0); /*FIXME tls data */ LONG(__subsystem__);
LONG(__idata_start) LONG(__idata_start)
LONG(__idata_end) LONG(__idata_end)
LONG(_main) LONG(_main)
@ -65,7 +65,7 @@ SECTIONS
___crt_xt_end__ = . ; ___crt_xt_end__ = . ;
} }
.data ALIGN(64) : .data ALIGN(16) :
{ {
PROVIDE ( __data_start__ = .) ; PROVIDE ( __data_start__ = .) ;
*(.data) *(.data)
@ -74,17 +74,17 @@ SECTIONS
*(.jcr) *(.jcr)
__CRT_MT = .; __CRT_MT = .;
LONG(0); LONG(0);
PROVIDE ( __data_end__ = .) ; PROVIDE ( __data_end__ = .) ;
*(.data_cygwin_nocopy) *(.data_cygwin_nocopy)
___iend = . ; ___iend = . ;
} }
.eh_frame BLOCK(16) : /* .eh_frame BLOCK(16) :
{ {
PROVIDE (___EH_FRAME_BEGIN__ = .) ; PROVIDE (___EH_FRAME_BEGIN__ = .) ;
*(.eh_frame*) *(.eh_frame*)
} }
*/
.idata ALIGN(16): .idata ALIGN(16):
{ {
__idata_start = .; __idata_start = .;
@ -120,6 +120,7 @@ SECTIONS
*(.drectve) *(.drectve)
*(.note.GNU-stack) *(.note.GNU-stack)
*(.comment) *(.comment)
*(.eh_frame)
*(.debug_abbrev) *(.debug_abbrev)
*(.debug_info) *(.debug_info)
*(.debug_line) *(.debug_line)

View File

@ -29,8 +29,12 @@ struct app_hdr
int stacktop; int stacktop;
char *cmdline; char *cmdline;
char *path; char *path;
int __subsystem__;
}; };
void __init_conio();
void __fini_conio();
extern int main (int, char **, char **); extern int main (int, char **, char **);
/* NOTE: The code for initializing the _argv, _argc, and environ variables /* NOTE: The code for initializing the _argv, _argc, and environ variables
@ -177,6 +181,8 @@ __crt_startup (void)
init_reent(); init_reent();
init_stdio(); init_stdio();
if(header->__subsystem__ == 3)
__init_conio();
if( header->cmdline[0] != 0) if( header->cmdline[0] != 0)
{ {
@ -196,6 +202,9 @@ __crt_startup (void)
retval = main(argc, argv, NULL); retval = main(argc, argv, NULL);
done: done:
if(header->__subsystem__ == 3)
__fini_conio();
exit (retval); exit (retval);
} }

View File

@ -1,15 +0,0 @@
extern void _pei386_runtime_relocator (void);
int DllStartup(void *module, int reason)
{
_pei386_runtime_relocator();
return 1;
};
void ___dll_start ()
{
_pei386_runtime_relocator();
}

View File

@ -29,7 +29,7 @@ struct app_hdr
int stacktop; int stacktop;
char *cmdline; char *cmdline;
char *path; char *path;
int reserved; int __subsystem__;
void *__idata_start; void *__idata_start;
void *__idata_end; void *__idata_end;
int (*main)(int argc, char **argv, char **envp); int (*main)(int argc, char **argv, char **envp);
@ -38,7 +38,8 @@ struct app_hdr
void _pei386_runtime_relocator (void); void _pei386_runtime_relocator (void);
void init_loader(void *libc_image); void init_loader(void *libc_image);
void init_reent(); void init_reent();
void __init_conio();
void __fini_conio();
int link_app(); int link_app();
void* get_entry_point(void *raw); void* get_entry_point(void *raw);
int (*entry)(int, char **, char **); int (*entry)(int, char **, char **);
@ -182,6 +183,10 @@ libc_crt_startup (void *libc_base)
_tls_map[0] = 0xE0; _tls_map[0] = 0xE0;
init_reent(); init_reent();
init_stdio(); init_stdio();
if(header->__subsystem__ == 3)
__init_conio();
__do_global_ctors(); __do_global_ctors();
// __appenv = load_file("/sys/system.env", &__appenv_size); // __appenv = load_file("/sys/system.env", &__appenv_size);
@ -209,6 +214,9 @@ libc_crt_startup (void *libc_base)
retval = header->main(argc, argv, NULL); retval = header->main(argc, argv, NULL);
done: done:
if(header->__subsystem__ == 3)
__fini_conio();
exit (retval); exit (retval);
} }

View File

@ -22,8 +22,6 @@
#include <stdarg.h> #include <stdarg.h>
#include "local.h" #include "local.h"
int __gui_mode;
int int
_DEFUN(_printf_r, (ptr, fmt), _DEFUN(_printf_r, (ptr, fmt),
struct _reent *ptr _AND struct _reent *ptr _AND
@ -57,11 +55,3 @@ _DEFUN(printf, (fmt),
} }
#endif /* ! _REENT_ONLY */ #endif /* ! _REENT_ONLY */
extern int __gui_mode;
extern void __attribute__ ((constructor)) __init_conio();
static void __attribute__ ((constructor)) init_printf()
{
__gui_mode = (int)&__init_conio;
}

View File

@ -139,12 +139,3 @@ _DEFUN(puts, (s),
} }
#endif #endif
extern int __gui_mode;
extern void __attribute__ ((constructor)) __init_conio();
static void __attribute__ ((constructor)) init_puts()
{
__gui_mode = (int)&__init_conio;
}

View File

@ -21,19 +21,19 @@ static int console_write(const char *path, const void *buff,
return count; return count;
}; };
void __attribute__ ((constructor)) __init_conio() void __init_conio()
{ {
__io_handle *ioh; __io_handle *ioh;
load_libconsole(); load_libconsole();
con_init(80, 25, 80, 250, "Console application"); con_init(80, 25, 80, 500, "Console application");
ioh = &__io_tab[STDOUT_FILENO]; ioh = &__io_tab[STDOUT_FILENO];
ioh->mode = _WRITE|_ISTTY; ioh->mode = _WRITE|_ISTTY;
ioh->write = &console_write; ioh->write = &console_write;
}; };
static void __attribute__ ((destructor)) __fini_conio() void __fini_conio()
{ {
con_exit(0); con_exit(0);
} }

View File

@ -14,7 +14,7 @@ SECTIONS
LONG(___stacktop); LONG(___stacktop);
LONG(___cmdline); LONG(___cmdline);
LONG(___pgmname); /* full path */ LONG(___pgmname); /* full path */
LONG(0); /*FIXME tls data */ LONG(__subsystem__);
*(.init) *(.init)
*(.text) *(.text)