diff --git a/ChangeLog b/ChangeLog index dc3b95728c..0cdf129ee4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2000-10-23 Ulrich Drepper + * include/link.h (struct link_map): New bit field l_faked. + * elf/dl-deps.c: Use l_faked field in struct link_map instead of + the magic l_opencount==0. + * elf/dl-load.c: Likewise. + * elf/dl-version.c: Likewise. + * elf/rtld.c: Likewise. + * elf/dl-close.c (_dl_close): Add a few more __builtin_expect. 2000-10-23 Jim Meyering diff --git a/elf/dl-deps.c b/elf/dl-deps.c index 566073eb7a..c4582926b8 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -495,7 +495,7 @@ _dl_map_object_deps (struct link_map *map, for (nlist = 0, runp = known; runp; runp = runp->unique) { - if (trace_mode && runp->map->l_opencount == 0) + if (trace_mode && runp->map->l_faked) /* This can happen when we trace the loading. */ --map->l_searchlist.r_nlist; else @@ -516,7 +516,7 @@ _dl_map_object_deps (struct link_map *map, map->l_searchlist.r_duplist = map->l_searchlist.r_list + nlist; for (cnt = 0, runp = known; runp; runp = runp->dup) - if (trace_mode && runp->map->l_opencount == 0) + if (trace_mode && runp->map->l_faked) /* This can happen when we trace the loading. */ --map->l_searchlist.r_nduplist; else diff --git a/elf/dl-load.c b/elf/dl-load.c index 6f5f33657a..bb3a2e3187 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1679,10 +1679,10 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded, || (l = _dl_new_object (name_copy, name, type, loader)) == NULL) _dl_signal_error (ENOMEM, name, N_("cannot create shared object descriptor")); - /* We use an opencount of 0 as a sign for the faked entry. - Since the descriptor is initialized with zero we do not + /* Signal that this is a faked entry. */ + l->l_faked = 1; + /* Since the descriptor is initialized with zero we do not have do this here. - l->l_opencount = 0; l->l_reserved = 0; */ l->l_buckets = &dummy_bucket; l->l_nbuckets = 1; diff --git a/elf/dl-version.c b/elf/dl-version.c index 504287c209..bb0fc71e9d 100644 --- a/elf/dl-version.c +++ b/elf/dl-version.c @@ -219,7 +219,7 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode) /* Make sure this is no stub we created because of a missing dependency. */ if (__builtin_expect (! trace_mode, 1) - || __builtin_expect (needed->l_opencount, 1) != 0) + || ! __builtin_expect (needed->l_faked, 0)) { /* NEEDED is the map for the file we need. Now look for the dependency symbols. */ @@ -375,8 +375,7 @@ _dl_check_all_versions (struct link_map *map, int verbose, int trace_mode) int result = 0; for (l = map; l != NULL; l = l->l_next) - result |= (l->l_opencount != 0 - && _dl_check_map_versions (l, verbose, trace_mode)); + result |= ! l->l_faked && _dl_check_map_versions (l, verbose, trace_mode); return result; } diff --git a/elf/rtld.c b/elf/rtld.c index d17d83961d..ea5d7b5a3d 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -891,7 +891,7 @@ of this helper program; chances are you did not intend to run this program.\n\ struct link_map *l; for (l = _dl_loaded->l_next; l; l = l->l_next) - if (l->l_opencount == 0) + if (l->l_faked) /* The library was not found. */ _dl_sysdep_message ("\t", l->l_libname->name, " => not found\n", NULL); @@ -948,7 +948,7 @@ of this helper program; chances are you did not intend to run this program.\n\ l = l->l_next; do { - if (l != &_dl_rtld_map && l->l_opencount > 0) + if (l != &_dl_rtld_map && ! l->l_faked) { args.l = l; _dl_receive_error (print_unresolved, relocate_doit, diff --git a/include/link.h b/include/link.h index 4c04099891..bb931f2607 100644 --- a/include/link.h +++ b/include/link.h @@ -180,6 +180,8 @@ struct link_map to by `l_phdr' is allocated. */ unsigned int l_soname_added:1; /* Nonzero if the SONAME is for sure in the l_libname list. */ + unsigned int l_faked:1; /* Nonzero if this is a faked descriptor + without associated file. */ /* Array with version names. */ unsigned int l_nversions; @@ -202,7 +204,7 @@ struct link_map ElfW(Addr) l_map_start, l_map_end; /* This is an array defining the lookup scope for this link map. - There are at most three different scope lists. */ + There are at most three different scope lists. */ struct r_scope_elem *l_scope[4]; /* A similar array, this time only with the local scope. This is