diff options
Diffstat (limited to 'elf')
-rw-r--r-- | elf/Makefile | 1 | ||||
-rw-r--r-- | elf/nodelete.c | 21 | ||||
-rw-r--r-- | elf/nodelmod1.c | 8 | ||||
-rw-r--r-- | elf/nodelmod2.c | 8 | ||||
-rw-r--r-- | elf/nodelmod4.c | 8 |
5 files changed, 46 insertions, 0 deletions
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; +} |