diff options
Diffstat (limited to 'trunk/src/arch-mips.c')
-rw-r--r-- | trunk/src/arch-mips.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/trunk/src/arch-mips.c b/trunk/src/arch-mips.c index b85616e..2e0ea4c 100644 --- a/trunk/src/arch-mips.c +++ b/trunk/src/arch-mips.c @@ -660,11 +660,14 @@ mips_prelink_conflict_reloc (DSO *dso, struct prelink_info *info, { GElf_Addr value; struct prelink_conflict *conflict; - struct prelink_tls *tls; + struct prelink_tls *tls = NULL; GElf_Rela *entry; GElf_Word r_sym; int r_type; + if (info->dso == dso) + return 0; + r_sym = reloc_r_sym (dso, r_info); r_type = reloc_r_type (dso, r_info); conflict = prelink_conflict (info, r_sym, r_type); @@ -688,6 +691,12 @@ mips_prelink_conflict_reloc (DSO *dso, struct prelink_info *info, return 0; } } + else if (conflict->ifunc) + { + error (0, 0, "%s: STT_GNU_IFUNC not handled on MIPS yet", + dso->filename); + return 1; + } else { /* DTPREL32/DTPREL64 relocations just involve the symbol value; @@ -791,7 +800,7 @@ mips_arch_prelink_conflict (DSO *dso, struct prelink_info *info) struct prelink_conflict *conflict; GElf_Rela *entry; - if (dso->info[DT_PLTGOT] == 0) + if (info->dso == dso || dso->info[DT_PLTGOT] == 0) return 0; /* Add a conflict for every global GOT entry that does not hold the @@ -829,7 +838,7 @@ mips_arch_prelink_conflict (DSO *dso, struct prelink_info *info) static int mips_apply_conflict_rela (struct prelink_info *info, GElf_Rela *rela, - char *buf) + char *buf, GElf_Addr dest_addr) { DSO *dso; @@ -1348,6 +1357,7 @@ PL_ARCH(mips) = { /* R_MIPS_REL32 relocations against symbol 0 do act as relative relocs, but those against other symbols don't. */ .R_RELATIVE = ~0U, + .rtype_class_valid = RTYPE_CLASS_VALID, .arch_adjust = mips_arch_adjust, .adjust_dyn = mips_adjust_dyn, .adjust_rel = mips_adjust_rel, |