diff --git a/src/header/sys_socket/mod.rs b/src/header/sys_socket/mod.rs
index a07af00488620029654b7a2b8e5c132d1b888339..53a27f5163dbb1c93eaa512e024d702fefbeb061 100644
--- a/src/header/sys_socket/mod.rs
+++ b/src/header/sys_socket/mod.rs
@@ -92,17 +92,25 @@ pub unsafe extern "C" fn getsockname(
     )
 }
 
-// #[no_mangle]
-// pub unsafe extern "C" fn getsockopt(
-//     socket: c_int,
-//     level: c_int,
-//     option_name: c_int,
-//     option_value: *mut c_void,
-//     option_len: *mut socklen_t,
-// ) -> c_int {
-//     Sys::getsockopt(socket, level, option_name, option_value, option_len)
-// }
-//
+#[no_mangle]
+pub unsafe extern "C" fn getsockopt(
+    socket: c_int,
+    level: c_int,
+    option_name: c_int,
+    option_value: *mut c_void,
+    option_len: *mut socklen_t,
+) -> c_int {
+    trace_expr!(
+        Sys::getsockopt(socket, level, option_name, option_value, option_len),
+        "getsockopt({}, {}, {}, {:p}, {:p})",
+        socket,
+        level,
+        option_name,
+        option_value,
+        option_len
+    )
+}
+
 // #[no_mangle]
 // pub unsafe extern "C" fn listen(socket: c_int, backlog: c_int) -> c_int {
 //     Sys::listen(socket, backlog)
@@ -177,16 +185,24 @@ pub unsafe extern "C" fn sendto(
     )
 }
 
-// #[no_mangle]
-// pub unsafe extern "C" fn setsockopt(
-//     socket: c_int,
-//     level: c_int,
-//     option_name: c_int,
-//     option_value: *const c_void,
-//     option_len: socklen_t,
-// ) -> c_int {
-//     Sys::setsockopt(socket, level, option_name, option_value, option_len)
-// }
+#[no_mangle]
+pub unsafe extern "C" fn setsockopt(
+    socket: c_int,
+    level: c_int,
+    option_name: c_int,
+    option_value: *const c_void,
+    option_len: socklen_t,
+) -> c_int {
+    trace_expr!(
+        Sys::setsockopt(socket, level, option_name, option_value, option_len),
+        "setsockopt({}, {}, {}, {:p}, {})",
+        socket,
+        level,
+        option_name,
+        option_value,
+        option_len
+    )
+}
 
 // #[no_mangle]
 // pub unsafe extern "C" fn shutdown(socket: c_int, how: c_int) -> c_int {
diff --git a/src/platform/linux/socket.rs b/src/platform/linux/socket.rs
index 5370e1e0bd98d4bbcacfc61d8be1e6b88e9a4f32..f38089523d27e5353375097c13e555a0608ec7d5 100644
--- a/src/platform/linux/socket.rs
+++ b/src/platform/linux/socket.rs
@@ -4,48 +4,10 @@ use super::{e, Sys};
 use header::sys_socket::{sockaddr, socklen_t};
 
 impl Sys {
-    fn getsockopt(
-        socket: c_int,
-        level: c_int,
-        option_name: c_int,
-        option_value: *mut c_void,
-        option_len: *mut socklen_t,
-    ) -> c_int {
-        e(unsafe {
-            syscall!(
-                GETSOCKOPT,
-                socket,
-                level,
-                option_name,
-                option_value,
-                option_len
-            )
-        }) as c_int
-    }
-
     fn listen(socket: c_int, backlog: c_int) -> c_int {
         e(unsafe { syscall!(LISTEN, socket, backlog) }) as c_int
     }
 
-    fn setsockopt(
-        socket: c_int,
-        level: c_int,
-        option_name: c_int,
-        option_value: *const c_void,
-        option_len: socklen_t,
-    ) -> c_int {
-        e(unsafe {
-            syscall!(
-                SETSOCKOPT,
-                socket,
-                level,
-                option_name,
-                option_value,
-                option_len
-            )
-        }) as c_int
-    }
-
     fn shutdown(socket: c_int, how: c_int) -> c_int {
         e(unsafe { syscall!(SHUTDOWN, socket, how) }) as c_int
     }
@@ -84,6 +46,25 @@ impl PalSocket for Sys {
         e(syscall!(GETSOCKNAME, socket, address, address_len)) as c_int
     }
 
+    fn getsockopt(
+        socket: c_int,
+        level: c_int,
+        option_name: c_int,
+        option_value: *mut c_void,
+        option_len: *mut socklen_t,
+    ) -> c_int {
+        e(unsafe {
+            syscall!(
+                GETSOCKOPT,
+                socket,
+                level,
+                option_name,
+                option_value,
+                option_len
+            )
+        }) as c_int
+    }
+
     unsafe fn recvfrom(
         socket: c_int,
         buf: *mut c_void,
@@ -116,6 +97,25 @@ impl PalSocket for Sys {
         )) as ssize_t
     }
 
