--- chrpath-0.18.orig/killrpath.c +++ chrpath-0.18/killrpath.c @@ -78,10 +78,26 @@ dynpos = 0; for (i = 0; DYNSS(i, d_tag) != DT_NULL; i++) { - if (is_e32()) + if (is_e32()) { ((Elf32_Dyn *)dyns)[dynpos] = ((Elf32_Dyn *)dyns)[i]; - else +#ifdef DT_MIPS_RLD_MAP_REL + /* DT_MIPS_RLD_MAP_REL is relative to the offset of the tag. + Adjust it consequently. */ + if (DYNSS(i, d_tag) == DT_MIPS_RLD_MAP_REL) + ((Elf32_Dyn *)dyns)[dynpos].d_un.d_val = + DO_SWAPU32(DYNSU(i, d_un.d_val) + + (i - dynpos) * sizeof(Elf32_Dyn)); +#endif + } else { ((Elf64_Dyn *)dyns)[dynpos] = ((Elf64_Dyn *)dyns)[i]; +#ifdef DT_MIPS_RLD_MAP_REL + /* Ditto */ + if (DYNSS(i, d_tag) == DT_MIPS_RLD_MAP_REL) + ((Elf64_Dyn *)dyns)[dynpos].d_un.d_val = + DO_SWAPU64(DYNSU(i, d_un.d_val) + + (i - dynpos) * sizeof(Elf64_Dyn)); +#endif + } if ( ! elf_dynpath_tag(DYNSS(i, d_tag)) ) dynpos++; }