Date: Fri, 2 Apr 2004 09:45:58 -0800 (PST) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 50199 for review Message-ID: <200404021745.i32Hjwre055582@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=50199 Change 50199 by peter@peter_hammer on 2004/04/02 09:45:28 put the printf's on a diet Affected files ... .. //depot/projects/hammer/sys/amd64/amd64/elf_machdep.c#18 edit .. //depot/projects/hammer/sys/kern/link_elf_obj.c#25 edit Differences ... ==== //depot/projects/hammer/sys/amd64/amd64/elf_machdep.c#18 (text+ko) ==== @@ -106,7 +106,7 @@ static int elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data, int type, int local, elf_lookup_fn lu) { - Elf64_Addr *where; + Elf64_Addr *where, val; Elf32_Addr *where32, val32; Elf_Addr addr; Elf_Addr addend; @@ -114,7 +114,6 @@ const Elf_Rel *rel; const Elf_Rela *rela; -printf("elf_reloc_internal: relocbase 0x%lx, data %p, local %d\n", relocbase, data, local); switch (type) { case ELF_RELOC_REL: rel = (const Elf_Rel *)data; @@ -122,7 +121,6 @@ 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; @@ -130,75 +128,48 @@ 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 0 - 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); - } -#endif - switch (rtype) { - case R_X86_64_RELATIVE: - addr = relocbase + addend; -printf("R_X86_64_RELATIVE: addr 0x%lx\n", addr); - if (*where != addr) - *where = addr; - break; case R_X86_64_NONE: /* none */ printf("R_X86_64_NONE\n"); break; case R_X86_64_64: /* S + A */ -printf("R_X86_64_64\n"); addr = lu(lf, symidx, 1); -printf("addr 0x%lx, addend 0x%lx\n", addr, addend); + val = addr + addend; +printf("R_X86_64_64 %p -> (addr 0x%lx + addend 0x%lx) = 0x%lx\n", where, addr, addend, val); if (addr == 0) return -1; - addr += addend; - if (*where != addr) - *where = addr; -printf("*where = 0x%lx\n", *where); + if (*where != val) + *where = val; break; case R_X86_64_PC32: /* S + A - P */ -printf("R_X86_64_PC32\n"); addr = lu(lf, symidx, 1); -printf("addr 0x%lx, addend 0x%lx\n", addr, addend); + where32 = (Elf32_Addr *)where; + val32 = (Elf32_Addr)(addr + addend - (Elf_Addr)where); +printf("R_X86_64_PC32: %p -> (addr 0x%lx, addend 0x%lx - where) = 0x%x\n", where, addr, addend, val32); if (addr == 0) return -1; - val32 = (Elf32_Addr)(addr + addend - (Elf_Addr)where); - where32 = (int32_t *)where; if (*where32 != val32) *where32 = val32; -printf("*where32 = 0x%x\n", *where32); break; case R_X86_64_32S: /* S + A sign extend */ -printf("R_X86_64_32\n"); addr = lu(lf, symidx, 1); -printf("addr 0x%lx, addend 0x%lx\n", addr, addend); + val32 = (Elf32_Addr)(addr + addend); + where32 = (Elf32_Addr *)where; +printf("R_X86_64_32: %p -> (addr 0x%lx + addend 0x%lx) = 0x%x\n", where, addr, addend, val32); if (addr == 0) return -1; - val32 = (Elf32_Addr)(addr + addend); - where32 = (Elf32_Addr *)where; if (*where32 != val32) *where32 = val32; -printf("*where32 = 0x%x\n", *where32); break; case R_X86_64_COPY: /* none */ @@ -211,20 +182,21 @@ break; case R_X86_64_GLOB_DAT: /* S */ -printf("R_X86_64_GLOB_DAT\n"); addr = lu(lf, symidx, 1); -printf("addr 0x%lx\n", addr); +printf("R_X86_64_GLOB_DAT: %p -> addr 0x%lx\n", where, addr); if (addr == 0) return -1; if (*where != addr) *where = addr; -printf("*where = 0x%lx\n", *where); break; -#if 0 case R_X86_64_RELATIVE: /* B + A */ + addr = relocbase + addend; + val = addr; +printf("R_X86_64_RELATIVE: %p -> 0x%lx\n", where, val); + if (*where != val) + *where = val; break; -#endif default: printf("kldload: unexpected relocation type %ld\n", ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#25 (text+ko) ==== @@ -58,8 +58,6 @@ #include "linker_if.h" -int biteme = 0; - typedef struct { void *addr; Elf_Off fileoff; @@ -120,10 +118,6 @@ caddr_t shstrtab; /* Section name string table */ long shstrcnt; /* number of bytes in string table */ -#if 0 - caddr_t symbase; /* malloc'ed symbol base */ - caddr_t strbase; /* malloc'ed string base */ -#endif } *elf_file_t; static int link_elf_link_preload(linker_class_t cls, @@ -242,7 +236,7 @@ } #endif -printf("link_elf_obj: malloc header\n"); +printf("link_elf_obj: begin!\n"); /* Read the elf header from the file. */ hdr = malloc(sizeof(*hdr), M_LINKER, M_WAITOK); if (hdr == NULL) { @@ -259,33 +253,28 @@ goto out; } -printf("link_elf_obj: is_elf?\n"); if (!IS_ELF(*hdr)) { error = ENOEXEC; goto out; } -printf("link_elf_obj: right class?\n"); if (hdr->e_ident[EI_CLASS] != ELF_TARG_CLASS || hdr->e_ident[EI_DATA] != ELF_TARG_DATA) { link_elf_error("Unsupported file layout"); error = ENOEXEC; goto out; } -printf("link_elf_obj: right version?\n"); if (hdr->e_ident[EI_VERSION] != EV_CURRENT || hdr->e_version != EV_CURRENT) { link_elf_error("Unsupported file version"); error = ENOEXEC; goto out; } -printf("link_elf_obj: relocatable?\n"); if (hdr->e_type != ET_REL) { link_elf_error("Unsupported file type"); error = ENOEXEC; goto out; } -printf("link_elf_obj: right machine?\n"); if (hdr->e_machine != ELF_TARG_MACH) { link_elf_error("Unsupported machine"); error = ENOEXEC; @@ -294,8 +283,6 @@ printf("elf_load_obj: initial checks look ok!\n"); -biteme++; -printf("section table read in ok\n"); lf = linker_make_file(filename, &link_elf_class); if (!lf) { error = ENOMEM; @@ -330,8 +317,8 @@ error = ENOEXEC; goto out; } +printf("section table read in ok\n"); -printf("scan header1\n"); /* Scan the section header for information and table sizing. */ nsym = 0; symtabindex = -1; @@ -339,28 +326,25 @@ for (i = 0; i < hdr->e_shnum; i++) { switch (shdr[i].sh_type) { case SHT_PROGBITS: -printf("scan: progbits!\n"); ef->nprogtab++; break; case SHT_NOBITS: -printf("scan: nobits!\n"); ef->nnobittab++; break; case SHT_SYMTAB: -printf("scan: symtab!\n"); nsym++; symtabindex = i; symstrindex = shdr[i].sh_link; -printf("[symtab peer is %d]\n", symstrindex); +printf("[symtab %d peer is %d]\n", i, symstrindex); break; case SHT_REL: -printf("scan: rel!\n"); ef->nrel++; break; case SHT_RELA: -printf("scan: rela!\n"); ef->nrela++; break; + case SHT_STRTAB: + break; default: printf("scan: unknown section type %d\n", shdr[i].sh_type); break; @@ -436,7 +420,6 @@ rl = 0; ra = 0; alignmask = 0; -printf("scan pass 2\n"); for (i = 0; i < hdr->e_shnum; i++) { switch (shdr[i].sh_type) { case SHT_PROGBITS: @@ -557,7 +540,6 @@ if (error) goto out; -printf("reading progbits\n"); /* Read in the text/data/set/etc sections */ for (i = 0; i < ef->nprogtab; i++) { printf("reading progbits %d\n", i); @@ -598,8 +580,6 @@ goto out; } - -printf("now do post link stuff\n"); /* Inform the kld system about the situation */ lf->address = ef->address = mapbase; lf->size = mapsize; @@ -638,7 +618,6 @@ VOP_UNLOCK(nd.ni_vp, 0, td); vn_close(nd.ni_vp, FREAD, td->td_ucred, td); -biteme--; return error; } @@ -715,10 +694,10 @@ /* Perform relocations without addend if there are any: */ for (i = 0; i < ef->nrel; i++) { rel = ef->reltab[i].rel; +printf("==============================\n"); 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].filesz); -printf("rellim is %p\n", rellim); base = findbase(ef, ef->reltab[i].sec); while (rel < rellim) { printf("rel doing: %p\n", rel); @@ -736,15 +715,16 @@ rel++; } } +printf("\n"); } /* Perform relocations with addend if there are any: */ for (i = 0; i < ef->nrela; i++) { rela = ef->relatab[i].rela; +printf("\n==============================\n"); 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].filesz); -printf("relalim is %p\n", relalim); base = findbase(ef, ef->relatab[i].sec); while (rela < relalim) { printf("rela doing: %p\n", rela); @@ -762,9 +742,10 @@ rela++; } } +printf("\n"); } -printf("relocate_file done\n"); +printf("relocate_file finished\n"); return 0; } @@ -938,14 +919,11 @@ Elf_Addr ret; int i; -printf("elf_obj_lookup: symidx %ld (< %ld?)\n", symidx, ef->ddbsymcnt); - /* Don't even try to lookup the symbol if the index is bogus. */ if (symidx >= ef->ddbsymcnt) return (0); sym = ef->ddbsymtab + symidx; -printf("sym: %p (base %p)\n", sym, ef->ddbsymtab); /* Theoretically we can avoid a lookup for some locals */ switch (ELF64_ST_BIND(sym->st_info)) { @@ -957,18 +935,16 @@ /* Relative to section number */ for (i = 0; i < ef->nprogtab; i++) { if (sym->st_shndx == ef->progtab[i].sec) { -printf("FOUND PROGBITS SECTION RELOC, name %s\n", ef->progtab[i].name); ret = (Elf_Addr)ef->progtab[i].addr; -printf("returning base 0x%lx\n", ret); +printf("STB_LOCAL: sym %p idx %lx -> progbits section '%s', base 0x%lx\n", sym, symidx, ef->progtab[i].name, ret); break; } } if (ret == 0) { for (i = 0; i < ef->nnobittab; i++) { if (sym->st_shndx == ef->nobittab[i].sec) { -printf("FOUND NOBITS SECTION RELOC, name %s\n", ef->nobittab[i].name); ret = (Elf_Addr)ef->nobittab[i].addr; -printf("returning base 0x%lx\n", ret); +printf("STB_LOCAL: sym %p idx %lx -> nobits section '%s', base 0x%lx\n", sym, symidx, ef->nobittab[i].name, ret); break; } } @@ -982,9 +958,8 @@ /* Force a lookup failure if the symbol name is bogus. */ if (*symbol == 0) return (0); -printf("calling linker_file_lookup_symbol, deps %d\n", deps); ret = ((Elf_Addr)linker_file_lookup_symbol(lf, symbol, deps)); -printf("linker_file_lookup_symbol returns 0x%lx\n", ret); +printf("STB_GLOBAL: sym %p idx %lx name '%s' -> 0x%lx\n", sym, symidx, symbol, ret); return ret; default: printf("UNKNOWN BINDING %d\n", ELF64_ST_BIND(sym->st_info)); @@ -1011,10 +986,10 @@ /* Perform relocations without addend if there are any: */ for (i = 0; i < ef->nrel; i++) { rel = ef->reltab[i].rel; +printf("==============================\n"); 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].filesz); -printf("rellim is %p\n", rellim); base = findbase(ef, ef->reltab[i].sec); while (rel < rellim) { printf("rel doing: %p\n", rel); @@ -1027,15 +1002,16 @@ rel++; } } +printf("\n"); } /* Perform relocations with addend if there are any: */ for (i = 0; i < ef->nrela; i++) { rela = ef->relatab[i].rela; +printf("==============================\n"); 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].filesz); -printf("relalim is %p\n", relalim); base = findbase(ef, ef->relatab[i].sec); while (rela < relalim) { printf("rela doing: %p\n", rela); @@ -1048,5 +1024,6 @@ rela++; } } +printf("\n"); } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200404021745.i32Hjwre055582>