Bläddra i källkod

Merge branch 'destructor' into 'master'

Call DSO destructors during exit()

See merge request redox-os/relibc!326
Jeremy Soller 4 år sedan
förälder
incheckning
fb4fa240b7
5 ändrade filer med 19 tillägg och 8 borttagningar
  1. 3 0
      src/header/stdlib/mod.rs
  2. 6 0
      src/ld_so/linker.rs
  3. 9 0
      src/ld_so/mod.rs
  4. 0 1
      src/ld_so/src/lib.rs
  5. 1 7
      tests/Makefile

+ 3 - 0
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);

+ 6 - 0
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,

+ 9 - 0
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();
+        }
+    }
+}

+ 0 - 1
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
         "
         :
         :

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