Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Update.
2002-06-30 Ulrich Drepper <drepper@redhat.com> * elf/dl-lookup.c (add_dependency): It is not necessary to add dependencies if they are created between objects which are created while processing RTLD_NOW for objects loaded as part of the same dlopen call. 2002-06-14 H.J. Lu <hjl@gnu.org> * elf/Makefile (tests): Add circleload1. (modules-names): Add circlemod1, circlemod2, circlemod3, circlemod1a, circlemod2a and circlemod3a. ($(objpfx)circleload1): New target. ($(objpfx)circleload1.out): Likewise. ($(objpfx)circlemod1.so): Likewise. ($(objpfx)circlemod2.so): Likewise. ($(objpfx)circlemod1a.so): Likewise. ($(objpfx)circlemod2a.so): Likewise. * elf/circleload1.c: New file. * elf/circlemod1.c: New file. * elf/circlemod1a.c: New file. * elf/circlemod2.c: New file. * elf/circlemod2a.c: New file. * elf/circlemod3.c: New file. * elf/circlemod3a.c: New file.
- Loading branch information
Ulrich Drepper
committed
Jun 30, 2002
1 parent
95fdc6a
commit 6d78cd0
Showing
10 changed files
with
225 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
#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; | ||
} | ||
|
||
static int | ||
load_dso (const char **loading, int undef, int flag) | ||
{ | ||
void *obj; | ||
const char *loaded[] = { NULL, NULL, NULL, NULL }; | ||
int errors = 0; | ||
const char *errstring; | ||
|
||
printf ("\nThis is what is in memory now:\n"); | ||
errors += check_loaded_objects (loaded); | ||
|
||
printf ("Loading shared object %s: %s\n", loading [0], | ||
flag == RTLD_LAZY ? "RTLD_LAZY" : "RTLD_NOW"); | ||
obj = dlopen (loading [0], flag); | ||
if (obj == NULL) | ||
{ | ||
if (flag == RTLD_LAZY) | ||
{ | ||
++errors; | ||
printf ("ERRORS: dlopen shouldn't fail for RTLD_LAZY\n"); | ||
} | ||
|
||
errstring = dlerror (); | ||
if (strstr (errstring, "undefined symbol") == 0 | ||
|| strstr (errstring, "circlemod2_undefined") == 0) | ||
{ | ||
++errors; | ||
printf ("ERRORS: dlopen: `%s': Invalid error string\n", | ||
errstring); | ||
} | ||
else | ||
printf ("dlopen: %s\n", errstring); | ||
} | ||
else | ||
{ | ||
if (undef && flag == RTLD_NOW) | ||
{ | ||
++errors; | ||
printf ("ERRORS: dlopen shouldn't work for RTLD_NOW\n"); | ||
} | ||
|
||
loaded[0] = loading [0]; | ||
loaded[1] = loading [1]; | ||
loaded[2] = loading [2]; | ||
} | ||
errors += check_loaded_objects (loaded); | ||
|
||
if (obj) | ||
{ | ||
printf ("UnLoading shared object %s\n", loading [0]); | ||
dlclose (obj); | ||
loaded[0] = NULL; | ||
loaded[1] = NULL; | ||
loaded[2] = NULL; | ||
errors += check_loaded_objects (loaded); | ||
} | ||
|
||
return errors; | ||
} | ||
|
||
int | ||
main (void) | ||
{ | ||
int errors = 0; | ||
const char *loading[3]; | ||
|
||
loading [0] = "circlemod1a.so"; | ||
loading [1] = "circlemod2a.so"; | ||
loading [2] = "circlemod3a.so"; | ||
errors += load_dso (loading, 0, RTLD_LAZY); | ||
errors += load_dso (loading, 0, RTLD_NOW); | ||
|
||
loading [0] = "circlemod1.so"; | ||
loading [1] = "circlemod2.so"; | ||
loading [2] = "circlemod3.so"; | ||
errors += load_dso (loading, 1, RTLD_LAZY); | ||
errors += load_dso (loading, 1, RTLD_NOW); | ||
|
||
if (errors != 0) | ||
printf ("%d errors found\n", errors); | ||
|
||
return errors; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
extern void circlemod2 (void); | ||
|
||
void | ||
circlemod1 (void) | ||
{ | ||
circlemod2 (); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
#include "circlemod1.c" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
extern void circlemod2_undefined (void); | ||
extern void circlemod3 (void); | ||
|
||
void | ||
circlemod2 (void) | ||
{ | ||
circlemod2_undefined (); | ||
circlemod3 (); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
extern void circlemod3 (void); | ||
|
||
void | ||
circlemod2 (void) | ||
{ | ||
circlemod3 (); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
extern void circlemod1 (void); | ||
extern void circlemod2 (void); | ||
|
||
void | ||
circlemod3 (void) | ||
{ | ||
circlemod1 (); | ||
circlemod2 (); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
#include "circlemod3.c" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters