diff --git a/src/header/wchar/mod.rs b/src/header/wchar/mod.rs
index 19d8fbea62066369724494f4af6abf9a07961519..00fc9365a1030905b600849e3a1d9cd8441621d5 100644
--- a/src/header/wchar/mod.rs
+++ b/src/header/wchar/mod.rs
@@ -430,9 +430,19 @@ pub extern "C" fn wcspbrk(ws1: *const wchar_t, ws2: *const wchar_t) -> *mut wcha
     unimplemented!();
 }
 
-// #[no_mangle]
-pub extern "C" fn wcsrchr(ws1: *const wchar_t, ws2: wchar_t) -> *mut wchar_t {
-    unimplemented!();
+#[no_mangle]
+pub unsafe extern "C" fn wcsrchr(ws1: *const wchar_t, wc: wchar_t) -> *mut wchar_t {
+    let mut last_matching_wc = 0 as *const wchar_t;
+    let mut i = 0;
+
+    while *ws1.add(i) != 0 {
+        if *ws1.add(i) == wc {
+            last_matching_wc = ws1.add(i);
+        }
+        i += 1;
+    }
+
+    last_matching_wc as *mut wchar_t
 }
 
 // #[no_mangle]
diff --git a/tests/Makefile b/tests/Makefile
index 0ae8aa78680963d41af4aff816f3485a8d64c82d..b2e5396fdc01373def7ca24cbf6a14841563fb99 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -87,7 +87,8 @@ EXPECT_BINS=\
 	wchar/mbsrtowcs \
 	wchar/putwchar \
 	wchar/wcrtomb \
-	wchar/wcscspn
+	wchar/wcscspn \
+	wchar/wcsrchr
 
 # Binaries that may generate varied output
 BINS=\
diff --git a/tests/expected/wchar/wcsrchr.stderr b/tests/expected/wchar/wcsrchr.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/wchar/wcsrchr.stdout b/tests/expected/wchar/wcsrchr.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/wchar/wcsrchr.c b/tests/wchar/wcsrchr.c
new file mode 100644
index 0000000000000000000000000000000000000000..08b43ea0fc368bf47ade150ef218c5f5901594ba
--- /dev/null
+++ b/tests/wchar/wcsrchr.c
@@ -0,0 +1,24 @@
+#include <assert.h>
+#include <wchar.h>
+
+int main() {
+    wchar_t *s;
+
+    assert(wcsrchr(L"", L'a') == NULL);
+    
+    s = L"a";
+    assert(wcsrchr(s, L'a') == s);
+
+    s = L"aa";
+    assert(wcsrchr(s, L'a') == s + 1);
+
+    s = L"aab";
+    assert(wcsrchr(s, L'a') == s + 1);
+    
+    s = L"abcdef!\"£$%^e&*";
+    assert(wcsrchr(s, L'g') == NULL);
+    assert(wcsrchr(s, L'\"') == s + 7);
+    assert(wcsrchr(s, L'e') == s + 12);
+
+    return 0;
+}