* Relocation of the GOT entries for MIPS have to be done
* after all the libraries have been loaded.
*/
- _dl_perform_mips_global_got_relocations(_dl_loaded_modules);
+ _dl_perform_mips_global_got_relocations(_dl_loaded_modules, !unlazy);
#endif
/*
unsigned long old_gpreg);
struct elf_resolve;
-void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt);
+void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt, int lazy);
#define do_rem(result, n, base) ((result) = (n) % (base))
}
/* Relocate the global GOT entries for the object */
-void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt)
+void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt, int lazy)
{
Elf32_Sym *sym;
char *strtab;
- unsigned long i;
+ unsigned long i, tmp_lazy;
unsigned long *got_entry;
for (; tpnt ; tpnt = tpnt->next) {
if(_dl_debug_reloc)
_dl_dprintf(2, "_dl_perform_mips_global_got_relocations for '%s'\n", tpnt->libname);
#endif
-
+ tmp_lazy = lazy && !tpnt->dynamic_info[DT_BIND_NOW];
/* Relocate the global GOT entries for the object */
while(i--) {
if (sym->st_shndx == SHN_UNDEF) {
- if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC && sym->st_value) {
+ if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC && sym->st_value && tmp_lazy) {
*got_entry = sym->st_value + (unsigned long) tpnt->loadaddr;
}
else {
sym->st_name, tpnt->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT);
}
else if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC &&
- *got_entry != sym->st_value) {
+ *got_entry != sym->st_value && tmp_lazy) {
*got_entry += (unsigned long) tpnt->loadaddr;
}
else if (ELF32_ST_TYPE(sym->st_info) == STT_SECTION) {
int _dl_unmap_cache(void) __attribute__ ((__weak__));
#endif
#ifdef __mips__
-extern void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt)
+extern void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt, int lazy)
__attribute__ ((__weak__));
#endif
#ifdef __SUPPORT_LD_DEBUG__
* further needs to be done. */
return (void *) dyn_chain;
}
-#ifdef __mips__
- /*
- * Relocation of the GOT entries for MIPS have to be done
- * after all the libraries have been loaded.
- */
- _dl_perform_mips_global_got_relocations(tpnt);
-#endif
#ifdef __SUPPORT_LD_DEBUG__
if(_dl_debug)
now_flag = (flag & RTLD_NOW) ? RTLD_NOW : 0;
if (getenv("LD_BIND_NOW"))
now_flag = RTLD_NOW;
+
+#ifdef __mips__
+ /*
+ * Relocation of the GOT entries for MIPS have to be done
+ * after all the libraries have been loaded.
+ */
+ _dl_perform_mips_global_got_relocations(tpnt, !now_flag);
+#endif
+
if (_dl_fixup(dyn_chain, now_flag))
goto oops;