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

View File

@ -29,8 +29,12 @@ struct app_hdr
int stacktop;
char *cmdline;
char *path;
int __subsystem__;
};
void __init_conio();
void __fini_conio();
extern int main (int, char **, char **);
/* NOTE: The code for initializing the _argv, _argc, and environ variables
@ -177,6 +181,8 @@ __crt_startup (void)
init_reent();
init_stdio();
if(header->__subsystem__ == 3)
__init_conio();
if( header->cmdline[0] != 0)
{
@ -196,6 +202,9 @@ __crt_startup (void)
retval = main(argc, argv, NULL);
done:
if(header->__subsystem__ == 3)
__fini_conio();
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;
char *cmdline;
char *path;
int reserved;
int __subsystem__;
void *__idata_start;
void *__idata_end;
int (*main)(int argc, char **argv, char **envp);
@ -38,7 +38,8 @@ struct app_hdr
void _pei386_runtime_relocator (void);
void init_loader(void *libc_image);
void init_reent();
void __init_conio();
void __fini_conio();
int link_app();
void* get_entry_point(void *raw);
int (*entry)(int, char **, char **);
@ -182,6 +183,10 @@ libc_crt_startup (void *libc_base)
_tls_map[0] = 0xE0;
init_reent();
init_stdio();
if(header->__subsystem__ == 3)
__init_conio();
__do_global_ctors();
// __appenv = load_file("/sys/system.env", &__appenv_size);
@ -209,6 +214,9 @@ libc_crt_startup (void *libc_base)
retval = header->main(argc, argv, NULL);
done:
if(header->__subsystem__ == 3)
__fini_conio();
exit (retval);
}

View File

@ -22,8 +22,6 @@
#include <stdarg.h>
#include "local.h"
int __gui_mode;
int
_DEFUN(_printf_r, (ptr, fmt),
struct _reent *ptr _AND
@ -57,11 +55,3 @@ _DEFUN(printf, (fmt),
}
#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
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;
};
void __attribute__ ((constructor)) __init_conio()
void __init_conio()
{
__io_handle *ioh;
load_libconsole();
con_init(80, 25, 80, 250, "Console application");
con_init(80, 25, 80, 500, "Console application");
ioh = &__io_tab[STDOUT_FILENO];
ioh->mode = _WRITE|_ISTTY;
ioh->write = &console_write;
};
static void __attribute__ ((destructor)) __fini_conio()
void __fini_conio()
{
con_exit(0);
}

View File

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