diff options
author | Joakim Tjernlund <joakim.tjernlund@transmode.se> | 2004-11-17 09:36:40 +0000 |
---|---|---|
committer | Joakim Tjernlund <joakim.tjernlund@transmode.se> | 2004-11-17 09:36:40 +0000 |
commit | a5ebab17668503a0887dfcace6904d86de8b1d8f (patch) | |
tree | 4ba37b469d47256d61fb82192365e4aacaf727ec /ldso/ldso/mips/elfinterp.c | |
parent | 9699ba89100190c80ab51a4637c321a5dde978c5 (diff) |
Add BIND NOW support to MIPS.
Mips did not honour the LD_BIND_NOW env. variable or the DT_BIND_NOW flag
in the dynamic section.
Diffstat (limited to 'ldso/ldso/mips/elfinterp.c')
-rw-r--r-- | ldso/ldso/mips/elfinterp.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/ldso/ldso/mips/elfinterp.c b/ldso/ldso/mips/elfinterp.c index 79a681d35..39a147df0 100644 --- a/ldso/ldso/mips/elfinterp.c +++ b/ldso/ldso/mips/elfinterp.c @@ -247,11 +247,11 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt, } /* 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) { @@ -273,11 +273,11 @@ void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt) 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 { @@ -290,7 +290,7 @@ void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt) 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) { |