From owner-p4-projects@FreeBSD.ORG Sun Apr 27 17:43:39 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A25A7106566B; Sun, 27 Apr 2008 17:43:39 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 61ED71065675 for ; Sun, 27 Apr 2008 17:43:39 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 4A1968FC16 for ; Sun, 27 Apr 2008 17:43:39 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m3RHhdAl091308 for ; Sun, 27 Apr 2008 17:43:39 GMT (envelope-from gonzo@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m3RHhdj2091306 for perforce@freebsd.org; Sun, 27 Apr 2008 17:43:39 GMT (envelope-from gonzo@FreeBSD.org) Date: Sun, 27 Apr 2008 17:43:39 GMT Message-Id: <200804271743.m3RHhdj2091306@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gonzo@FreeBSD.org using -f From: Oleksandr Tymoshenko To: Perforce Change Reviews Cc: Subject: PERFORCE change 140737 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 27 Apr 2008 17:43:40 -0000 http://perforce.freebsd.org/chv.cgi?CH=140737 Change 140737 by gonzo@gonzo_jeeves on 2008/04/27 17:43:15 o Looks like handler for R_MIPS_REL32 brought by CS 137942 is broken for tradmips. Code from NetBSD's libexec/ld.elf_so/arch/mips/mips_reloc.c works just fine. Affected files ... .. //depot/projects/mips2-jnpr/src/libexec/rtld-elf/mips/reloc.c#6 edit Differences ... ==== //depot/projects/mips2-jnpr/src/libexec/rtld-elf/mips/reloc.c#6 (text+ko) ==== @@ -258,31 +258,23 @@ case R_TYPE(REL32): /* 32-bit PC-relative reference */ def = obj->symtab + symnum; - tmp = load_ptr(where); - if (tmp == 0) { - def = find_symdef(symnum, obj, &defobj, false, NULL); - if (def == NULL) { - dbg("Warning5, cant find symbole %d:%s", (int)symnum, - obj->strtab + obj->symtab[symnum].st_name); - } else { - tmp = def->st_value + (Elf_Addr)defobj->relocbase; - dbg("Correctiong symnum:%d:%s to addr:%x", (int)symnum, - obj->strtab + obj->symtab[symnum].st_name, - (u_int32_t)tmp - ); - } + if (symnum >= obj->gotsym) { + tmp = load_ptr(where); + tmp += got[obj->local_gotno + symnum - obj->gotsym]; + store_ptr(where, tmp); + break; } else { - tmp += (Elf_Addr)obj->relocbase; + tmp = load_ptr(where); + + if (def->st_info == + ELF_ST_INFO(STB_LOCAL, STT_SECTION) + ) + tmp += (Elf_Addr)def->st_value; + + tmp += (Elf_Addr)obj->relocbase; + store_ptr(where, tmp); } - store_ptr(where, tmp); - if (tmp == (Elf_Addr)obj->relocbase) { - dbg("rel sym %p falls on relocbase symidx:%x symbol:%s", rel, - (uint32_t)ELF_R_SYM(rel->r_info), - obj->strtab + obj->symtab[symnum].st_name - ); - } break; - default: dbg("sym = %lu, type = %lu, offset = %p, " "contents = %p, symbol = %s",