{
int goof = 0;
struct elf_resolve *tpnt;
+ unsigned long reloc_size;
if (rpnt->next)
goof += _dl_fixup(rpnt->next, flag);
return goof;
}
+/* On some machines, notably SPARC & PPC, DT_REL* includes DT_JMPREL in its
+ range. Note that according to the ELF spec, this is completely legal! */
+#ifdef ELF_MACHINE_PLTREL_OVERLAP
+ reloc_size = tpnt->dynamic_info[DT_RELOC_TABLE_SIZE] -
+ tpnt->dynamic_info [DT_PLTRELSZ];
+#else
+ reloc_size = tpnt->dynamic_info[DT_RELOC_TABLE_SIZE];
+#endif
if (tpnt->dynamic_info[DT_RELOC_TABLE_ADDR]) {
if (tpnt->init_flag & RELOCS_DONE)
return goof;
tpnt->init_flag |= RELOCS_DONE;
goof += _dl_parse_relocation_information(rpnt,
tpnt->dynamic_info[DT_RELOC_TABLE_ADDR],
- tpnt->dynamic_info[DT_RELOC_TABLE_SIZE], 0);
+ reloc_size, 0);
}
if (tpnt->dynamic_info[DT_JMPREL]) {
|| (type) == R_PPC_REL24 \
|| (type) == R_PPC_ADDR24) * ELF_RTYPE_CLASS_PLT) \
| (((type) == R_PPC_COPY) * ELF_RTYPE_CLASS_COPY))
+
+/* The SVR4 ABI specifies that the JMPREL relocs must be inside the
+ DT_RELA table. */
+#define ELF_MACHINE_PLTREL_OVERLAP 1
#define elf_machine_type_class(type) \
((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
| (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
+
+/* The SPARC overlaps DT_RELA and DT_PLTREL. */
+#define ELF_MACHINE_PLTREL_OVERLAP 1