diff --git a/src/header/string/mod.rs b/src/header/string/mod.rs
index 320f3bbebc5c26f829d2e7b2dd39ef97cf887501..ffedf79d67aa485a5dc6958e6aa002c2f01b1a4a 100644
--- a/src/header/string/mod.rs
+++ b/src/header/string/mod.rs
@@ -461,3 +461,25 @@ pub unsafe extern "C" fn strxfrm(s1: *mut c_char, s2: *const c_char, n: size_t)
     }
     len
 }
+
+#[no_mangle]
+pub unsafe extern "C" fn strlcpy(dst: *mut c_char, src: *const c_char, n: size_t) -> size_t {
+    let mut i = 0;
+
+    while *src.add(i) != 0 && i < n {
+        *dst.add(i) = *src.add(i);
+        i += 1;
+    }
+
+    *dst.add(i) = 0;
+
+    i as size_t
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn strlcat(dst: *mut c_char, src: *const c_char, n: size_t) -> size_t {
+    let len = strlen(dst) as isize;
+    let mut d = dst.offset(len);
+
+    strlcpy(d, src, n)
+}
diff --git a/tests/expected/bins_static/string/strcpy.stdout b/tests/expected/bins_static/string/strcpy.stdout
index 84caf120d631da5d3ad544722fa9360c41029fc2..0152da433f4e79607b249c2519eb7b4e3ac86eae 100644
--- a/tests/expected/bins_static/string/strcpy.stdout
+++ b/tests/expected/bins_static/string/strcpy.stdout
@@ -1,3 +1,7 @@
 strcpy works!
 strncpy works!
 strncpy shaaaaaaaaa
+strlcpy works!
+copied 14
+strlcpy works! and strlcat!
+copied 13
diff --git a/tests/string/strcpy.c b/tests/string/strcpy.c
index d78d26e51b9c96f4568891c6da6c0ef69ba94cdb..25b02763178b10e8584f86b5e6f5e2b01f993f76 100644
--- a/tests/string/strcpy.c
+++ b/tests/string/strcpy.c
@@ -16,4 +16,14 @@ int main(void) {
     dst[19] = 0;
     strncpy(dst, "strncpy should work here too", 10);
     puts(dst);
+
+    // The string should be properly terminated regardless
+    char ndst[28];
+
+    size_t r = strlcpy(ndst, "strlcpy works!", 28);
+    puts(ndst);
+    printf("copied %lu\n", r);
+    r = strlcat(ndst, " and strlcat!", 28);
+    puts(ndst);
+    printf("copied %lu\n", r);
 }