summaryrefslogtreecommitdiffstats
path: root/trunk/src/arch-mips.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/arch-mips.c')
-rw-r--r--trunk/src/arch-mips.c16
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,