summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2011-12-17 15:31:00 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2011-12-17 15:31:00 +0000
commitb4df21bd9deb47448179a13a58fbd43ad5ae75f4 (patch)
tree8202f56df90a9d8db850649efbda57ba7f29af9f /libexec
parentabb1713421269460e80f10ebf41aa50803e50349 (diff)
downloadFreeBSD-src-b4df21bd9deb47448179a13a58fbd43ad5ae75f4.zip
FreeBSD-src-b4df21bd9deb47448179a13a58fbd43ad5ae75f4.tar.gz
Fix RTLD on PowerPC after r228435. Changing the order of init_pltgot()
caused the icache to be invalidated at the wrong time, resulting in an icache full of nonsense in the PLT section.
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/powerpc/reloc.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/libexec/rtld-elf/powerpc/reloc.c b/libexec/rtld-elf/powerpc/reloc.c
index d0128f4..c8967b6 100644
--- a/libexec/rtld-elf/powerpc/reloc.c
+++ b/libexec/rtld-elf/powerpc/reloc.c
@@ -366,7 +366,7 @@ reloc_plt_object(Obj_Entry *obj, const Elf_Rela *rela)
/*
- * The icache will be sync'd in init_pltgot, which is called
+ * The icache will be sync'd in reloc_plt, which is called
* after all the slots have been updated
*/
@@ -382,6 +382,7 @@ reloc_plt(Obj_Entry *obj)
{
const Elf_Rela *relalim;
const Elf_Rela *rela;
+ int N = obj->pltrelasize / sizeof(Elf_Rela);
if (obj->pltrelasize != 0) {
@@ -396,6 +397,13 @@ reloc_plt(Obj_Entry *obj)
}
}
+ /*
+ * Sync the icache for the byte range represented by the
+ * trampoline routines and call slots.
+ */
+ if (obj->pltgot != NULL)
+ __syncicache(obj->pltgot, JMPTAB_BASE(N)*4);
+
return (0);
}
@@ -595,10 +603,9 @@ init_pltgot(Obj_Entry *obj)
pltresolve[4] |= _ppc_la(obj);
/*
- * Sync the icache for the byte range represented by the
- * trampoline routines and call slots.
+ * The icache will be sync'd in reloc_plt, which is called
+ * after all the slots have been updated
*/
- __syncicache(obj->pltgot, JMPTAB_BASE(N)*4);
}
void
OpenPOWER on IntegriCloud