diff --git a/ci/docker/wasm32-unknown-wasi/Dockerfile b/ci/docker/wasm32-unknown-wasi/Dockerfile
index 1017d3695ebf08587464742ba037d4a148450ad3..6f46440457d3c6d91b6700b54e868a6a91d5e357 100644
--- a/ci/docker/wasm32-unknown-wasi/Dockerfile
+++ b/ci/docker/wasm32-unknown-wasi/Dockerfile
@@ -28,7 +28,7 @@ RUN mv /clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04 /wasmcc
 # those breaking changes on `libc`'s own CI
 RUN git clone https://github.com/CraneStation/wasi-sysroot && \
   cd wasi-sysroot && \
-  git reset --hard 3ca44511c298cbbc99e690b761310070b3527fe8
+  git reset --hard e5f14be38362f1ab83302895a6e74b2ffd0e2302
 RUN make -C wasi-sysroot install -j $(nproc) WASM_CC=/wasmcc/bin/clang INSTALL_DIR=/wasi-sysroot
 
 # This is a small wrapper script which executes the actual clang binary in
@@ -72,7 +72,8 @@ RUN apt-get update && \
     apt-get install -y --no-install-recommends \
     gcc \
     libc6-dev \
-    libxml2
+    libxml2 \
+    ca-certificates
 
 # Copy over clang we downloaded to link executables ...
 COPY --from=wasi-sysroot /wasmcc /wasmcc/
diff --git a/libc-test/build.rs b/libc-test/build.rs
index 3d8ddce44c0323492641e50680973f45a0f981eb..6419a3b04f39d0757957a2cff8739656bf913457 100644
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -1890,6 +1890,7 @@ fn test_wasi(target: &str) {
         "unistd.h",
         "wasi/core.h",
         "wasi/libc.h",
+        "wasi/libc-find-relpath.h",
         "wchar.h",
     }
 
diff --git a/src/wasi.rs b/src/wasi.rs
index 6fd3736c15f44f0a4981876fc8c1ae02c4ef5d7f..77c48f50a6010f9111fd696e4596edcd7d4ab770 100644
--- a/src/wasi.rs
+++ b/src/wasi.rs
@@ -396,7 +396,7 @@ pub const __WASI_WHENCE_SET: u8 = 2;
     feature = "rustc-dep-of-std",
     link(name = "c", cfg(not(target_feature = "crt-static")))
 )]
-extern "C" {
+extern {
     pub fn _Exit(code: c_int) -> !;
     pub fn _exit(code: c_int) -> !;
     pub fn abort() -> !;
@@ -455,8 +455,8 @@ extern "C" {
     pub fn puts(a: *const c_char) -> c_int;
     pub fn perror(a: *const c_char);
     pub fn srand(a: c_uint);
-    pub fn atexit(a: extern "C" fn()) -> c_int;
-    pub fn at_quick_exit(a: extern "C" fn()) -> c_int;
+    pub fn atexit(a: extern fn()) -> c_int;
+    pub fn at_quick_exit(a: extern fn()) -> c_int;
     pub fn quick_exit(a: c_int) -> !;
     pub fn posix_memalign(a: *mut *mut c_void, b: size_t, c: size_t) -> c_int;
     pub fn rand_r(a: *mut c_uint) -> c_int;
@@ -497,6 +497,12 @@ extern "C" {
     pub fn __wasilibc_rmfileat(fd: c_int, path: *const c_char) -> c_int;
     pub fn __wasilibc_rmdirat(fd: c_int, path: *const c_char) -> c_int;
     pub fn __wasilibc_init_preopen();
+    pub fn __wasilibc_find_relpath(
+        path: *const c_char,
+        rights_base: __wasi_rights_t,
+        rights_inheriting: __wasi_rights_t,
+        relative_path: *mut *const c_char,
+    ) -> c_int;
 
     pub fn arc4random() -> u32;
     pub fn arc4random_buf(a: *mut c_void, b: size_t);
@@ -504,7 +510,7 @@ extern "C" {
 }
 
 #[link(wasm_import_module = "wasi_unstable")]
-extern "C" {
+extern {
     #[link_name = "clock_res_get"]
     pub fn __wasi_clock_res_get(
         clock_id: __wasi_clockid_t,