+    fn setsockopt(
+        socket: c_int,
+        level: c_int,
+        option_name: c_int,
+        option_value: *const c_void,
+        option_len: socklen_t,
+    ) -> c_int {
+        e(unsafe {
+            syscall!(
+                SETSOCKOPT,
+                socket,
+                level,
+                option_name,
+                option_value,
+                option_len
+            )
+        }) as c_int
+    }
+
     unsafe fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int {
         e(syscall!(SOCKET, domain, kind, protocol)) as c_int
     }
diff --git a/src/platform/pal/socket.rs b/src/platform/pal/socket.rs
index 38cb2518c4a7cdc37f0526db121fc9ac72d7a2ce..e77945ce9bde16fd2118abc3f0d8605fd6e47c2e 100644
--- a/src/platform/pal/socket.rs
+++ b/src/platform/pal/socket.rs
@@ -21,6 +21,14 @@ pub trait PalSocket: Pal {
         address_len: *mut socklen_t,
     ) -> c_int;
 
+    fn getsockopt(
+        socket: c_int,
+        level: c_int,
+        option_name: c_int,
+        option_value: *mut c_void,
+        option_len: *mut socklen_t,
+    ) -> c_int;
+
     unsafe fn recvfrom(
         socket: c_int,
         buf: *mut c_void,
@@ -39,5 +47,13 @@ pub trait PalSocket: Pal {
         dest_len: socklen_t,
     ) -> ssize_t;
 
+    fn setsockopt(
+        socket: c_int,
+        level: c_int,
+        option_name: c_int,
+        option_value: *const c_void,
+        option_len: socklen_t,
+    ) -> c_int;
+
     unsafe fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int;
 }
diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs
index 39728ff4ba18e3f8f8b3a20977e0ade36ee96043..236fbe21bebaa53476db0377f0629d03b962f269 100644
--- a/src/platform/redox/socket.rs
+++ b/src/platform/redox/socket.rs
@@ -134,6 +134,16 @@ impl PalSocket for Sys {
         e(inner_get_name(true, socket, address, address_len)) as c_int
     }
 
+    fn getsockopt(
+        socket: c_int,
+        level: c_int,
+        option_name: c_int,
+        option_value: *mut c_void,
+        option_len: *mut socklen_t,
+    ) -> c_int {
+        e(Err(syscall::Error::new(syscall::ENOSYS))) as c_int
+    }
+
     unsafe fn recvfrom(
         socket: c_int,
         buf: *mut c_void,
@@ -186,6 +196,16 @@ impl PalSocket for Sys {
         }
     }
 
+    fn setsockopt(
+        socket: c_int,
+        level: c_int,
+        option_name: c_int,
+        option_value: *const c_void,
+        option_len: socklen_t,
+    ) -> c_int {
+        e(Err(syscall::Error::new(syscall::ENOSYS))) as c_int
+    }
+
     unsafe fn socket(domain: c_int, mut kind: c_int, protocol: c_int) -> c_int {
         if domain != AF_INET {
             errno = syscall::EAFNOSUPPORT;