diff --git a/src/linkers/emscripten/README.md b/src/linkers/emscripten/README.md
index 4d4df4c94..38ac482e0 100644
--- a/src/linkers/emscripten/README.md
+++ b/src/linkers/emscripten/README.md
@@ -150,7 +150,7 @@
```
- exit - _[__syscall1](#__syscall1)_ [:top:](#emscripten-syscalls)
```rust
-fn exit(error_code: usize)
+fn exit(status: c_int)
```
- faccessat - _[__syscall307](#__syscall307)_ [:top:](#emscripten-syscalls)
```rust
@@ -289,7 +289,7 @@ fn exit(error_code: usize)
```
- open - _[__syscall5](#__syscall5)_ [:top:](#emscripten-syscalls)
```rust
-fn open(pathname: *const char, flags: usize, mode: usize) -> usize
+fn open(path: *const c_char, oflag: c_int, ...) -> c_int
```
- openat - _[__syscall295](#__syscall295)_ [:top:](#emscripten-syscalls)
```rust
diff --git a/src/linkers/emscripten/mod.rs b/src/linkers/emscripten/mod.rs
index 64d1e4037..b269a6300 100644
--- a/src/linkers/emscripten/mod.rs
+++ b/src/linkers/emscripten/mod.rs
@@ -3,6 +3,7 @@ use crate::webassembly::{ImportObject, ImportValue};
mod abort;
mod printf;
mod putchar;
+mod syscalls;
pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> {
let mut import_object = ImportObject::new();
@@ -10,6 +11,10 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> {
import_object.set("env", "putchar", ImportValue::Func(putchar::putchar as *const u8));
import_object.set("env", "abort", ImportValue::Func(abort::abort as *const u8));
import_object.set("env", "_abort", ImportValue::Func(abort::abort as *const u8));
+ // SYSCALLS
+ import_object.set("env", "__syscall1", ImportValue::Func(syscalls::__syscall1 as *const u8));
+ import_object.set("env", "__syscall3", ImportValue::Func(syscalls::__syscall3 as *const u8));
+ import_object.set("env", "__syscall5", ImportValue::Func(syscalls::__syscall5 as *const u8));
import_object
}
diff --git a/src/linkers/emscripten/syscalls/darwin/mod.rs b/src/linkers/emscripten/syscalls/darwin/mod.rs
new file mode 100644
index 000000000..1d7397e2f
--- /dev/null
+++ b/src/linkers/emscripten/syscalls/darwin/mod.rs
@@ -0,0 +1 @@
+pub mod syscalls;
diff --git a/src/linkers/emscripten/syscalls/darwin/syscalls.rs b/src/linkers/emscripten/syscalls/darwin/syscalls.rs
new file mode 100644
index 000000000..dc7a64ff4
--- /dev/null
+++ b/src/linkers/emscripten/syscalls/darwin/syscalls.rs
@@ -0,0 +1,25 @@
+use libc::{
+ c_int,
+ c_void,
+ c_char,
+ size_t,
+ ssize_t,
+ open,
+ exit,
+ read,
+};
+
+/// exit
+pub extern "C" fn __syscall1(status: c_int) {
+ unsafe { exit(status); }
+}
+
+/// read
+pub extern "C" fn __syscall3(fd: c_int, buf: *mut c_void, count: size_t) -> ssize_t {
+ unsafe { read(fd, buf, count) }
+}
+
+/// open
+pub extern "C" fn __syscall5(path: *const c_char, oflag: c_int) -> c_int {
+ unsafe { open(path, oflag) }
+}
diff --git a/src/linkers/emscripten/syscalls/mod.rs b/src/linkers/emscripten/syscalls/mod.rs
new file mode 100644
index 000000000..8b5a6894d
--- /dev/null
+++ b/src/linkers/emscripten/syscalls/mod.rs
@@ -0,0 +1,3 @@
+mod darwin;
+
+pub use self::darwin::syscalls::*;