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

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

Change 49991 by peter@peter_daintree on 2004/03/30 11:43:04

	tidy up a bit.

Affected files ...

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

Differences ...

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

@@ -110,7 +110,6 @@
 	caddr_t		strbase;	/* malloc'ed string base */
 } *elf_file_t;
 
-static int	link_elf_link_common_finish(linker_file_t);
 static int	link_elf_link_preload(linker_class_t cls,
 		    const char *, linker_file_t *);
 static int	link_elf_link_preload_finish(linker_file_t);
@@ -159,23 +158,6 @@
 	printf("kldload: %s\n", s);
 }
 
-/*
- * Actions performed after linking/loading both the preloaded kernel and any
- * modules;
- */
-static int
-link_elf_link_common_finish(linker_file_t lf)
-{
-	int error;
-
-	/* Notify MD code that a module is being loaded. */
-	error = elf_cpu_load_file(lf);
-	if (error)
-		return (error);
-
-	return (0);
-}
-
 static void
 link_elf_init(void *arg)
 {
@@ -292,7 +274,7 @@
 		goto out;
 	}
 
-	/* Read in the section header */
+	/* Allocate and read in the section header */
 	nbytes = hdr->e_shnum * hdr->e_shentsize;
 	if (nbytes == 0 || hdr->e_shoff == 0 ||
 	    hdr->e_shentsize != sizeof(Elf_Shdr)) {
@@ -320,21 +302,7 @@
 	}
 	ef = (elf_file_t) lf;
 
-	/*
-	 * Scan the program header entries, and save key information.
-	 *
-	 * We rely on there being exactly two load segments, text and data,
-	 * in that order.
-	 *
-	 * XXX do several passes of section table instead.
-	 * XXX 1) count various things needed to size arrays
-	 * XXX 2) grab info about things like PROGBITS/REL/RELA/STRTAB/SYMTAB
-	 * XXX 3) read the string and symbol tables so we can do relocations etc
-	 * XXX 4) (later on) load the rest of the entries.
-	 */
-	shdr = (Elf_Shdr *)shtbuf;
-	shlimit = shdr + hdr->e_phnum;
-
+	/* Scan the section header for information and table sizing. */
 	ef->nprogent = 0;
 	ef->nnobits = 0;
 	nsym = 0;
@@ -369,6 +337,7 @@
 		goto out;
 	}
 	if (nsym != 1) {
+		/* Only allow one symbol table for now */
 		link_elf_error("file has no valid symbol table");
 		error = ENOEXEC;
 		goto out;
@@ -380,7 +349,8 @@
 		goto out;
 	}
 
-/* XXX *************** STEP 2 GOES HERE ************* XXX */
+	/* Allocate space for tracking the load chunks */
+	/* XXX - maybe unneeded. might be able to use the shdr directly */
 	if (ef->nprogtab != 0)
 		ef->progtab = malloc(ef->nprogtab * sizeof(*ef->progtab), M_LINKER, M_WAITOK);
 	if (ef->nnobittab != 0)
@@ -391,6 +361,7 @@
 		ef->relatab = malloc(ef->nrelatab * sizeof(*ef->relatab), M_LINKER, M_WAITOK);
 	/* XXX check for failures */
 
+	/* Space for symbol table */
 	ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym);
 	ef->ddbsymbase = malloc(shdr[symtabindex].sh_size, M_LINKER, M_WAITOK);
 
@@ -402,6 +373,7 @@
 		goto out;
 	}
 
+	/* Size code/data(progbits) and bss(nobits).  allocate space for relocs */
 	pb = 0;
 	nb = 0;
 	rl = 0;
@@ -456,19 +428,23 @@
 	if (ra != ef->nrelatab)
 		panic("lots rela");
 
+	/*
+	 * We know how much space we need for the text/data/bss/etc.
+	 * This stuff needs to be in a single chunk so that profiling etc
+	 * can get the bounds and gdb can associate offsets with modules
+	 */
 	mapbase = malloc(mapsize, M_LINKER, M_WAITOK | M_ZERO);
 	if (mapbase == NULL) {
 		error = ENOMEM;
 		goto out;
 	}
 
-	/* Now that we have the mapping address, plug in the offsets */
+	/* Add the base address to the previously calculated/aligned offsets */
 	for (i = 0; i < ef->nprogtab)
 		ef->progtab[i].addr += mapbase;
 	for (i = 0; i < ef->nnobittab)
 		ef->nobittab[i].addr += mapbase;
 	
-/* XXX *************** STEP 3 GOES HERE ************* XXX */
 
 	/* Load the symbol table. */
 	error = vn_rdwr(UIO_READ, nd.ni_vp,
@@ -483,6 +459,8 @@
 	    &resid, td);
 	if (error)
 		goto out;
+
+	/* Read in the text/data/set/etc sections */
 	for (i = 0; i < ef->nprogtab; i++) {
 		error = vn_rdwr(UIO_READ, nd.ni_vp,
 		    ef->progtab[pb].addr,
@@ -493,6 +471,11 @@
 		if (error)
 			goto out;
 	}
+
+	/*
+	 * Read in relocation tables.  Platforms use rel or rela, but
+	 * usually not both.
+	 */
 	for (i = 0; i < ef->nreltab; i++) {
 		error = vn_rdwr(UIO_READ, nd.ni_vp,
 		    ef->reltab[pb].addr,
@@ -515,21 +498,25 @@
 	}
 
 
-/* XXX *************** STEP 4 GOES HERE ************* XXX */
-
+	/* Inform the kld system about the situation */
 	lf->address = ef->address;
 	lf->size = mapsize;
 
+	/* Local intra-module relocations */
 	link_elf_reloc_local(lf);
 
+	/* Pull in dependencies */
 	error = linker_load_dependencies(lf);
 	if (error)
 		goto out;
+
+	/* External relocations */
 	error = relocate_file(ef);
 	if (error)
 		goto out;
 
-	error = link_elf_link_common_finish(lf);
+	/* Notify MD code that a module is being loaded. */
+	error = elf_cpu_load_file(lf);
 	if (error)
 		goto out;
 
@@ -784,7 +771,8 @@
 
 static int
 link_elf_each_function_name(linker_file_t file,
-    int (*callback)(const char *, void *), void *opaque) {
+    int (*callback)(const char *, void *), void *opaque)
+{
 	elf_file_t ef = (elf_file_t)file;
 	const Elf_Sym *symp;
 	int i, error;



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