From 61e0617ac34c4daaeb2f07f89a05c9f9353b8879 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 19 Feb 1999 00:00:05 +0000 Subject: Update. * elf/link.h (link_map): Add l_dev and l_ino. * elf/dl-load.c (_dl_map_object_from_fd): Test dev/ino of newly loaded shared object with all laoded objects. Initialize l_ino and l_dev in case it's new. * elf/rtld.c (dl_main): Explain situation is l_dev/l_ino with main object. * elf/Makefile: Compile and run new test. * elf/multiload.c: New file. --- elf/multiload.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 elf/multiload.c (limited to 'elf/multiload.c') diff --git a/elf/multiload.c b/elf/multiload.c new file mode 100644 index 0000000000..724c1ed562 --- /dev/null +++ b/elf/multiload.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include +#include + +int +main (void) +{ + void *a; + void *b; + void *c; + void *d; + char *wd; + char *base; + char *buf; + + /* Change to the binary directory. */ + if (chdir (OBJDIR) != 0) + { + printf ("cannot change to `%s': %m", OBJDIR); + exit (EXIT_FAILURE); + } + + wd = getcwd (NULL, 0); + base = basename (wd); + buf = alloca (strlen (wd) + strlen (base) + 5 + sizeof "testobj1.so"); + + printf ("loading `%s'\n", "./testobj1.so"); + a = dlopen ("./testobj1.so", RTLD_NOW); + if (a == NULL) + { + printf ("cannot load `./testobj1.so': %s\n", dlerror ()); + exit (EXIT_FAILURE); + } + + stpcpy (stpcpy (stpcpy (buf, "../"), base), "/testobj1.so"); + printf ("loading `%s'\n", buf); + b = dlopen (buf, RTLD_NOW); + if (b == NULL) + { + printf ("cannot load `%s': %s\n", buf, dlerror ()); + exit (EXIT_FAILURE); + } + + stpcpy (stpcpy (buf, wd), "/testobj1.so"); + printf ("loading `%s'\n", buf); + c = dlopen (buf, RTLD_NOW); + if (c == NULL) + { + printf ("cannot load `%s': %s\n", buf, dlerror ()); + exit (EXIT_FAILURE); + } + + stpcpy (stpcpy (stpcpy (stpcpy (buf, wd), "/../"), base), "/testobj1.so"); + printf ("loading `%s'\n", buf); + d = dlopen (buf, RTLD_NOW); + if (d == NULL) + { + printf ("cannot load `%s': %s\n", buf, dlerror ()); + exit (EXIT_FAILURE); + } + + if (a != b || b != c || c != d) + { + puts ("shared object loaded more than once"); + exit (EXIT_FAILURE); + } + + return 0; +} + +int +foo (int a) +{ + return a; +} -- cgit v1.2.3