diff --git a/src/header/stdlib/mod.rs b/src/header/stdlib/mod.rs
index c5fd5d1be102edacaf40a50f38d8fba5308f5d35..daaf72beaf2659ef38d3f3751ebfc74a205e5708 100644
--- a/src/header/stdlib/mod.rs
+++ b/src/header/stdlib/mod.rs
@@ -21,6 +21,7 @@ use crate::{
         unistd::{self, sysconf, _SC_PAGESIZE},
         wchar::*,
     },
+    ld_so,
     platform::{self, types::*, Pal, Sys},
 };
 
@@ -292,6 +293,8 @@ pub unsafe extern "C" fn exit(status: c_int) {
 
     _fini();
 
+    ld_so::fini();
+
     pthread_terminate();
 
     Sys::exit(status);
diff --git a/src/ld_so/linker.rs b/src/ld_so/linker.rs
index 21d35b1804a3b9b4548a0b789b84723626f8cd4f..67bd467477c6ff051aed10c40e32c286ffd231e2 100644
--- a/src/ld_so/linker.rs
+++ b/src/ld_so/linker.rs
@@ -113,6 +113,12 @@ impl Linker {
         }
     }
 
+    pub fn fini(&self) {
+        for obj in self.objects.values() {
+            obj.run_fini();
+        }
+    }
+
     fn load_object(
         &mut self,
         path: &str,
diff --git a/src/ld_so/mod.rs b/src/ld_so/mod.rs
index 7a1324387612d0a9a8aceca53f82dc7be86dba3b..e4e62282b77f16f91ae77fdf0fd4d0d283accd82 100644
--- a/src/ld_so/mod.rs
+++ b/src/ld_so/mod.rs
@@ -108,3 +108,12 @@ pub unsafe fn init(sp: &'static Stack) {
 
 #[cfg(target_os = "redox")]
 pub unsafe fn init(_sp: &'static Stack) {}
+
+pub unsafe fn fini() {
+    if let Some(tcb) = Tcb::current() {
+        if tcb.linker_ptr != ptr::null_mut() {
+            let linker = (&*tcb.linker_ptr).lock();
+            linker.fini();
+        }
+    }
+}
diff --git a/src/ld_so/src/lib.rs b/src/ld_so/src/lib.rs
index 69248ec88a27c83d40aceb31d46a5ecd95467768..d29baa44a4df2917f714a649e0f89bd0e1b4bd3a 100644
--- a/src/ld_so/src/lib.rs
+++ b/src/ld_so/src/lib.rs
@@ -34,7 +34,6 @@ next:   pop rsi
         xor r11, r11
         fninit
         jmp rax
-        # TODO: Loader::fini() should be called about here
         "
         :
         :
diff --git a/tests/Makefile b/tests/Makefile
index 240d88188fa2743073f64d2b1de56d34f7e8f758..cb482cd3f33bc68e5371ae8a3cdc07763887a721 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -6,6 +6,7 @@ EXPECT_NAMES=\
 	assert \
 	constructor \
 	ctype \
+	destructor \
 	dirent/scandir \
 	errno \
 	error \
@@ -119,11 +120,6 @@ EXPECT_NAMES=\
 	# mkfifo
 	# netdb/netdb \
 
-# need to call fini in ld_so's _start
-STATIC_ONLY_NAMES=\
-	destructor
-
-
 DYNAMIC_ONLY_NAMES=\
 	dlfcn
 
@@ -155,11 +151,9 @@ NAMES=\
 #	time/times
 
 BINS=$(patsubst %,bins_static/%,$(NAMES))
-BINS+=$(patsubst %,bins_static/%,$(STATIC_ONLY_NAMES))
 BINS+=$(patsubst %,bins_dynamic/%,$(NAMES))
 BINS+=$(patsubst %,bins_dynamic/%,$(DYNAMIC_ONLY_NAMES))
 EXPECT_BINS=$(patsubst %,bins_static/%,$(EXPECT_NAMES))
-EXPECT_BINS+=$(patsubst %,bins_static/%,$(STATIC_ONLY_NAMES))
 EXPECT_BINS+=$(patsubst %,bins_dynamic/%,$(EXPECT_NAMES))
 EXPECT_BINS+=$(patsubst %,bins_dynamic/%,$(DYNAMIC_ONLY_NAMES))