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))