diff options
Diffstat (limited to 'trunk/src/arch-alpha.c')
-rw-r--r-- | trunk/src/arch-alpha.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/trunk/src/arch-alpha.c b/trunk/src/arch-alpha.c index 31b03ae..b326b0b 100644 --- a/trunk/src/arch-alpha.c +++ b/trunk/src/arch-alpha.c @@ -30,14 +30,14 @@ static int alpha_adjust_dyn (DSO *dso, int n, GElf_Dyn *dyn, GElf_Addr start, - GElf_Addr adjust) + GElf_Addr adjust) { return 0; } static int alpha_adjust_rel (DSO *dso, GElf_Rel *rel, GElf_Addr start, - GElf_Addr adjust) + GElf_Addr adjust) { error (0, 0, "%s: Alpha doesn't support REL relocs", dso->filename); return 1; @@ -45,7 +45,7 @@ alpha_adjust_rel (DSO *dso, GElf_Rel *rel, GElf_Addr start, static int alpha_adjust_rela (DSO *dso, GElf_Rela *rela, GElf_Addr start, - GElf_Addr adjust) + GElf_Addr adjust) { if (GELF_R_TYPE (rela->r_info) == R_ALPHA_RELATIVE || GELF_R_TYPE (rela->r_info) == R_ALPHA_JMP_SLOT) @@ -195,7 +195,7 @@ alpha_prelink_rela (struct prelink_info *info, GElf_Rela *rela, static int alpha_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) & 0xff) { @@ -260,7 +260,8 @@ alpha_prelink_conflict_rela (DSO *dso, struct prelink_info *info, GElf_Rela *ret; if (GELF_R_TYPE (rela->r_info) == R_ALPHA_RELATIVE - || GELF_R_TYPE (rela->r_info) == R_ALPHA_NONE) + || GELF_R_TYPE (rela->r_info) == R_ALPHA_NONE + || info->dso == dso) /* Fast path: nothing to do. */ return 0; conflict = prelink_conflict (info, GELF_R_SYM (rela->r_info), @@ -280,6 +281,12 @@ alpha_prelink_conflict_rela (DSO *dso, struct prelink_info *info, } value = 0; } + else if (conflict->ifunc) + { + error (0, 0, "%s: STT_GNU_IFUNC not handled on Alpha yet", + dso->filename); + return 1; + } else { /* DTPREL64 wants to see only real conflicts, not lookups |