Initial Cosmopolitan/Actually Portable Executable support

αcτµαlly pδrταblε εxεcµταblε ;)
extensions
Volodymyr Shymanskyy 3 years ago
parent aec7a82fc6
commit 0b09a792d6

@ -18,6 +18,10 @@
#define FATAL(msg, ...) { printf("Error: [Fatal] " msg "\n", ##__VA_ARGS__); goto _onfatal; } #define FATAL(msg, ...) { printf("Error: [Fatal] " msg "\n", ##__VA_ARGS__); goto _onfatal; }
#if defined(d_m3HasWASI) || defined(d_m3HasMetaWASI) || defined(d_m3HasUVWASI)
#define LINK_WASI
#endif
M3Result repl_load (IM3Runtime runtime, const char* fn) M3Result repl_load (IM3Runtime runtime, const char* fn)
{ {
M3Result result = m3Err_none; M3Result result = m3Err_none;
@ -273,7 +277,7 @@ int main (int i_argc, const char* i_argv[])
} else if (!strcmp("--dump-on-trap", arg)) { } else if (!strcmp("--dump-on-trap", arg)) {
argDumpOnTrap = true; argDumpOnTrap = true;
} else if (!strcmp("--stack-size", arg)) { } else if (!strcmp("--stack-size", arg)) {
const char* tmp; const char* tmp = "65536";
ARGV_SET(tmp); ARGV_SET(tmp);
argStackSize = atol(tmp); argStackSize = atol(tmp);
} else if (!strcmp("--dir", arg)) { } else if (!strcmp("--dir", arg)) {
@ -301,7 +305,7 @@ int main (int i_argc, const char* i_argv[])
result = repl_load(runtime, argFile); result = repl_load(runtime, argFile);
if (result) FATAL("repl_load: %s", result); if (result) FATAL("repl_load: %s", result);
#if defined(d_m3HasWASI) || defined(d_m3HasMetaWASI) || defined(d_m3HasUVWASI) #if defined(LINK_WASI)
result = m3_LinkWASI (runtime->modules); result = m3_LinkWASI (runtime->modules);
if (result) FATAL("m3_LinkWASI: %s", result); if (result) FATAL("m3_LinkWASI: %s", result);
#endif #endif
@ -315,6 +319,7 @@ int main (int i_argc, const char* i_argv[])
if (result) FATAL("m3_LinkLibC: %s", result); if (result) FATAL("m3_LinkLibC: %s", result);
if (argFunc and not argRepl) { if (argFunc and not argRepl) {
#if defined(LINK_WASI)
if (!strcmp(argFunc, "_start")) { if (!strcmp(argFunc, "_start")) {
m3_wasi_context_t* wasi_ctx = m3_GetWasiContext(); m3_wasi_context_t* wasi_ctx = m3_GetWasiContext();
// When passing args to WASI, include wasm filename as argv[0] // When passing args to WASI, include wasm filename as argv[0]
@ -324,7 +329,10 @@ int main (int i_argc, const char* i_argv[])
if (result == m3Err_trapExit) { if (result == m3Err_trapExit) {
return wasi_ctx->exit_code; return wasi_ctx->exit_code;
} }
} else { }
else
#endif
{
result = repl_call(runtime, argFunc, i_argc, i_argv); result = repl_call(runtime, argFunc, i_argc, i_argv);
} }

@ -0,0 +1 @@
cosmopolitan/

@ -0,0 +1,33 @@
COSMOPOLITAN_URL=https://justine.lol/cosmopolitan/cosmopolitan.zip
SOURCE_DIR=../../source
EXTRA_FLAGS= #-Dd_m3HasWASI
STD=./cosmopolitan/std
if [ ! -d "./cosmopolitan" ]; then
echo "Downloading Cosmopolitan..."
curl -o cosmopolitan.zip $COSMOPOLITAN_URL
unzip cosmopolitan.zip -d cosmopolitan
rm cosmopolitan.zip
fi
if [ ! -d "$STD/sys" ]; then
# Generate header stubs
mkdir -p $STD/sys
touch $STD/assert.h $STD/limits.h $STD/ctype.h $STD/time.h $STD/errno.h
touch $STD/inttypes.h $STD/fcntl.h $STD/math.h $STD/stdarg.h $STD/stdbool.h
touch $STD/stdint.h $STD/stdio.h $STD/stdlib.h $STD/string.h $STD/stddef.h
touch $STD/sys/types.h $STD/sys/stat.h $STD/unistd.h $STD/sys/uio.h $STD/sys/random.h
fi
echo "Building Wasm3..."
gcc -g -O -static -fno-pie -no-pie -mno-red-zone -nostdlib -nostdinc \
-Wl,--oformat=binary -Wl,--gc-sections -Wl,-z,max-page-size=0x1000 -fuse-ld=bfd \
-Wl,-T,cosmopolitan/ape.lds -include cosmopolitan/cosmopolitan.h \
-Wno-format-security -Wfatal-errors $EXTRA_FLAGS \
-o wasm3.com -DAPE -I$STD -I$SOURCE_DIR $SOURCE_DIR/*.c ../app/main.c \
cosmopolitan/crt.o cosmopolitan/ape.o cosmopolitan/cosmopolitan.a

Binary file not shown.

@ -31,7 +31,10 @@
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#if defined(__wasi__) || defined(__APPLE__) || defined(__ANDROID_API__) || defined(__OpenBSD__) || defined(__linux__) || defined(__EMSCRIPTEN__) #if defined(APE)
// Actually Portable Executable
// All functions are already included in cosmopolitan.h
#elif defined(__wasi__) || defined(__APPLE__) || defined(__ANDROID_API__) || defined(__OpenBSD__) || defined(__linux__) || defined(__EMSCRIPTEN__)
# include <unistd.h> # include <unistd.h>
# include <sys/uio.h> # include <sys/uio.h>
# if defined(__APPLE__) # if defined(__APPLE__)
@ -84,44 +87,54 @@ Preopen preopen[PREOPEN_CNT] = {
{ -1, "/" , "./" }, { -1, "/" , "./" },
}; };
#if defined(APE)
# define APE_SWITCH_BEG
# define APE_SWITCH_END {}
# define APE_CASE_RET(e1,e2) if (errnum == e1) return e2; else
#else
# define APE_SWITCH switch (errnum) {
# define APE_SWITCH_END }
# define APE_CASE_RET(e1,e2) case e1: return e2; break;
#endif
static static
__wasi_errno_t errno_to_wasi(int errnum) { __wasi_errno_t errno_to_wasi(int errnum) {
switch (errnum) { APE_SWITCH_BEG
case EPERM: return __WASI_ERRNO_PERM; break; APE_CASE_RET( EPERM , __WASI_ERRNO_PERM )
case ENOENT: return __WASI_ERRNO_NOENT; break; APE_CASE_RET( ENOENT , __WASI_ERRNO_NOENT )
case ESRCH: return __WASI_ERRNO_SRCH; break; APE_CASE_RET( ESRCH , __WASI_ERRNO_SRCH )
case EINTR: return __WASI_ERRNO_INTR; break; APE_CASE_RET( EINTR , __WASI_ERRNO_INTR )
case EIO: return __WASI_ERRNO_IO; break; APE_CASE_RET( EIO , __WASI_ERRNO_IO )
case ENXIO: return __WASI_ERRNO_NXIO; break; APE_CASE_RET( ENXIO , __WASI_ERRNO_NXIO )
case E2BIG: return __WASI_ERRNO_2BIG; break; APE_CASE_RET( E2BIG , __WASI_ERRNO_2BIG )
case ENOEXEC: return __WASI_ERRNO_NOEXEC; break; APE_CASE_RET( ENOEXEC , __WASI_ERRNO_NOEXEC )
case EBADF: return __WASI_ERRNO_BADF; break; APE_CASE_RET( EBADF , __WASI_ERRNO_BADF )
case ECHILD: return __WASI_ERRNO_CHILD; break; APE_CASE_RET( ECHILD , __WASI_ERRNO_CHILD )
case EAGAIN: return __WASI_ERRNO_AGAIN; break; APE_CASE_RET( EAGAIN , __WASI_ERRNO_AGAIN )
case ENOMEM: return __WASI_ERRNO_NOMEM; break; APE_CASE_RET( ENOMEM , __WASI_ERRNO_NOMEM )
case EACCES: return __WASI_ERRNO_ACCES; break; APE_CASE_RET( EACCES , __WASI_ERRNO_ACCES )
case EFAULT: return __WASI_ERRNO_FAULT; break; APE_CASE_RET( EFAULT , __WASI_ERRNO_FAULT )
case EBUSY: return __WASI_ERRNO_BUSY; break; APE_CASE_RET( EBUSY , __WASI_ERRNO_BUSY )
case EEXIST: return __WASI_ERRNO_EXIST; break; APE_CASE_RET( EEXIST , __WASI_ERRNO_EXIST )
case EXDEV: return __WASI_ERRNO_XDEV; break; APE_CASE_RET( EXDEV , __WASI_ERRNO_XDEV )
case ENODEV: return __WASI_ERRNO_NODEV; break; APE_CASE_RET( ENODEV , __WASI_ERRNO_NODEV )
case ENOTDIR: return __WASI_ERRNO_NOTDIR; break; APE_CASE_RET( ENOTDIR , __WASI_ERRNO_NOTDIR )
case EISDIR: return __WASI_ERRNO_ISDIR; break; APE_CASE_RET( EISDIR , __WASI_ERRNO_ISDIR )
case EINVAL: return __WASI_ERRNO_INVAL; break; APE_CASE_RET( EINVAL , __WASI_ERRNO_INVAL )
case ENFILE: return __WASI_ERRNO_NFILE; break; APE_CASE_RET( ENFILE , __WASI_ERRNO_NFILE )
case EMFILE: return __WASI_ERRNO_MFILE; break; APE_CASE_RET( EMFILE , __WASI_ERRNO_MFILE )
case ENOTTY: return __WASI_ERRNO_NOTTY; break; APE_CASE_RET( ENOTTY , __WASI_ERRNO_NOTTY )
case ETXTBSY: return __WASI_ERRNO_TXTBSY; break; APE_CASE_RET( ETXTBSY , __WASI_ERRNO_TXTBSY )
case EFBIG: return __WASI_ERRNO_FBIG; break; APE_CASE_RET( EFBIG , __WASI_ERRNO_FBIG )
case ENOSPC: return __WASI_ERRNO_NOSPC; break; APE_CASE_RET( ENOSPC , __WASI_ERRNO_NOSPC )
case ESPIPE: return __WASI_ERRNO_SPIPE; break; APE_CASE_RET( ESPIPE , __WASI_ERRNO_SPIPE )
case EROFS: return __WASI_ERRNO_ROFS; break; APE_CASE_RET( EROFS , __WASI_ERRNO_ROFS )
case EMLINK: return __WASI_ERRNO_MLINK; break; APE_CASE_RET( EMLINK , __WASI_ERRNO_MLINK )
case EPIPE: return __WASI_ERRNO_PIPE; break; APE_CASE_RET( EPIPE , __WASI_ERRNO_PIPE )
case EDOM: return __WASI_ERRNO_DOM; break; APE_CASE_RET( EDOM , __WASI_ERRNO_DOM )
case ERANGE: return __WASI_ERRNO_RANGE; break; APE_CASE_RET( ERANGE , __WASI_ERRNO_RANGE )
default: return __WASI_ERRNO_INVAL; APE_SWITCH_END
} return __WASI_ERRNO_INVAL;
} }
#if defined(_WIN32) #if defined(_WIN32)

@ -247,8 +247,6 @@ IM3CodePage AcquireCodePage (IM3Runtime io_runtime);
IM3CodePage AcquireCodePageWithCapacity (IM3Runtime io_runtime, u32 i_lineCount); IM3CodePage AcquireCodePageWithCapacity (IM3Runtime io_runtime, u32 i_lineCount);
void ReleaseCodePage (IM3Runtime io_runtime, IM3CodePage i_codePage); void ReleaseCodePage (IM3Runtime io_runtime, IM3CodePage i_codePage);
M3Result m3Error (M3Result i_result, IM3Runtime i_runtime, IM3Module i_module, IM3Function i_function, const char * const i_file, u32 i_lineNum, const char * const i_errorMessage, ...);
d_m3EndExternC d_m3EndExternC
#endif // m3_env_h #endif // m3_env_h

Loading…
Cancel
Save