From owner-p4-projects@FreeBSD.ORG Thu Apr 1 17:10:46 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9EAE416A4D0; Thu, 1 Apr 2004 17:10:46 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6125B16A4CE for ; Thu, 1 Apr 2004 17:10:46 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 58D8543D1F for ; Thu, 1 Apr 2004 17:10:46 -0800 (PST) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.10/8.12.10) with ESMTP id i321AkGe006849 for ; Thu, 1 Apr 2004 17:10:46 -0800 (PST) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i321AjX1006836 for perforce@freebsd.org; Thu, 1 Apr 2004 17:10:45 -0800 (PST) (envelope-from peter@freebsd.org) Date: Thu, 1 Apr 2004 17:10:45 -0800 (PST) Message-Id: <200404020110.i321AjX1006836@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 50152 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Apr 2004 01:10:47 -0000 http://perforce.freebsd.org/chv.cgi?CH=50152 Change 50152 by peter@peter_hammer on 2004/04/01 17:10:10 more debug-by-printf Affected files ... .. //depot/projects/hammer/sys/amd64/amd64/elf_machdep.c#14 edit .. //depot/projects/hammer/sys/kern/link_elf_obj.c#15 edit Differences ... ==== //depot/projects/hammer/sys/amd64/amd64/elf_machdep.c#14 (text+ko) ==== @@ -108,12 +108,14 @@ { Elf_Addr relocbase = (Elf_Addr) lf->address; Elf_Addr *where; + int32_t *where32; Elf_Addr addr; Elf_Addr addend; Elf_Word rtype, symidx; const Elf_Rel *rel; const Elf_Rela *rela; +printf("elf_reloc_internal: data %p, local %d\n", data, local); switch (type) { case ELF_RELOC_REL: rel = (const Elf_Rel *)data; @@ -121,6 +123,7 @@ addend = *where; rtype = ELF_R_TYPE(rel->r_info); symidx = ELF_R_SYM(rel->r_info); +printf("rel %p\n", rel); break; case ELF_RELOC_RELA: rela = (const Elf_Rela *)data; @@ -128,16 +131,20 @@ addend = rela->r_addend; rtype = ELF_R_TYPE(rela->r_info); symidx = ELF_R_SYM(rela->r_info); +printf("rela %p\n", rela); break; default: panic("unknown reloc type %d\n", type); } +printf("where %p, addend 0x%lx, rtype %ld, symindx %ld\n", where, addend, rtype, symidx); if (local) { if (rtype == R_X86_64_RELATIVE) { /* A + B */ addr = relocbase + addend; +printf("R_X86_64_RELATIVE: addr 0x%lx\n", addr); if (*where != addr) *where = addr; +printf("*where = 0x%lx\n", *where); } return (0); } @@ -145,25 +152,31 @@ switch (rtype) { case R_X86_64_NONE: /* none */ +printf("R_X86_64_NONE\n"); break; case R_X86_64_64: /* S + A */ addr = elf_lookup(lf, symidx, 1); +printf("R_X86_64_64: addr 0x%lx, addend 0x%lx\n", addr, addend); if (addr == 0) return -1; addr += addend; if (*where != addr) *where = addr; +printf("*where = 0x%lx\n", *where); break; case R_X86_64_PC32: /* S + A - P */ addr = elf_lookup(lf, symidx, 1); +printf("R_X86_64_PC32: addr 0x%lx, addend 0x%lx\n", addr, addend); if (addr == 0) return -1; addr += addend - (Elf_Addr)where; /* XXX needs to be 32 bit *where, not 64 bit */ - if (*where != addr) - *where = addr; + where32 = (int32_t *)where; + if (*where32 != addr) + *where32 = addr; +printf("*where32 = 0x%x\n", *where32); break; case R_X86_64_COPY: /* none */ @@ -177,10 +190,12 @@ case R_X86_64_GLOB_DAT: /* S */ addr = elf_lookup(lf, symidx, 1); +printf("R_X86_64_GLOB_DAT: addr 0x%lx\n", addr); if (addr == 0) return -1; if (*where != addr) *where = addr; +printf("*where = 0x%lx\n", *where); break; case R_X86_64_RELATIVE: /* B + A */ ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#15 (text+ko) ==== @@ -72,14 +72,12 @@ typedef struct { Elf_Rel *rel; - int relsize; Elf_Off fileoff; Elf_Off filesz; } Elf_relent; typedef struct { Elf_Rela *rela; - int relasize; Elf_Off fileoff; Elf_Off filesz; } Elf_relaent; @@ -508,8 +506,8 @@ * Read in relocation tables. Platforms use rel or rela, but * usually not both. */ -printf("reading rel\n"); for (i = 0; i < ef->nrel; i++) { +printf("reading rel segment %d\n", i); error = vn_rdwr(UIO_READ, nd.ni_vp, (void *)ef->reltab[i].rel, ef->reltab[i].filesz, @@ -519,8 +517,8 @@ if (error) goto out; } -printf("reading rela\n"); for (i = 0; i < ef->nrela; i++) { +printf("reading rela segment %d\n", i); error = vn_rdwr(UIO_READ, nd.ni_vp, (void *)ef->relatab[i].rela, ef->relatab[i].filesz, @@ -618,9 +616,12 @@ /* Perform relocations without addend if there are any: */ for (i = 0; i < ef->nrel; i++) { rel = ef->reltab[i].rel; +printf("doing rel relocation block %d: %p, size %ld\n", i, rel, ef->reltab[i].filesz); if (rel) { - rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].relsize); + rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].filesz); +printf("rellim is %p\n", rellim); while (rel < rellim) { +printf("rel doing: %p\n", rel); if (elf_reloc(&ef->lf, rel, ELF_RELOC_REL)) { symname = symbol_name(ef, rel->r_info); printf("link_elf: symbol %s undefined\n", symname); @@ -634,9 +635,12 @@ /* Perform relocations with addend if there are any: */ for (i = 0; i < ef->nrela; i++) { rela = ef->relatab[i].rela; +printf("doing rela relocation block %d, %p, size %ld\n", i, rela, ef->relatab[i].filesz); if (rela) { - relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].relasize); + relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].filesz); +printf("relalim is %p\n", relalim); while (rela < relalim) { +printf("rela doing: %p\n", rela); if (elf_reloc(&ef->lf, rela, ELF_RELOC_RELA)) { symname = symbol_name(ef, rela->r_info); printf("link_elf: symbol %s undefined\n", symname); @@ -647,6 +651,7 @@ } } +printf("relocate_file done\n"); return 0; } @@ -740,6 +745,8 @@ void **start, **stop; int len, error = 0, count; +printf("lookup_set: name %s\n", name); + len = strlen(name) + sizeof("__start_set_"); /* sizeof includes \0 */ setsym = malloc(len, M_LINKER, M_WAITOK); if (setsym == NULL) @@ -748,9 +755,11 @@ /* get address of first entry */ snprintf(setsym, len, "%s%s", "__start_set_", name); error = link_elf_lookup_symbol(lf, setsym, &sym); +printf("symbol %s result %d\n", setsym, error); if (error) goto out; link_elf_symbol_values(lf, sym, &symval); +printf("value %p\n", symval.value); if (symval.value == 0) { error = ESRCH; goto out; @@ -760,9 +769,11 @@ /* get address of last entry */ snprintf(setsym, len, "%s%s", "__stop_set_", name); error = link_elf_lookup_symbol(lf, setsym, &sym); +printf("symbol %s result %d\n", setsym, error); if (error) goto out; link_elf_symbol_values(lf, sym, &symval); +printf("value %p\n", symval.value); if (symval.value == 0) { error = ESRCH; goto out; @@ -780,6 +791,7 @@ if (countp) *countp = count; +printf("lookup_set: success\n"); out: free(setsym, M_LINKER); return error; @@ -891,9 +903,12 @@ /* Perform relocations without addend if there are any: */ for (i = 0; i < ef->nrel; i++) { rel = ef->reltab[i].rel; +printf("doing rel relocation block %d: %p, size %ld\n", i, rel, ef->relatab[i].filesz); if (rel) { - rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].relsize); + rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].filesz); +printf("rellim is %p\n", rellim); while (rel < rellim) { +printf("rel doing: %p\n", rel); elf_reloc_local(lf, rel, ELF_RELOC_REL); rel++; } @@ -903,9 +918,12 @@ /* Perform relocations with addend if there are any: */ for (i = 0; i < ef->nrela; i++) { rela = ef->relatab[i].rela; +printf("doing rela relocation block %d: %p, size %ld\n", i, rela, ef->relatab[i].filesz); if (rela) { - relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].relasize); + relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].filesz); +printf("relalim is %p\n", relalim); while (rela < relalim) { +printf("rela doing: %p\n", rela); elf_reloc_local(lf, rela, ELF_RELOC_RELA); rela++; }