PERFORCE change 50029 for review

Peter Wemm peter at FreeBSD.org
Tue Mar 30 19:03:58 PST 2004


http://perforce.freebsd.org/chv.cgi?CH=50029

Change 50029 by peter at 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 *


More information about the p4-projects mailing list