OSDN Git Service

Added test for RTLD_GLOBAL flag in _dl_find_hash().
authorJoakim Tjernlund <joakim.tjernlund@transmode.se>
Thu, 26 Aug 2004 14:00:04 +0000 (14:00 -0000)
committerJoakim Tjernlund <joakim.tjernlund@transmode.se>
Thu, 26 Aug 2004 14:00:04 +0000 (14:00 -0000)
Fixed a bug in libdl.c where the RTLD_GLOBAL was assigned
wronly.

ldso/ldso/dl-hash.c
ldso/libdl/libdl.c

index 109ee0e..bac4a50 100644 (file)
@@ -173,6 +173,8 @@ char *_dl_find_hash(const char *name, struct dyn_elf *rpnt, int type_class)
        for (; rpnt; rpnt = rpnt->next) {
                tpnt = rpnt->dyn;
 
+               if (!(tpnt->rtld_flags & RTLD_GLOBAL))
+                       continue;
                /* Don't search the executable when resolving a copy reloc. */
                if ((type_class &  ELF_RTYPE_CLASS_COPY) && tpnt->libtype == elf_executable)
                        continue;
index 6c4e984..8199a75 100644 (file)
@@ -223,13 +223,14 @@ void *dlopen(const char *libname, int flag)
                                _dl_memset (dyn_ptr->next, 0, sizeof (struct dyn_elf));
                                dyn_ptr = dyn_ptr->next;
                                dyn_ptr->dyn = tpnt1;
-                               tpnt->rtld_flags |= RTLD_GLOBAL;
                                if (!tpnt1) {
                                        tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr, 0);
+                                       dyn_ptr->dyn = tpnt1;
                                        if (!tpnt1)
                                                goto oops;
-                                       dyn_ptr->dyn = tpnt1;
+                                       tpnt1->rtld_flags |= RTLD_GLOBAL;
                                } else {
+                                       tpnt1->rtld_flags |= RTLD_GLOBAL;
                                        tpnt1->usage_count++;
                                }
                        }