diff options
author | nwhitehorn <nwhitehorn@FreeBSD.org> | 2011-12-17 15:31:00 +0000 |
---|---|---|
committer | nwhitehorn <nwhitehorn@FreeBSD.org> | 2011-12-17 15:31:00 +0000 |
commit | b4df21bd9deb47448179a13a58fbd43ad5ae75f4 (patch) | |
tree | 8202f56df90a9d8db850649efbda57ba7f29af9f /libexec | |
parent | abb1713421269460e80f10ebf41aa50803e50349 (diff) | |
download | FreeBSD-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.c | 15 |
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 |