svn commit: r212497 - in head/libexec/rtld-elf: . powerpc64
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Sun Sep 12 17:04:51 UTC 2010
Author: nwhitehorn
Date: Sun Sep 12 17:04:51 2010
New Revision: 212497
URL: http://svn.freebsd.org/changeset/base/212497
Log:
Check for undefined weak symbols during PLT binding on powerpc64, and do
not attempt to copy NULL function descriptors. This fixes LD_BIND_NOW on
powerpc64 after r211706.
Reviewed by: kib
Modified:
head/libexec/rtld-elf/powerpc64/reloc.c
head/libexec/rtld-elf/rtld.c
head/libexec/rtld-elf/rtld.h
Modified: head/libexec/rtld-elf/powerpc64/reloc.c
==============================================================================
--- head/libexec/rtld-elf/powerpc64/reloc.c Sun Sep 12 16:28:26 2010 (r212496)
+++ head/libexec/rtld-elf/powerpc64/reloc.c Sun Sep 12 17:04:51 2010 (r212497)
@@ -405,8 +405,13 @@ reloc_jmpslots(Obj_Entry *obj)
(void *)target, basename(defobj->path));
#endif
- reloc_jmpslot(where, target, defobj, obj,
- (const Elf_Rel *) rela);
+ if (def == &sym_zero) {
+ /* Zero undefined weak symbols */
+ bzero(where, sizeof(struct funcdesc));
+ } else {
+ reloc_jmpslot(where, target, defobj, obj,
+ (const Elf_Rel *) rela);
+ }
}
obj->jmpslots_done = true;
Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c Sun Sep 12 16:28:26 2010 (r212496)
+++ head/libexec/rtld-elf/rtld.c Sun Sep 12 17:04:51 2010 (r212497)
@@ -183,7 +183,7 @@ static Objlist list_main = /* Objects lo
static Objlist list_fini = /* Objects needing fini() calls */
STAILQ_HEAD_INITIALIZER(list_fini);
-static Elf_Sym sym_zero; /* For resolving undefined weak refs. */
+Elf_Sym sym_zero; /* For resolving undefined weak refs. */
#define GDB_STATE(s,m) r_debug.r_state = s; r_debug_state(&r_debug,m);
Modified: head/libexec/rtld-elf/rtld.h
==============================================================================
--- head/libexec/rtld-elf/rtld.h Sun Sep 12 16:28:26 2010 (r212496)
+++ head/libexec/rtld-elf/rtld.h Sun Sep 12 17:04:51 2010 (r212497)
@@ -261,6 +261,7 @@ extern void *xcalloc(size_t);
extern void *xmalloc(size_t);
extern char *xstrdup(const char *);
extern Elf_Addr _GLOBAL_OFFSET_TABLE_[];
+extern Elf_Sym sym_zero; /* For resolving undefined weak refs. */
extern void dump_relocations (Obj_Entry *);
extern void dump_obj_relocations (Obj_Entry *);
More information about the svn-src-all
mailing list