Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Mar 2004 15:15:45 -0800 (PST)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 50016 for review
Message-ID:  <200403302315.i2UNFjRT055236@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=50016

Change 50016 by peter@peter_daintree on 2004/03/30 15:14:48

	Dont waste a whole page for the elf header.  There is
	nothing in close proximity anymore that makes it worth
	it anymore.

Affected files ...

.. //depot/projects/hammer/sys/kern/link_elf_obj.c#11 edit

Differences ...

==== //depot/projects/hammer/sys/kern/link_elf_obj.c#11 (text+ko) ====

@@ -143,9 +143,9 @@
 
 static struct linker_class link_elf_class = {
 #if ELF_TARG_CLASS == ELFCLASS32
-	"elf32",
+	"elf32_obj",
 #else
-	"elf64",
+	"elf64_obj",
 #endif
 	link_elf_methods, sizeof(struct elf_file)
 };
@@ -165,18 +165,20 @@
 	linker_add_class(&link_elf_class);
 }
 
-SYSINIT(link_elf, SI_SUB_KLD, SI_ORDER_SECOND, link_elf_init, 0);
+SYSINIT(link_elf_obj, SI_SUB_KLD, SI_ORDER_SECOND, link_elf_init, 0);
 
 static int
 link_elf_link_preload(linker_class_t cls, const char *filename,
     linker_file_t *result)
 {
+	/* preload not done this way */
 	return (EFTYPE);
 }
 
 static int
 link_elf_link_preload_finish(linker_file_t lf)
 {
+	/* preload not done this way */
 	return (EFTYPE);
 }
 
@@ -187,7 +189,6 @@
 	struct nameidata nd;
 	struct thread *td = curthread;	/* XXX */
 	Elf_Ehdr *hdr;
-	caddr_t firstpage;
 	int nbytes, i;
 	caddr_t mapbase;
 	size_t mapsize;
@@ -207,6 +208,7 @@
 	shdr = NULL;
 	lf = NULL;
 	mapsize = 0;
+	hdr = NULL;
 
 	NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename, td);
 	flags = FREAD;
@@ -217,27 +219,22 @@
 #ifdef MAC
 	error = mac_check_kld_load(curthread->td_ucred, nd.ni_vp);
 	if (error) {
-		firstpage = NULL;
 		goto out;
 	}
 #endif
 
-	/*
-	 * Read the elf header from the file.
-	 */
-	firstpage = malloc(PAGE_SIZE, M_LINKER, M_WAITOK);
-	if (firstpage == NULL) {
+	/* Read the elf header from the file. */
+	hdr = malloc(sizeof(Elf_Ehdr *), M_LINKER, M_WAITOK);
+	if (hdr == NULL) {
 		error = ENOMEM;
 		goto out;
 	}
-	hdr = (Elf_Ehdr *)firstpage;
-	error = vn_rdwr(UIO_READ, nd.ni_vp, firstpage, PAGE_SIZE, 0,
+	error = vn_rdwr(UIO_READ, nd.ni_vp, hdr, PAGE_SIZE, 0,
 	    UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
 	    &resid, td);
-	nbytes = PAGE_SIZE - resid;
 	if (error)
 		goto out;
-	if (nbytes < sizeof(Elf_Ehdr)){
+	if (resid != 0){
 		error = ENOEXEC;
 		goto out;
 	}
@@ -523,8 +520,8 @@
 		linker_file_unload(lf);
 	if (shdr)
 		free(shdr, M_LINKER);
-	if (firstpage)
-		free(firstpage, M_LINKER);
+	if (hdr)
+		free(hdr, M_LINKER);
 	VOP_UNLOCK(nd.ni_vp, 0, td);
 	vn_close(nd.ni_vp, FREAD, td->td_ucred, td);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200403302315.i2UNFjRT055236>