This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
A new testcase for dynamic linker
- To: GNU C Library <libc-alpha at sourceware dot cygnus dot com>
- Subject: A new testcase for dynamic linker
- From: "H . J . Lu" <hjl at valinux dot com>
- Date: Thu, 28 Dec 2000 12:27:26 -0800
Here is a new testcase for
http://sources.redhat.com/ml/libc-alpha/2000-12/msg00179.html
--
H.J. Lu (hjl@valinux.com)
---
2000-12-28 H.J. Lu <hjl@gnu.org>
* elf/neededtest4.c: New file.
* elf/neededobj5.c: New file.
* elf/neededobj6.c: New file.
* elf/Makefile (distribute): Add neededobj5.c and neededobj6.c.
(tests): Add neededtest4.
(modules-names): Add neededobj5 and neededobj6.
($(objpfx)neededobj6.so): New target.
($(objpfx)neededtest4): New target.
($(objpfx)neededtest4.out): New target.
Index: elf/Makefile
===================================================================
RCS file: /work/cvs/gnu/glibc/elf/Makefile,v
retrieving revision 1.1.1.21
diff -u -p -r1.1.1.21 Makefile
--- elf/Makefile 2000/12/19 23:14:27 1.1.1.21
+++ elf/Makefile 2000/12/28 20:07:35
@@ -55,6 +55,7 @@ distribute := $(rtld-routines:=.c) dynam
reldepmod1.c reldepmod2.c reldepmod3.c reldepmod4.c \
nextmod1.c nextmod2.c pathoptobj.c tst-pathopt.sh \
neededobj1.c neededobj2.c neededobj3.c neededobj4.c \
+ neededobj5.c neededobj6.c \
unload2mod.c unload2dep.c ltglobmod1.c ltglobmod2.c \
testobj.h vismod.h
@@ -100,7 +101,7 @@ tests = loadtest restest1 preloadtest lo
constload1 order $(tests-vis-$(have-protected)) noload filter unload \
reldep reldep2 reldep3 next $(tests-nodelete-$(have-z-nodelete)) \
$(tests-nodlopen-$(have-z-nodlopen)) neededtest neededtest2 \
- neededtest3 unload2 lateglobal
+ neededtest3 neededtest4 unload2 lateglobal
test-srcs = tst-pathopt
tests-vis-yes = vismain
tests-nodelete-yes = nodelete
@@ -113,6 +114,7 @@ modules-names = testobj1 testobj2 testob
$(modules-nodlopen-$(have-z-nodlopen)) filtmod1 filtmod2 \
reldepmod1 reldepmod2 reldepmod3 reldepmod4 nextmod1 nextmod2 \
neededobj1 neededobj2 neededobj3 neededobj4 \
+ neededobj5 neededobj6 \
unload2mod unload2dep ltglobmod1 ltglobmod2 pathoptobj
modules-vis-yes = vismod1 vismod2 vismod3
modules-nodelete-yes = nodelmod1 nodelmod2 nodelmod3 nodelmod4
@@ -263,6 +265,7 @@ $(objpfx)neededobj2.so: $(objpfx)neededo
$(objpfx)neededobj3.so: $(objpfx)neededobj1.so $(objpfx)neededobj2.so $(libdl)
$(objpfx)neededobj4.so: $(objpfx)neededobj1.so $(objpfx)neededobj2.so \
$(objpfx)neededobj3.so $(libdl)
+$(objpfx)neededobj6.so: $(objpfx)neededobj5.so
$(objpfx)unload2mod.so: $(objpfx)unload2dep.so
$(objpfx)ltglobmod2.so: $(libdl)
@@ -286,6 +289,9 @@ $(objpfx)neededtest2.out: $(objpfx)neede
$(objpfx)neededtest3: $(libdl)
$(objpfx)neededtest3.out: $(objpfx)neededobj1.so $(objpfx)neededobj2.so \
$(objpfx)neededobj3.so $(objpfx)neededobj4.so
+
+$(objpfx)neededtest4: $(libdl) $(objpfx)neededobj1.so
+$(objpfx)neededtest4.out: $(objpfx)neededobj5.so $(objpfx)neededobj6.so
$(objpfx)restest1: $(objpfx)testobj1.so $(objpfx)testobj1_1.so $(libdl)
LDFLAGS-restest1 = -rdynamic
--- /dev/null Thu Aug 24 02:00:32 2000
+++ elf/neededobj6.c Thu Dec 28 12:14:59 2000
@@ -0,0 +1,7 @@
+extern void a1_function (void);
+extern void a2_function (void);
+
+void a2_function (void)
+{
+ a1_function ();
+}
--- /dev/null Thu Aug 24 02:00:32 2000
+++ elf/neededobj5.c Thu Dec 28 12:14:47 2000
@@ -0,0 +1,5 @@
+extern void a1_function (void);
+
+void a1_function (void)
+{
+}
--- /dev/null Thu Aug 24 02:00:32 2000
+++ elf/neededtest4.c Thu Dec 28 12:24:53 2000
@@ -0,0 +1,156 @@
+#include <dlfcn.h>
+#include <libintl.h>
+#include <link.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static int
+check_loaded_objects (const char **loaded)
+{
+ struct link_map *lm;
+ int n;
+ int *found = NULL;
+ int errors = 0;
+
+ for (n = 0; loaded[n]; n++)
+ /* NOTHING */;
+
+ if (n)
+ {
+ found = (int *) alloca (sizeof (int) * n);
+ memset (found, 0, sizeof (int) * n);
+ }
+
+ printf(" Name\n");
+ printf(" --------------------------------------------------------\n");
+ for (lm = _r_debug.r_map; lm; lm = lm->l_next)
+ {
+ if (lm->l_name && lm->l_name[0])
+ printf(" %s, count = %d\n", lm->l_name, (int) lm->l_opencount);
+ if (lm->l_type == lt_loaded && lm->l_name)
+ {
+ int match = 0;
+ for (n = 0; loaded[n] != NULL; n++)
+ {
+ if (strcmp (basename (loaded[n]), basename (lm->l_name)) == 0)
+ {
+ found[n] = 1;
+ match = 1;
+ break;
+ }
+ }
+
+ if (match == 0)
+ {
+ ++errors;
+ printf ("ERRORS: %s is not unloaded\n", lm->l_name);
+ }
+ }
+ }
+
+ for (n = 0; loaded[n] != NULL; n++)
+ {
+ if (found[n] == 0)
+ {
+ ++errors;
+ printf ("ERRORS: %s is not loaded\n", loaded[n]);
+ }
+ }
+
+ return errors;
+}
+
+extern void c_function (void);
+extern char *dirname (__const char *__filename);
+
+int
+main (int argc, char **argv)
+{
+ void *obj;
+ const char *loaded[] = { NULL, NULL, NULL};
+ int errors = 0;
+ void (*f) (void);
+ const char *dir = dirname (argv [0]);
+ char *oldfilename;
+ char *newfilename;
+
+ c_function ();
+
+ printf ("\nThis is what is in memory now:\n");
+ errors += check_loaded_objects (loaded);
+
+ printf( "Loading shared object neededobj6.so\n");
+ obj = dlopen( "neededobj6.so", RTLD_LAZY);
+ if (obj == NULL)
+ {
+ printf ("%s\n", dlerror ());
+ exit (1);
+ }
+ f = dlsym (obj, "a2_function");
+ if (f == NULL)
+ {
+ printf ("%s\n", dlerror ());
+ exit (1);
+ }
+ f ();
+ loaded[0] = "neededobj5.so";
+ loaded[1] = "neededobj6.so";
+ errors += check_loaded_objects (loaded);
+
+ printf ("Closing neededobj6.so\n");
+ dlclose (obj);
+ loaded[0] = NULL;
+ errors += check_loaded_objects (loaded);
+
+ printf ("Rename neededobj5.so\n");
+ oldfilename = alloca (strlen (dir) + 1 + sizeof ("neededobj5.so"));
+ strcpy (oldfilename, dir);
+ strcat (oldfilename, "/");
+ strcat (oldfilename, "neededobj5.so");
+ newfilename = alloca (strlen (oldfilename) + sizeof (".renamed"));
+ strcpy (newfilename, oldfilename);
+ strcat (newfilename, ".renamed");
+ if (rename (oldfilename, newfilename))
+ {
+ perror ("rename");
+ exit (1);
+ }
+
+ printf( "Loading shared object neededobj6.so\n");
+ obj = dlopen( "neededobj6.so", RTLD_LAZY);
+ if (obj == NULL)
+ printf ("%s\n", dlerror ());
+ else
+ {
+ printf ("neededobj6.so should fail to load\n");
+ exit (1);
+ }
+
+ printf( "Loading shared object neededobj1.so\n");
+ obj = dlopen( "neededobj1.so", RTLD_LAZY);
+ if (obj == NULL)
+ {
+ printf ("%s\n", dlerror ());
+ exit (1);
+ }
+ errors += check_loaded_objects (loaded);
+ f = dlsym (obj, "c_function");
+ if (f == NULL)
+ {
+ printf ("%s\n", dlerror ());
+ exit (1);
+ }
+ f ();
+
+ printf ("Restore neededobj5.so\n");
+ if (rename (newfilename, oldfilename))
+ {
+ perror ("rename");
+ exit (1);
+ }
+
+ if (errors != 0)
+ printf ("%d errors found\n", errors);
+ return errors;
+}