diff --git a/src/stdlib/src/lib.rs b/src/stdlib/src/lib.rs
index 9c948d6779a381db7afdb911fa20aad476e1f982..53d6d83f5216ca4018a3e8961efdefbb95015990 100644
--- a/src/stdlib/src/lib.rs
+++ b/src/stdlib/src/lib.rs
@@ -323,6 +323,24 @@ pub unsafe extern "C" fn malloc(size: size_t) -> *mut c_void {
     }
 }
 
+#[no_mangle]
+pub unsafe extern "C" fn memalign(alignment: size_t, size: size_t) -> *mut c_void {
+    let mut align = 16;
+    while align <= alignment {
+        align *= 2;
+    }
+
+    let offset = align/2;
+    let ptr = ralloc::alloc(size + offset, align);
+    if !ptr.is_null() {
+        *(ptr as *mut u64) = (size + offset) as u64;
+        *(ptr as *mut u64).offset(1) = align as u64;
+        ptr.offset(offset as isize) as *mut c_void
+    } else {
+        ptr as *mut c_void
+    }
+}
+
 #[no_mangle]
 pub extern "C" fn mblen(s: *const c_char, n: size_t) -> c_int {
     unimplemented!();
diff --git a/tests/alloc.c b/tests/alloc.c
index 784125bcf6b0db7072fe55cf14f84da572bd81c5..6c1d04d045d06310b306f0b18556e05a62120cd8 100644
--- a/tests/alloc.c
+++ b/tests/alloc.c
@@ -10,11 +10,19 @@ int main(int argc, char ** argv) {
     }
     free(ptr);
 
-    char * ptrc = (char *)calloc(256,1);
+    char * ptrc = (char *)calloc(256, 1);
     printf("calloc %p\n", ptrc);
     for(i = 0; i < 256; i++) {
         ptrc[i] = (char)i;
     }
     free(ptrc);
+
+    char * ptra = (char *)memalign(256, 256);
+    printf("memalign %p\n", ptra);
+    for(i = 0; i < 256; i++) {
+        ptra[i] = (char)i;
+    }
+    free(ptra);
+
     return 0;
 }