diff --git a/libc/Makefile b/libc/Makefile
index 963cde43..ae6f5b97 100644
--- a/libc/Makefile
+++ b/libc/Makefile
@@ -192,6 +192,7 @@ string/memchr.o \
string/memcmp.o \
string/memcpy.o \
string/memmove.o \
+string/memrchr.o \
string/memset.o \
string/stpcpy.o \
string/stpncpy.o \
diff --git a/libc/include/string.h b/libc/include/string.h
index 67cd4aae..c3baac4b 100644
--- a/libc/include/string.h
+++ b/libc/include/string.h
@@ -125,6 +125,7 @@ size_t strxfrm_l(char* __restrict, const char* __restrict, size_t, locale_t);
/* Functions copied from elsewhere. */
#if __USE_SORTIX
int ffsl(long int);
+void* memrchr(const void*, int, size_t);
/* TODO: strcasecmp_l */
char* strchrnul(const char* str, int c);
size_t strlcat(char* __restrict, const char* __restrict, size_t);
diff --git a/libc/string/memrchr.cpp b/libc/string/memrchr.cpp
new file mode 100644
index 00000000..735a0210
--- /dev/null
+++ b/libc/string/memrchr.cpp
@@ -0,0 +1,35 @@
+/*******************************************************************************
+
+ Copyright(C) Jonas 'Sortie' Termansen 2014.
+
+ This file is part of the Sortix C Library.
+
+ The Sortix C Library is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or (at your
+ option) any later version.
+
+ The Sortix C Library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with the Sortix C Library. If not, see .
+
+ string/memrchr.cpp
+ Scans memory in reverse directory for a character.
+
+*******************************************************************************/
+
+#include
+#include
+
+extern "C" void* memrchr(const void* ptr, int c, size_t n)
+{
+ const unsigned char* buf = (const unsigned char*) ptr;
+ for ( size_t i = n; i != 0; i-- )
+ if ( buf[i-1] == (unsigned char) c )
+ return (void*) (buf + i-1);
+ return NULL;
+}