From owner-p4-projects@FreeBSD.ORG Tue Mar 30 19:03:58 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4F64916A4D0; Tue, 30 Mar 2004 19:03:58 -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 2402016A4CE for ; Tue, 30 Mar 2004 19:03:58 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 18DE443D45 for ; Tue, 30 Mar 2004 19:03:58 -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 i2V33vGe093781 for ; Tue, 30 Mar 2004 19:03:57 -0800 (PST) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i2V33vqu093757 for perforce@freebsd.org; Tue, 30 Mar 2004 19:03:57 -0800 (PST) (envelope-from peter@freebsd.org) Date: Tue, 30 Mar 2004 19:03:57 -0800 (PST) Message-Id: <200403310303.i2V33vqu093757@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 50029 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: Wed, 31 Mar 2004 03:03:58 -0000 http://perforce.freebsd.org/chv.cgi?CH=50029 Change 50029 by peter@peter_hammer on 2004/03/30 19:03:31 delay boom! until later. provide a test module that has really low objectives in life. Affected files ... .. //depot/projects/hammer/sys/kern/link_elf_obj.c#14 edit .. //depot/projects/hammer/sys/modules/test/Makefile#1 add .. //depot/projects/hammer/sys/modules/test/testmod.c#1 add Differences ... ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#14 (text+ko) ==== @@ -101,13 +101,15 @@ Elf_relent *reltab; int nrel; - const Elf_Sym* ddbsymtab; /* The symbol table we are using */ + Elf_Sym *ddbsymtab; /* The symbol table we are using */ long ddbsymcnt; /* Number of symbols */ caddr_t ddbstrtab; /* String table */ long ddbstrcnt; /* 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, @@ -223,13 +225,14 @@ } #endif +printf("link_elf_obj: malloc header\n"); /* Read the elf header from the file. */ - hdr = malloc(sizeof(Elf_Ehdr *), M_LINKER, M_WAITOK); + hdr = malloc(sizeof(*hdr), M_LINKER, M_WAITOK); if (hdr == NULL) { error = ENOMEM; goto out; } - error = vn_rdwr(UIO_READ, nd.ni_vp, (void *)hdr, PAGE_SIZE, 0, + error = vn_rdwr(UIO_READ, nd.ni_vp, (void *)hdr, sizeof(*hdr), 0, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) @@ -239,28 +242,33 @@ 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; } - if (hdr->e_type != ET_EXEC && hdr->e_type != ET_REL) { +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; @@ -338,6 +346,7 @@ break; } } +printf("finished scan 1\n"); if (ef->nprogtab == 0 && ef->nnobittab == 0) { link_elf_error("file has no contents"); error = ENOEXEC; @@ -375,7 +384,7 @@ ef->ddbstrcnt = shdr[symstrindex].sh_size; ef->ddbstrtab = malloc(shdr[symstrindex].sh_size, M_LINKER, M_WAITOK); - if (ef->symbase == NULL || ef->strbase == NULL) { + if (ef->ddbsymtab == NULL || ef->ddbstrtab == NULL) { error = ENOMEM; goto out; } @@ -391,7 +400,7 @@ switch (shdr[i].sh_type) { case SHT_PROGBITS: case SHT_NOBITS: - alignmask = (1u << shdr[i].sh_addralign) - 1; + alignmask = shdr[i].sh_addralign - 1; printf("addralign %ld mask %d\n", shdr[i].sh_addralign, alignmask); mapsize += alignmask; mapsize &= ~alignmask; @@ -468,14 +477,14 @@ printf("reading symbols\n"); /* Load the symbol table. */ error = vn_rdwr(UIO_READ, nd.ni_vp, - ef->symbase, ef->ddbsymcnt, shdr[symtabindex].sh_offset, + (void *)ef->ddbsymtab, ef->ddbsymcnt, shdr[symtabindex].sh_offset, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) goto out; printf("reading strings\n"); error = vn_rdwr(UIO_READ, nd.ni_vp, - ef->strbase, ef->ddbstrcnt, shdr[symstrindex].sh_offset, + ef->ddbstrtab, ef->ddbstrcnt, shdr[symstrindex].sh_offset, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) @@ -486,9 +495,9 @@ for (i = 0; i < ef->nprogtab; i++) { printf("reading progbits %d\n", i); error = vn_rdwr(UIO_READ, nd.ni_vp, - ef->progtab[pb].addr, - ef->progtab[pb].filesz, - ef->progtab[pb].fileoff, + ef->progtab[i].addr, + ef->progtab[i].filesz, + ef->progtab[i].fileoff, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) @@ -502,9 +511,9 @@ printf("reading rel\n"); for (i = 0; i < ef->nrel; i++) { error = vn_rdwr(UIO_READ, nd.ni_vp, - (void *)ef->reltab[pb].rel, - ef->reltab[pb].filesz, - ef->reltab[pb].fileoff, + (void *)ef->reltab[i].rel, + ef->reltab[i].filesz, + ef->reltab[i].fileoff, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) @@ -513,9 +522,9 @@ printf("reading rela\n"); for (i = 0; i < ef->nrela; i++) { error = vn_rdwr(UIO_READ, nd.ni_vp, - (void *)ef->relatab[pb].rela, - ef->relatab[pb].filesz, - ef->relatab[pb].fileoff, + (void *)ef->relatab[i].rela, + ef->relatab[i].filesz, + ef->relatab[i].fileoff, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) @@ -525,7 +534,7 @@ printf("now do post link stuff\n"); /* Inform the kld system about the situation */ - lf->address = ef->address; + lf->address = ef->address = mapbase; lf->size = mapsize; printf("do intra-module relocs\n"); @@ -577,10 +586,10 @@ if (ef->address) free(ef->address, M_LINKER); - if (ef->symbase) - free(ef->symbase, M_LINKER); - if (ef->strbase) - free(ef->strbase, M_LINKER); + if (ef->ddbsymtab) + free(ef->ddbsymtab, M_LINKER); + if (ef->ddbstrtab) + free(ef->ddbstrtab, M_LINKER); } static const char *