From 27ddc31f12755af9315fe8e73080b9ce51787702 Mon Sep 17 00:00:00 2001 From: "Sergey Semyonov (Serge)" Date: Wed, 10 Jul 2013 19:26:24 +0000 Subject: [PATCH] newlib: crtdll git-svn-id: svn://kolibrios.org@3805 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/libraries/newlib/Makefile | 31 ++- .../newlib/{static-amz.lds => app.lds} | 55 ++--- .../develop/libraries/newlib/crt/chkstk.S | 4 +- programs/develop/libraries/newlib/crt/crt1.c | 6 +- programs/develop/libraries/newlib/crt/crt2.c | 4 +- programs/develop/libraries/newlib/crt/crt3.c | 61 +++++ .../develop/libraries/newlib/crt/crtdll.c | 73 +++--- programs/develop/libraries/newlib/crt/exit.S | 2 +- programs/develop/libraries/newlib/crt/start.S | 19 +- .../libraries/newlib/include/sys/reent.h | 2 +- programs/develop/libraries/newlib/libcdll.lds | 13 +- .../develop/libraries/newlib/pe/crtloader.c | 24 +- programs/develop/libraries/newlib/pe/loader.c | 210 ++++++++++++++++-- .../develop/libraries/newlib/reent/getreent.c | 13 +- .../libraries/newlib/reent/init_reent.c | 2 +- 15 files changed, 381 insertions(+), 138 deletions(-) rename programs/develop/libraries/newlib/{static-amz.lds => app.lds} (80%) create mode 100644 programs/develop/libraries/newlib/crt/crt3.c diff --git a/programs/develop/libraries/newlib/Makefile b/programs/develop/libraries/newlib/Makefile index 09464b4bd1..dd9808ab15 100644 --- a/programs/develop/libraries/newlib/Makefile +++ b/programs/develop/libraries/newlib/Makefile @@ -27,22 +27,34 @@ STATIC_SRCS:= \ crt/crt2.c \ crt/chkstk.S \ crt/exit.S \ - pe/crtloader.c \ - crt/setjmp.S + pe/crtloader.c DLL_SRCS:= \ crt/crtdll.c \ crt/chkstk.S \ + crt/exit.S + + +LIBCDLL_SRCS:= \ + crt/crtdll.c \ + crt/pseudo-reloc.c \ + crt/chkstk.S \ crt/exit.S \ - crt/setjmp.S \ pe/loader.c +LIBCRT_SRCS:= \ + crt/start.S \ + crt/chkstk.S \ + crt/crt3.c \ + pe/crtloader.c + CORE_SRCS:= \ argz/buf_findstr.c \ argz/envz_get.c \ crt/emutls.c \ crt/thread.S \ crt/tls.S \ + crt/setjmp.S \ crt/assert.c \ crt/cpu_features.c \ ctype/ctype_.c \ @@ -300,8 +312,12 @@ AMZ_OBJS = $(patsubst %.S, %.o, $(patsubst %.c, %.o, $(AMZ_SRCS))) STATIC_OBJS = $(patsubst %.S, %.o, $(patsubst %.c, %.o, $(STATIC_SRCS))) +LIBCRT_OBJS = $(patsubst %.S, %.o, $(patsubst %.c, %.o, $(LIBCRT_SRCS))) + DLL_OBJS = $(patsubst %.S, %.o, $(patsubst %.c, %.o, $(DLL_SRCS))) +LIBCDLL_OBJS = $(patsubst %.S, %.o, $(patsubst %.c, %.o, $(LIBCDLL_SRCS))) + CORE_OBJS = $(patsubst %.S, %.o, $(patsubst %.asm, %.obj,\ $(patsubst %.c, %.o, $(CORE_SRCS)))) @@ -335,8 +351,8 @@ LIB_OBJS:= $(STATIC_OBJS) else -LIB_SRCS:= $(DLL_SRCS) -LIB_OBJS:= $(DLL_OBJS) +LIB_SRCS:= $(LIBCDLL_SRCS) +LIB_OBJS:= $(LIBCDLL_OBJS) endif @@ -356,13 +372,16 @@ LIB_OBJS+= \ -shared: $(NAME).dll libamz.a libc.obj +shared: $(NAME).dll libcrt.a $(NAME).dll: $(LIB_OBJS) $(SRC_DEP) Makefile ld $(LDFLAGS) -L. -o $@ $(LIB_OBJS) -lgcc +libcrt.a: $(LIBCRT_OBJS) Makefile + ar rc libcrt.a $(LIBCRT_OBJS) + libamz.a: $(AMZ_OBJS) Makefile ar rc libamz.a $(AMZ_OBJS) diff --git a/programs/develop/libraries/newlib/static-amz.lds b/programs/develop/libraries/newlib/app.lds similarity index 80% rename from programs/develop/libraries/newlib/static-amz.lds rename to programs/develop/libraries/newlib/app.lds index 3f5a6639ca..b98ae836fa 100644 --- a/programs/develop/libraries/newlib/static-amz.lds +++ b/programs/develop/libraries/newlib/app.lds @@ -3,8 +3,8 @@ ENTRY(__start) SECTIONS { - .text 0x000000: - { + .text 0x000000: + { LONG(0x554e454D); LONG(0x32305445); LONG(1); @@ -15,6 +15,9 @@ SECTIONS LONG(___cmdline); LONG(___pgmname); /* full path */ LONG(0); /*FIXME tls data */ + LONG(__idata_start) + LONG(__idata_end) + LONG(_main) *(.init) *(.text) @@ -31,10 +34,10 @@ SECTIONS *(.gcc_exc) PROVIDE (etext = .); *(.gcc_except_table) - } + } - .rdata ALIGN(64) : - { + .rdata ALIGN(16) : + { *(.rdata) *(SORT(.rdata$*)) ___RUNTIME_PSEUDO_RELOC_LIST__ = .; @@ -42,9 +45,9 @@ SECTIONS *(.rdata_runtime_pseudo_reloc) ___RUNTIME_PSEUDO_RELOC_LIST_END__ = .; __RUNTIME_PSEUDO_RELOC_LIST_END__ = .; - } - .CRT ALIGN(64) : - { + } + .CRT ALIGN(16) : + { ___crt_xc_start__ = . ; *(SORT(.CRT$XC*)) /* C initialization */ ___crt_xc_end__ = . ; @@ -60,10 +63,10 @@ SECTIONS ___crt_xt_start__ = . ; *(SORT(.CRT$XT*)) /* Termination */ ___crt_xt_end__ = . ; - } + } - .data ALIGN(64) : - { + .data ALIGN(64) : + { PROVIDE ( __data_start__ = .) ; *(.data) *(.data2) @@ -74,22 +77,24 @@ SECTIONS PROVIDE ( __data_end__ = .) ; *(.data_cygwin_nocopy) ___iend = . ; - } + } - .idata ALIGN(64): - { - SORT(*)(.idata$2) - SORT(*)(.idata$3) + .idata ALIGN(16): + { + __idata_start = .; + SORT(*)(.idata$2) + SORT(*)(.idata$3) /* These zeroes mark the end of the import list. */ - LONG (0); LONG (0); LONG (0); LONG (0); LONG (0); - SORT(*)(.idata$4) - SORT(*)(.idata$5) - SORT(*)(.idata$6) - SORT(*)(.idata$7) - } + LONG (0); LONG (0); LONG (0); LONG (0); LONG (0); + SORT(*)(.idata$4) + SORT(*)(.idata$5) + SORT(*)(.idata$6) + SORT(*)(.idata$7) + __idata_end = . ; + } - bss ALIGN(64): - { + bss ALIGN(16): + { *(.bss) *(COMMON) . = ALIGN(16); @@ -99,7 +104,7 @@ SECTIONS . = . + 1024 + 16; ___stacktop = .; ___memsize = . ; - } + } /DISCARD/ : { diff --git a/programs/develop/libraries/newlib/crt/chkstk.S b/programs/develop/libraries/newlib/crt/chkstk.S index 4df1b52786..456ce36355 100644 --- a/programs/develop/libraries/newlib/crt/chkstk.S +++ b/programs/develop/libraries/newlib/crt/chkstk.S @@ -14,7 +14,7 @@ __alloca: pushl %ecx /* save temp */ leal 8(%esp), %ecx /* point past return addr */ subl %eax, %ecx - cmpl %fs:4, %ecx # check low stack limit + cmpl %fs:8, %ecx # check low stack limit jb 1f movl %esp, %eax /* save old stack pointer */ @@ -41,7 +41,7 @@ ___chkstk_ms: 1: subl $0x1000, %ecx /* yes, move pointer down 4k*/ - cmpl %fs:4, %ecx /* check low stack limit */ + cmpl %fs:8, %ecx /* check low stack limit */ jb 3f orl $0x0, (%ecx) /* probe there */ diff --git a/programs/develop/libraries/newlib/crt/crt1.c b/programs/develop/libraries/newlib/crt/crt1.c index c076f58d68..d1b3725397 100644 --- a/programs/develop/libraries/newlib/crt/crt1.c +++ b/programs/develop/libraries/newlib/crt/crt1.c @@ -29,8 +29,8 @@ * a-good-idea use of include. */ -extern char __cmdline; -extern char __pgmname; +extern char __cmdline[]; +extern char __pgmname[]; extern int main (int, char **, char **); @@ -107,7 +107,7 @@ __crt_startup (void) arg[0] = &__pgmname; - if( __cmdline != 0) + if( __cmdline[0] != 0) { _argc = 2; arg[1] = &__cmdline; diff --git a/programs/develop/libraries/newlib/crt/crt2.c b/programs/develop/libraries/newlib/crt/crt2.c index 2581913f2b..2b6cdca182 100644 --- a/programs/develop/libraries/newlib/crt/crt2.c +++ b/programs/develop/libraries/newlib/crt/crt2.c @@ -9,8 +9,8 @@ __thread_startup (int (*entry)(void*), void *param, int retval; __asm__ __volatile__( // save stack limits - "movl %0, %%fs:4 \n\t" // use TLS - "movl %1, %%fs:8 \n\t" + "movl %0, %%fs:8 \n\t" // use TLS + "movl %1, %%fs:12 \n\t" ::"r"(stacklow), "r"(stackhigh)); init_reent(); // initialize thread reentry structure diff --git a/programs/develop/libraries/newlib/crt/crt3.c b/programs/develop/libraries/newlib/crt/crt3.c new file mode 100644 index 0000000000..cae70a9e92 --- /dev/null +++ b/programs/develop/libraries/newlib/crt/crt3.c @@ -0,0 +1,61 @@ +/* + * crt1.c + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Source code for the startup proceedures used by all programs. This code + * is compiled to make crt1.o, which should be located in the library path. + * + */ + +/* Hide the declaration of _fmode with dllimport attribute in stdlib.h to + avoid problems with older GCC. */ + +#include +#include +#include +#include +#include + + +typedef void (*ctp)(); +static void __do_global_ctors () +{ + extern int __CTOR_LIST__; + int *c = &__CTOR_LIST__; + c++; + while (*c) + { + ctp d = (ctp)*c; + (d)(); + c++; + } +} + +void *load_libc(); +void __main (){}; + +void* get_entry_point(void *raw); + +void __attribute__((noreturn)) +__crt_startup (void) +{ + struct app_hdr *header; + void *img; + void __attribute__((noreturn)) (*entry)(void *img); + + img = load_libc(); + + if(img == NULL) + { + asm("int3"); + asm ("int $0x40" ::"a"(-1)); + }; + + entry = get_entry_point(img); + entry(img); +} + + + diff --git a/programs/develop/libraries/newlib/crt/crtdll.c b/programs/develop/libraries/newlib/crt/crtdll.c index fa7ea47f4b..dcec5b3dda 100644 --- a/programs/develop/libraries/newlib/crt/crtdll.c +++ b/programs/develop/libraries/newlib/crt/crtdll.c @@ -19,18 +19,21 @@ struct app_hdr int stacktop; char *cmdline; char *path; + int reserved; + void *__idata_start; + void *__idata_end; + void (*main)(int argc, char **argv, char **envp); }; int _argc; char **_argv; -void __fastcall init_loader(void *libc_image); -void* __fastcall create_image(void *raw); -int __fastcall link_image(void *img_base); void* get_entry_point(void *raw); int (*entry)(int, char **, char **); +void init_loader(void *libc_image); + void init_reent(); @@ -45,8 +48,8 @@ __thread_startup (int (*entry)(void*), void *param, asm volatile ( "xchgw %bx, %bx"); __asm__ __volatile__( // save stack limits - "movl %0, %%fs:4 \n\t" // use TLS - "movl %1, %%fs:8 \n\t" + "movl %0, %%fs:8 \n\t" // use TLS + "movl %1, %%fs:12 \n\t" ::"r"(stacklow), "r"(stackhigh)); init_reent(); // initialize thread reentry structure @@ -61,16 +64,22 @@ char * __libc_getenv(const char *name) return NULL; } +void _pei386_runtime_relocator (void); +int link_app(); + char __appcwd[1024]; int __appcwdlen; char* __appenv; int __appenv_size; +static char *arg[2]; + +extern char _tls_map[128]; + void __attribute__((noreturn)) -crt_startup (void *libc_base, void *obj_base, uint32_t *params) +libc_crt_startup (void *libc_base) { - struct app_hdr *header; - char *arg[2]; + struct app_hdr *header = NULL; int len; char *p; @@ -78,67 +87,39 @@ crt_startup (void *libc_base, void *obj_base, uint32_t *params) void *my_app; int retval = 0; -// user_free(obj_base); + _pei386_runtime_relocator(); + memset(_tls_map, 0xFF, 32*4); + _tls_map[0] = 0xE0; init_reent(); __initPOSIXHandles(); + // __appenv = load_file("/sys/system.env", &__appenv_size); init_loader(libc_base); - my_app = create_image((void*)(params[0])); - - if( link_image(my_app)==0) + if( link_app() == 0) goto done; - header = (struct app_hdr*)NULL; - __appcwdlen = strrchr(header->path, '/') - header->path; __appcwdlen = __appcwdlen > 1022 ? 1022 : __appcwdlen; memcpy(__appcwd, header->path, __appcwdlen); set_cwd(__appcwd); -#ifdef BRAVE_NEW_WORLD - len = strlen(header->path); - p = alloca(len+1); - memcpy(p, header->path, len); - p[len]=0; - - arg[0] = p; -#else arg[0] = header->path; -#endif - _argc = 1; - - if( header->cmdline != 0) + if( header->cmdline[0] != 0) { -#ifdef BRAVE_NEW_WORLD - len = strlen(header->cmdline); - if(len) - { - p = alloca(len+1); - memcpy(p, header->cmdline, len); - p[len]=0; - _argc = 2; - arg[1] = p; - }; -#else _argc = 2; arg[1] = header->cmdline; -#endif - }; + } + else _argc = 1; _argv = arg; - entry = get_entry_point(my_app); - -// __asm__ __volatile__("int3"); - - retval = entry(_argc, _argv, NULL); - + header->main(_argc, _argv, NULL); done: - exit (retval); + _exit (retval); } diff --git a/programs/develop/libraries/newlib/crt/exit.S b/programs/develop/libraries/newlib/crt/exit.S index 927132c9ca..d92d964b54 100644 --- a/programs/develop/libraries/newlib/crt/exit.S +++ b/programs/develop/libraries/newlib/crt/exit.S @@ -12,7 +12,7 @@ __Exit: movl 4(%esp), %edx #store exit code movl $68, %eax movl $13, %ebx - movl %fs:4, %ecx + movl %fs:8, %ecx int $0x40 #destroy stack movl $-1, %eax diff --git a/programs/develop/libraries/newlib/crt/start.S b/programs/develop/libraries/newlib/crt/start.S index 3b96063fd7..84446640ed 100644 --- a/programs/develop/libraries/newlib/crt/start.S +++ b/programs/develop/libraries/newlib/crt/start.S @@ -3,6 +3,12 @@ .global __start +#tls:0 pid process id +#tls:4 tid reserved for thread slot +#tls:8 thread's stack low limit +#tls:12 thread's stack high limit +#tls:16 reseved for libc + .align 4 __start: movl $68, %eax @@ -15,8 +21,8 @@ __start: jz 1f addl %eax, %ecx - movl %eax, %fs:4 - movl %ecx, %fs:8 #save stack base - low limit + movl %eax, %fs:8 + movl %ecx, %fs:12 #save stack base - low limit #save stack top - high limit movl %ecx, %esp #reload stack @@ -30,15 +36,8 @@ __start: movl 30(%ebx), %eax movl %eax, %fs:0 #save pid - movl $__tls_map, %edi #init TLS - movl $32, %ecx - xorl %eax, %eax - notl %eax + addl $1024, %esp - rep - stosl - - movb $0xF0, __tls_map jmp ___crt_startup 1: int3 #trap to debugger diff --git a/programs/develop/libraries/newlib/include/sys/reent.h b/programs/develop/libraries/newlib/include/sys/reent.h index 4c33bf880a..3e51b0ab73 100644 --- a/programs/develop/libraries/newlib/include/sys/reent.h +++ b/programs/develop/libraries/newlib/include/sys/reent.h @@ -827,7 +827,7 @@ static inline struct _reent *__getreent(void) { struct _reent *ent; __asm__ __volatile__( - "movl %%fs:12, %0" + "movl %%fs:16, %0" :"=r"(ent)); return ent; }; diff --git a/programs/develop/libraries/newlib/libcdll.lds b/programs/develop/libraries/newlib/libcdll.lds index 49c85df052..ab2664b903 100644 --- a/programs/develop/libraries/newlib/libcdll.lds +++ b/programs/develop/libraries/newlib/libcdll.lds @@ -1,7 +1,7 @@ OUTPUT_FORMAT(pei-i386) -ENTRY("_crt_startup") +ENTRY("_libc_crt_startup") SECTIONS { @@ -14,6 +14,7 @@ SECTIONS *(.text) *(SORT(.text$*)) *(.text.*) + *(.gnu.linkonce.t.*) *(.glue_7t) *(.glue_7) ___CTOR_LIST__ = .; __CTOR_LIST__ = . ; @@ -23,12 +24,14 @@ SECTIONS *(.fini) *(.rdata) *(SORT(.rdata$*)) - ___RUNTIME_PSEUDO_RELOC_LIST__ = .; - __RUNTIME_PSEUDO_RELOC_LIST__ = .; + __rt_psrelocs_start = .; *(.rdata_runtime_pseudo_reloc) + __rt_psrelocs_end = .; + __rt_psrelocs_size = __rt_psrelocs_end - __rt_psrelocs_start; ___RUNTIME_PSEUDO_RELOC_LIST_END__ = .; __RUNTIME_PSEUDO_RELOC_LIST_END__ = .; - __pei386_runtime_relocator = .; + ___RUNTIME_PSEUDO_RELOC_LIST__ = . - __rt_psrelocs_size; + __RUNTIME_PSEUDO_RELOC_LIST__ = . - __rt_psrelocs_size; } .data ALIGN(__section_alignment__): @@ -46,8 +49,10 @@ SECTIONS .bss ALIGN(__section_alignment__): { + __bss_start__ = . ; *(.bss) *(COMMON) + __bss_end__ = . ; } .edata ALIGN(__section_alignment__): diff --git a/programs/develop/libraries/newlib/pe/crtloader.c b/programs/develop/libraries/newlib/pe/crtloader.c index dccb8f4e45..22acd56218 100644 --- a/programs/develop/libraries/newlib/pe/crtloader.c +++ b/programs/develop/libraries/newlib/pe/crtloader.c @@ -174,10 +174,10 @@ void* create_image(void *raw) } reloc = MakePtr(PIMAGE_BASE_RELOCATION, reloc,reloc->SizeOfBlock); }; - printf("unmap base %p offset %x %d page(s)\n", - img_base, - nt->OptionalHeader.DataDirectory[5].VirtualAddress, - (nt->OptionalHeader.DataDirectory[5].Size+4095)>>12); +// printf("unmap base %p offset %x %d page(s)\n", +// img_base, +// nt->OptionalHeader.DataDirectory[5].VirtualAddress, +// (nt->OptionalHeader.DataDirectory[5].Size+4095)>>12); user_unmap(img_base,nt->OptionalHeader.DataDirectory[5].VirtualAddress, nt->OptionalHeader.DataDirectory[5].Size); @@ -185,6 +185,16 @@ void* create_image(void *raw) return img_base; }; +void* get_entry_point(void *raw) +{ + PIMAGE_DOS_HEADER dos; + PIMAGE_NT_HEADERS32 nt; + + dos = (PIMAGE_DOS_HEADER)raw; + nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew); + + return MakePtr(void*, raw, nt->OptionalHeader.AddressOfEntryPoint); +}; void* load_libc() @@ -195,17 +205,19 @@ void* load_libc() ufile_t uf; uf = load_file("/kolibrios/lib/libc.dll"); + raw_img = uf.data; raw_size = uf.size; + if(raw_img == NULL) return NULL; - printf("libc.dll raw %p, size %d\n", raw_img, raw_size); +// printf("libc.dll raw %p, size %d\n", raw_img, raw_size); if( validate_pe(raw_img, raw_size, 0) == 0) { - printf("invalide libc.dll\n"); +// printf("invalide libc.dll\n"); user_free(raw_img); }; diff --git a/programs/develop/libraries/newlib/pe/loader.c b/programs/develop/libraries/newlib/pe/loader.c index 3c7e9062ef..19788dc6eb 100644 --- a/programs/develop/libraries/newlib/pe/loader.c +++ b/programs/develop/libraries/newlib/pe/loader.c @@ -7,7 +7,7 @@ #include #include -#include +#include #include "list.h" #include "pe.h" @@ -19,7 +19,7 @@ #define DBG(format,...) -void __fastcall init_loader(void *libc_image); +void init_loader(void *libc_image); void* __fastcall create_image(void *raw); int __fastcall link_image(void *img_base); int __fastcall do_exec(uint32_t my_app, uint32_t *params); @@ -40,6 +40,10 @@ struct app_hdr int stacktop; char *cmdline; char *path; + int reserved; + void *__idata_start; + void *__idata_end; + void (*main)(int argc, char **argv, char **envp); }; struct tag_module @@ -70,12 +74,11 @@ typedef struct module_t* load_module(const char *name); -LIST_HEAD(dll_list); LIST_HEAD(path_list); static module_t libc_dll; static char libc_name[] = "libc.dll"; -static char libc_path[] = "/sys/lib/libc.dll"; +static char libc_path[] = "/KolibriOS/lib/libc.dll"; static inline int IsPowerOf2(uint32_t val) { @@ -137,7 +140,7 @@ int validate_pe(void *raw, size_t raw_size, int is_exec) } -void __fastcall init_loader(void *libc_image) +void init_loader(void *libc_image) { PIMAGE_DOS_HEADER dos; @@ -145,7 +148,7 @@ void __fastcall init_loader(void *libc_image) PIMAGE_EXPORT_DIRECTORY exp; struct app_hdr *header; - +#if 0 dll_path_t *path; int len; char *p; @@ -217,6 +220,7 @@ void __fastcall init_loader(void *libc_image) path->path_len = 9; /* FIXME */ DBG("add libraries path %s\n", path->path); list_add_tail(&path->list, &path_list); +#endif #endif INIT_LIST_HEAD(&libc_dll.list); @@ -239,18 +243,18 @@ void __fastcall init_loader(void *libc_image) libc_dll.img_exp = MakePtr(PIMAGE_EXPORT_DIRECTORY,libc_image, nt->OptionalHeader.DataDirectory[0].VirtualAddress); - list_add_tail(&libc_dll.list, &dll_list); }; const module_t* find_module(const char *name) { - module_t* mod; + module_t* mod = &libc_dll; - list_for_each_entry(mod, &dll_list, list) + do { if( !strncmp(name, mod->img_name, 16)) return mod; - }; + mod = (module_t*)mod->list.next; + }while(mod != &libc_dll); return load_module(name); }; @@ -268,15 +272,6 @@ static inline void sec_copy(void *dst, void *src, size_t len) :::"ecx","esi","edi"); }; -static inline void *user_alloc(size_t size) -{ - void *val; - __asm__ __volatile__( - "int $0x40" - :"=eax"(val) - :"a"(68),"b"(12),"c"(size)); - return val; -} void* __fastcall create_image(void *raw) { @@ -366,6 +361,9 @@ void* __fastcall create_image(void *raw) return img_base; }; +static jmp_buf loader_env; +static loader_recursion; + int __fastcall link_image(void *img_base) { static jmp_buf loader_env; @@ -552,6 +550,178 @@ int __fastcall link_image(void *img_base) return 0; } +int link_app() +{ + PIMAGE_IMPORT_DESCRIPTOR imp; + + struct app_hdr *header = NULL; + + int warn = 0; + + if( unlikely(setjmp(loader_env) != 0)) + { + loader_recursion = 0; + return 0; + }; + + imp = (PIMAGE_IMPORT_DESCRIPTOR)header->__idata_start; + + while ( imp->Name ) + { + PIMAGE_DOS_HEADER expdos; + PIMAGE_NT_HEADERS32 expnt; + PIMAGE_EXPORT_DIRECTORY exp; + PIMAGE_THUNK_DATA32 thunk; + + void **iat; + char *libname; + uint32_t *exp_functions; + uint16_t *exp_ordinals; + char **exp_names; + + const module_t *api; + + libname=MakePtr(char*,imp->Name, NULL); + + DBG("import from %s\n",libname); + + api = find_module(libname); + if(unlikely(api == NULL)) + { + printf("library %s not found\n", libname); + longjmp(loader_env, 1); + } + + iat = MakePtr(void**,imp->FirstThunk, NULL); + + if(imp->OriginalFirstThunk !=0 ) + { + thunk = MakePtr(PIMAGE_THUNK_DATA32,imp->OriginalFirstThunk, NULL); + } + else + { + thunk = MakePtr(PIMAGE_THUNK_DATA32,imp->FirstThunk, NULL); + }; + + exp = api->img_exp; + + exp_functions = MakePtr(uint32_t*,exp->AddressOfFunctions,api->start); + exp_ordinals = MakePtr(uint16_t*, exp->AddressOfNameOrdinals,api->start); + exp_names = MakePtr(char**, exp->AddressOfNames,api->start); + + while ( thunk->u1.AddressOfData != 0 ) + { + PIMAGE_IMPORT_BY_NAME imp_name; + + if (thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) + { +// ordinal = (*func_list) & 0x7fffffff; +// *ImportAddressList = LdrGetExportByOrdinal(ImportedModule->DllBase, Ordinal); +// if ((*ImportAddressList) == NULL) +// { +// DPRINT1("Failed to import #%ld from %wZ\n", Ordinal, &ImportedModule->FullDllName); +// RtlpRaiseImportNotFound(NULL, Ordinal, &ImportedModule->FullDllName); +// return STATUS_ENTRYPOINT_NOT_FOUND; +// } + } + else + { + char *export_name; + uint16_t ordinal; + void *function; + uint32_t minn; + uint32_t maxn; + + imp_name = MakePtr(PIMAGE_IMPORT_BY_NAME, + thunk->u1.AddressOfData, NULL); + *iat = NULL; + + DBG("import %s", imp_name->Name); + + if(imp_name->Hint < exp->NumberOfNames) + { + export_name = MakePtr(char*,exp_names[imp_name->Hint], + api->start); + if(strcmp(imp_name->Name, export_name) == 0) + { + ordinal = exp_ordinals[imp_name->Hint]; + function = MakePtr(void*,exp_functions[ordinal], api->start); + if((uint32_t)function >= (uint32_t)exp) + { + printf("forward %s\n", function); + warn=1; + } + else + { + DBG(" \t\tat %x\n", function); + *iat = function; + }; + thunk++; // Advance to next thunk + iat++; + continue; + }; + }; + + + minn = 0; + maxn = exp->NumberOfNames - 1; + while (minn <= maxn) + { + int mid; + int res; + + mid = (minn + maxn) / 2; + + export_name = MakePtr(char*,exp_names[mid],api->start); + + res = strcmp(export_name, imp_name->Name); + if (res == 0) + { + ordinal = exp_ordinals[mid]; + function = MakePtr(void*,exp_functions[ordinal], api->start); + + if((uint32_t)function >= (uint32_t)exp) + { + DBG("forward %s\n", function); + warn=1; + } + else + { + DBG(" \t\tat %x\n", function); + *iat = function; + }; + break; + } + else if (minn == maxn) + { + printf(" unresolved %s\n",imp_name->Name); + warn=1; + break; + } + else if (res > 0) + { + maxn = mid - 1; + } + else + { + minn = mid + 1; + } + }; + }; + thunk++; // Advance to next thunk + iat++; + } + imp++; // advance to next IMAGE_IMPORT_DESCRIPTOR + }; + + if ( !warn ) + return 1; + else + return 0; +} + + + void* get_entry_point(void *raw) { PIMAGE_DOS_HEADER dos; @@ -707,7 +877,7 @@ module_t* load_module(const char *name) module->img_exp = MakePtr(PIMAGE_EXPORT_DIRECTORY, img_base, nt->OptionalHeader.DataDirectory[0].VirtualAddress); - list_add_tail(&module->list, &dll_list); + list_add_tail(&module->list, &libc_dll.list); if( link_image(img_base)) { diff --git a/programs/develop/libraries/newlib/reent/getreent.c b/programs/develop/libraries/newlib/reent/getreent.c index 81e899f4c2..30438cd00a 100644 --- a/programs/develop/libraries/newlib/reent/getreent.c +++ b/programs/develop/libraries/newlib/reent/getreent.c @@ -3,17 +3,8 @@ #include <_ansi.h> #include #include +#include -static inline -void *user_alloc(int size) -{ - void *val; - __asm__ __volatile__( - "int $0x40" - :"=eax"(val) - :"a"(68),"b"(12),"c"(size)); - return val; -} void init_reent() { @@ -24,7 +15,7 @@ void init_reent() _REENT_INIT_PTR(ent); __asm__ __volatile__( - "movl %0, %%fs:12" + "movl %0, %%fs:16" ::"r"(ent)); __sinit(ent); } diff --git a/programs/develop/libraries/newlib/reent/init_reent.c b/programs/develop/libraries/newlib/reent/init_reent.c index 54c7b1ce8d..60fd04a078 100644 --- a/programs/develop/libraries/newlib/reent/init_reent.c +++ b/programs/develop/libraries/newlib/reent/init_reent.c @@ -11,7 +11,7 @@ void init_global_reent() _REENT_INIT_PTR(ent); __asm__ __volatile__( - "movl %0, %%fs:12" + "movl %0, %%fs:16" ::"r"(ent)); // __sinit(ent); }