From ad7534c8f08c31f3e140a31e4099e7e0b5e193d2 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 25 Aug 2000 19:33:19 +0000 Subject: Update. 2000-08-25 Ulrich Drepper * elf/Makefile (LDFLAGS-nodelete): Add -rdynamic. * elf/nodelete.c (fini_ran): New global variable. (do_test): Before every dlclose call clear fini_ran and test afterwards that it is not set by the destructors. * elf/nodelmod1.c: Add destructor which sets fini_ran. * elf/nodelmod2.c: Likewise. * elf/nodelmod4.c: Likewise. --- elf/Makefile | 1 + elf/nodelete.c | 21 +++++++++++++++++++++ elf/nodelmod1.c | 8 ++++++++ elf/nodelmod2.c | 8 ++++++++ elf/nodelmod4.c | 8 ++++++++ 5 files changed, 46 insertions(+) (limited to 'elf') diff --git a/elf/Makefile b/elf/Makefile index 49dd2bcc0e..369aaba693 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -302,6 +302,7 @@ $(objpfx)noload: $(objpfx)testobj1.so LDFLAGS-noload = -rdynamic $(objpfx)noload.out: $(objpfx)testobj5.so +LDFLAGS-nodelete = -rdynamic LDFLAGS-nodelmod1.so = -Wl,--enable-new-dtags,-z,nodelete LDFLAGS-nodelmod4.so = -Wl,--enable-new-dtags,-z,nodelete $(objpfx)nodelete: $(libdl) diff --git a/elf/nodelete.c b/elf/nodelete.c index f8abe1ff9f..bf1f0d9291 100644 --- a/elf/nodelete.c +++ b/elf/nodelete.c @@ -7,6 +7,9 @@ static sigjmp_buf jmpbuf; +int fini_ran; + + static void handler (int sig) { @@ -60,6 +63,7 @@ do_test (void) *varp = 20000720; /* Now close the object. */ + fini_ran = 0; if (dlclose (p) != 0) { puts ("failed to close \"nodelmod1.so\""); @@ -73,6 +77,11 @@ do_test (void) puts ("\"var1\" value not correct"); result = 1; } + else if (fini_ran != 0) + { + puts ("destructor of \"nodelmod1.so\" ran"); + result = 1; + } else puts ("-z nodelete test succeeded"); } @@ -108,6 +117,7 @@ do_test (void) *varp = 42; /* Now close the object. */ + fini_ran = 0; if (dlclose (p) != 0) { puts ("failed to close \"nodelmod2.so\""); @@ -121,6 +131,11 @@ do_test (void) puts ("\"var2\" value not correct"); result = 1; } + else if (fini_ran != 0) + { + puts ("destructor of \"nodelmod2.so\" ran"); + result = 1; + } else puts ("RTLD_NODELETE test succeeded"); } @@ -158,6 +173,7 @@ do_test (void) *varp = -1; /* Now close the object. */ + fini_ran = 0; if (dlclose (p) != 0) { puts ("failed to close \"nodelmod3.so\""); @@ -171,6 +187,11 @@ do_test (void) puts ("\"var_in_mod4\" value not correct"); result = 1; } + else if (fini_ran != 0) + { + puts ("destructor of \"nodelmod4.so\" ran"); + result = 1; + } else puts ("-z nodelete in dependency succeeded"); } diff --git a/elf/nodelmod1.c b/elf/nodelmod1.c index abae539a6c..fc24a7b172 100644 --- a/elf/nodelmod1.c +++ b/elf/nodelmod1.c @@ -1 +1,9 @@ int var1 = 42; + +static void +__attribute__ ((__destructor__)) +destr (void) +{ + extern int fini_ran; + fini_ran = 1; +} diff --git a/elf/nodelmod2.c b/elf/nodelmod2.c index 1dd16e5071..6bd7108a13 100644 --- a/elf/nodelmod2.c +++ b/elf/nodelmod2.c @@ -1 +1,9 @@ int var2 = 100; + +static void +__attribute__ ((__destructor__)) +destr (void) +{ + extern int fini_ran; + fini_ran = 1; +} diff --git a/elf/nodelmod4.c b/elf/nodelmod4.c index 55eb6e6dda..2cca43a6e8 100644 --- a/elf/nodelmod4.c +++ b/elf/nodelmod4.c @@ -1 +1,9 @@ int var_in_mod4 = 99; + +static void +__attribute__ ((__destructor__)) +destr (void) +{ + extern int fini_ran; + fini_ran = 1; +} -- cgit v1.2.3