OSDN Git Service

mips/libdl: Apply relocations after appending the new scope
authorKhem Raj <raj.khem@gmail.com>
Sat, 21 Jan 2012 08:21:41 +0000 (00:21 -0800)
committerKhem Raj <raj.khem@gmail.com>
Tue, 24 Jan 2012 00:10:21 +0000 (16:10 -0800)
Without this the relocations for the current shared object
are not resolved since the scope is not added to map yet

Signed-off-by: Khem Raj <raj.khem@gmail.com>
ldso/libdl/libdl.c

index bc3ef8a..32afe1c 100644 (file)
@@ -543,6 +543,12 @@ static void *do_dlopen(const char *libname, int flag)
         * Now we go through and look for REL and RELA records that indicate fixups
         * to the GOT tables.  We need to do this in reverse order so that COPY
         * directives work correctly */
+
+       /* Get the tail of the list */
+       for (ls = &_dl_loaded_modules->symbol_scope; ls && ls->next; ls = ls->next);
+
+       /* Extend the global scope by adding the local scope of the dlopened DSO. */
+       ls->next = &dyn_chain->dyn->symbol_scope;
 #ifdef __mips__
        /*
         * Relocation of the GOT entries for MIPS have to be done
@@ -550,11 +556,6 @@ static void *do_dlopen(const char *libname, int flag)
         */
        _dl_perform_mips_global_got_relocations(tpnt, !now_flag);
 #endif
-       /* Get the tail of the list */
-       for (ls = &_dl_loaded_modules->symbol_scope; ls && ls->next; ls = ls->next);
-
-       /* Extend the global scope by adding the local scope of the dlopened DSO. */
-       ls->next = &dyn_chain->dyn->symbol_scope;
 
        if (_dl_fixup(dyn_chain, &_dl_loaded_modules->symbol_scope, now_flag))
                goto oops;