diff options
Diffstat (limited to 'trunk/src/arch-sh.c')
-rw-r--r-- | trunk/src/arch-sh.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/trunk/src/arch-sh.c b/trunk/src/arch-sh.c index c5c9f52..095ed58 100644 --- a/trunk/src/arch-sh.c +++ b/trunk/src/arch-sh.c @@ -30,7 +30,7 @@ static int sh_adjust_dyn (DSO *dso, int n, GElf_Dyn *dyn, GElf_Addr start, - GElf_Addr adjust) + GElf_Addr adjust) { if (dyn->d_tag == DT_PLTGOT) { @@ -67,7 +67,7 @@ sh_adjust_dyn (DSO *dso, int n, GElf_Dyn *dyn, GElf_Addr start, static int sh_adjust_rel (DSO *dso, GElf_Rel *rel, GElf_Addr start, - GElf_Addr adjust) + GElf_Addr adjust) { error (0, 0, "%s: SH doesn't support REL relocs", dso->filename); return 1; @@ -75,7 +75,7 @@ sh_adjust_rel (DSO *dso, GElf_Rel *rel, GElf_Addr start, static int sh_adjust_rela (DSO *dso, GElf_Rela *rela, GElf_Addr start, - GElf_Addr adjust) + GElf_Addr adjust) { Elf32_Addr data; @@ -107,7 +107,7 @@ sh_prelink_rel (struct prelink_info *info, GElf_Rel *rel, GElf_Addr reladdr) static int sh_prelink_rela (struct prelink_info *info, GElf_Rela *rela, - GElf_Addr relaaddr) + GElf_Addr relaaddr) { DSO *dso; GElf_Addr value; @@ -151,7 +151,7 @@ sh_prelink_rela (struct prelink_info *info, GElf_Rela *rela, static int sh_apply_conflict_rela (struct prelink_info *info, GElf_Rela *rela, - char *buf) + char *buf, GElf_Addr dest_addr) { switch (GELF_R_TYPE (rela->r_info)) { @@ -206,7 +206,7 @@ sh_apply_rela (struct prelink_info *info, GElf_Rela *rela, char *buf) static int sh_prelink_conflict_rel (DSO *dso, struct prelink_info *info, GElf_Rel *rel, - GElf_Addr reladdr) + GElf_Addr reladdr) { error (0, 0, "%s: SH doesn't support REL relocs", dso->filename); return 1; @@ -214,20 +214,27 @@ sh_prelink_conflict_rel (DSO *dso, struct prelink_info *info, GElf_Rel *rel, static int sh_prelink_conflict_rela (DSO *dso, struct prelink_info *info, - GElf_Rela *rela, GElf_Addr relaaddr) + GElf_Rela *rela, GElf_Addr relaaddr) { GElf_Addr value; struct prelink_conflict *conflict; GElf_Rela *ret; if (GELF_R_TYPE (rela->r_info) == R_SH_RELATIVE - || GELF_R_TYPE (rela->r_info) == R_SH_NONE) + || GELF_R_TYPE (rela->r_info) == R_SH_NONE + || info->dso == dso) /* Fast path: nothing to do. */ return 0; conflict = prelink_conflict (info, GELF_R_SYM (rela->r_info), GELF_R_TYPE (rela->r_info)); if (conflict == NULL) return 0; + else if (conflict->ifunc) + { + error (0, 0, "%s: STT_GNU_IFUNC not handled on SuperH yet", + dso->filename); + return 1; + } value = conflict_lookup_value (conflict); ret = prelink_conflict_add_rela (info); if (ret == NULL) |