/* ------------------------------------------------------------- */ /* minimal startup with runtime linker to msvcrt */ #if 0 #define REDIR_ALL \ REDIR(__set_app_type)\ REDIR(__getmainargs)\ REDIR(_controlfp)\ REDIR(_vsnprintf)\ REDIR(exit)\ \ REDIR(puts)\ REDIR(printf)\ REDIR(putchar)\ REDIR(strtod)\ REDIR(memset)\ REDIR(strcpy)\ REDIR(strlen)\ REDIR(malloc)\ REDIR(free)\ #if defined __i386__ && !defined __TINYC__ # define __leading_underscore 1 #endif #ifdef __leading_underscore # define _(s) "_"#s #else # define _(s) #s #endif #define REDIR(s) void *s; static struct { REDIR_ALL } all_ptrs; #undef REDIR #define REDIR(s) #s"\0" static const char all_names[] = REDIR_ALL; #undef REDIR #if __aarch64__ #if defined __TINYC__ # define ALIGN ".align 8" #else # define ALIGN ".align 3" /* .align is power of 2 on non-ELF platforms */ #endif # define REDIR(s) \ __asm__("\n"_(s)":"); \ __asm__(".int 0x58000090"); /* ldr x16, [pc, #16] */ \ __asm__(".int 0xf9400210"); /* ldr x16, [x16] */ \ __asm__(".int 0xd61f0200"); /* br x16 */ \ __asm__(".int 0xd503201f"); /* nop for alignment */ \ __asm__(".quad all_ptrs + (. - all_jmps - 16) / 24 * 8"); \ __asm__(".global "_(s)); __asm__("\t.text\n\t"ALIGN"\nall_jmps:"); REDIR_ALL #else # define REDIR(s) \ __asm__("\n"_(s)":");\ __asm__("jmp *%0"::"m"(all_ptrs.s));\ __asm__(".global "_(s)); static void all_jmps() { REDIR_ALL } #endif #undef REDIR #if 0 # include #else # if __i386__ # define STDCALL __declspec(stdcall) # else # define STDCALL # endif # define DWORD long unsigned # define HMODULE void* # define HANDLE void* S TDCALL HMODULE LoadLibraryA(const char *); S TDCALL HMODULE GetProcAddress(HMODULE , char*); S TDCALL void ExitProcess(int); S TDCALL int WriteFile(HANDLE, const void*, DWORD, DWORD*, void*); S TDCALL HANDLE GetStdHandle(DWORD); S TDCALL int FlushFileBuffers(HANDLE); # define STD_ERROR_HANDLE -12 #endif static void eput(const char *s) { DWORD n_out; int n = 0; while (s[n]) ++n; WriteFile(GetStdHandle(STD_ERROR_HANDLE), s, n, &n_out, 0); } static void rt_reloc() { const char *s = all_names; void **p = (void**)&all_ptrs; void *dll = LoadLibraryA("msvcrt.dll"); do { char buf[100], *d = buf; *p = (void*)GetProcAddress(dll, (char*)s); *d++ = '_'; do *d++ = *s; while (*s++); if (0 == *p) *p = (void*)GetProcAddress(dll, buf); if (0 == *p) { eput("MSVCRT_START.C: RUNTIME RELOCATION ERROR: '"); eput(buf+1); eput("'\n"); ExitProcess(-1); } ++p; } while (*s); } #else # define rt_reloc() #endif int main(int argc, char **argv, char **env); void exit(int); void __set_app_type(int apptype); typedef struct { int newmode; } _startupinfo; int __getmainargs(int *pargc, char ***pargv, char ***penv, int globb, _startupinfo*); void _controlfp(unsigned a, unsigned b); #define _MCW_PC 0x00030000 // Precision Control #define _PC_53 0x00010000 // 53 bits int __argc; char **__argv; char **environ; _startupinfo start_info = {0}; void mainCRTStartup(void) { rt_reloc(); #if defined __i386__ || defined __x86_64__ _controlfp(_PC_53, _MCW_PC); #endif __set_app_type(1); __getmainargs(&__argc, &__argv, &environ, 0, &start_info); exit(main(__argc, __argv, environ)); } #include #define size_t __SIZE_TYPE__ int printf(const char *, ...); int _vsnprintf(char *, size_t, const char *, va_list); /* undefined on windows-11-arm64 */ int vprintf(const char *format, va_list ap) { char buf[1000]; _vsnprintf(buf, sizeof buf, format, ap); return printf("%s", buf); } void __main() {} /* for gcc */ void _pei386_runtime_relocator(void) {} /* for gcc */ void __chkstk(unsigned n) {} /* for clang */