From owner-p4-projects Sat Apr 6 2:10:17 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7650937B419; Sat, 6 Apr 2002 02:10:11 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 1A94F37B416 for ; Sat, 6 Apr 2002 02:10:10 -0800 (PST) Received: (from perforce@localhost) by freefall.freebsd.org (8.11.6/8.11.6) id g36AA9T30341 for perforce@freebsd.org; Sat, 6 Apr 2002 02:10:09 -0800 (PST) (envelope-from peter@freebsd.org) Date: Sat, 6 Apr 2002 02:10:09 -0800 (PST) Message-Id: <200204061010.g36AA9T30341@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm Subject: PERFORCE change 9191 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG http://people.freebsd.org/~peter/p4db/chv.cgi?CH=9191 Change 9191 by peter@peter_thunder on 2002/04/06 02:10:00 Check in an a real fix for the cxa_finalize weak symbol. It was a bug in ld.so after all. This still needs work, especially the comments about find_symdef not working for local symbols. Affected files ... ... //depot/projects/ia64/libexec/rtld-elf/ia64/reloc.c#2 edit Differences ... ==== //depot/projects/ia64/libexec/rtld-elf/ia64/reloc.c#2 (text+ko) ==== @@ -136,7 +136,7 @@ * to ensure this within a single object. If the * caller's alloca failed, we don't even ensure that. */ - const Elf_Sym *def; + const Elf_Sym *def, *ref; const Obj_Entry *defobj; struct fptr *fptr = 0; Elf_Addr target, gp; @@ -153,8 +153,21 @@ def = &obj->symtab[ELF_R_SYM(rela->r_info)]; defobj = obj; } - target = (Elf_Addr) (defobj->relocbase + def->st_value); - gp = (Elf_Addr) defobj->pltgot; + /* + * If this is an undefined weak reference, we need to + * have a zero target,gp fptr, not pointing to relocbase. + * This isn't quite right. Maybe we should check + * explicitly for def == &sym_zero. + */ + if (def->st_value == 0 && + (ref = obj->symtab + ELF_R_SYM(rela->r_info)) && + ELF_ST_BIND(ref->st_info) == STB_WEAK) { + target = 0; + gp = 0; + } else { + target = (Elf_Addr) (defobj->relocbase + def->st_value); + gp = (Elf_Addr) defobj->pltgot; + } /* * Find the @fptr, using fptrs as a helper. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message