Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 29 Mar 2004 15:30:03 -0800 (PST)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 49923 for review
Message-ID:  <200403292330.i2TNU3GD098630@repoman.freebsd.org>

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

Change 49923 by peter@peter_daintree on 2004/03/29 15:29:56

	checkpoint.  actually load the progbits/etc sections.

Affected files ...

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

Differences ...

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

@@ -56,26 +56,32 @@
 #include "linker_if.h"
 
 typedef struct {
-	Elf_Addr	base_vaddr;
-	Elf_Off		base_offset;
+	void		*addr;
+	Elf_Off		fileoff;
 	Elf_Off		filesz;
+	int		align;
 	int		flags;
 } Elf_progent;
 
 typedef struct {
-	Elf_Addr	base_vaddr;
+	void		*addr;
 	Elf_Off		filesz;
+	int		align;
 	int		flags;
 } Elf_nobitent;
 	
 typedef struct {
 	const Elf_Rel	*rel;
 	int		relsize;
+	Elf_Off		fileoff;
+	Elf_Off		filesz;
 } Elf_relent;
 
 typedef struct {
 	const Elf_Rela	*rela;
 	int		relasize;
+	Elf_Off		fileoff;
+	Elf_Off		filesz;
 } Elf_relaent;
 
 
@@ -219,6 +225,8 @@
 	int symstrindex;
 	int symcnt;
 	int strcnt;
+	int nsym;
+	int pb, nb, rl, ra;
 
 	GIANT_REQUIRED;
 
@@ -390,6 +398,7 @@
 		ef->reltab = malloc(ef->nreltab * sizeof(*ef->reltab), M_LINKER, M_WAITOK);
 	if (ef->nrelatab != 0)
 		ef->relatab = malloc(ef->nrelatab * sizeof(*ef->relatab), M_LINKER, M_WAITOK);
+	/* XXX check for failures */
 
 	ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym);
 	ef->ddbsymbase = malloc(shdr[symtabindex].sh_size, M_LINKER, M_WAITOK);
@@ -402,11 +411,47 @@
 		goto out;
 	}
 
+	pb = 0;
+	nb = 0;
+	rl = 0;
+	ra = 0;
 	for (i = 0; i < hdr->e_shnum; i++) {
 		switch (shdr[i].sh_type) {
-
+		case SHT_PROGBITS:
+			ef->progtab[pb].addr = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK);
+			ef->progtab[pb].fileoff = shdr[i].sh_offset;
+			ef->progtab[pb].size = shdr[i].sh_size;
+			ef->progtab[pb].align = shdr[i].sh_addralign;
+			pb++;
+			break;
+		case SHT_NOBITS:
+			ef->nobittab[nb].addr = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK | M_ZERO);
+			ef->nobittab[nb].size = shdr[i].sh_size;
+			ef->nobittab[nb].align = shdr[i].sh_addralign;
+			nb++;
+			break;
+		case SHT_REL:
+			ef->reltab[rl].addr = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK);
+			ef->reltab[rl].fileoff = shdr[i].sh_offset;
+			ef->reltab[rl].size = shdr[i].sh_size;
+			rl++;
+			break;
+		case SHT_RELA:
+			ef->relatab[ra].addr = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK);
+			ef->relatab[ra].fileoff = shdr[i].sh_offset;
+			ef->relatab[ra].size = shdr[i].sh_size;
+			ra++;
+			break;
 		}
 	}
+	if (pb != ef->nprogtab)
+		panic("lots progbits");
+	if (nb != ef->nnobittab)
+		panic("lots nobits");
+	if (rl != ef->nreltab)
+		panic("lots rel");
+	if (ra != ef->nrelatab)
+		panic("lots rela");
 	
 /* XXX *************** STEP 3 GOES HERE ************* XXX */
 
@@ -423,6 +468,36 @@
 	    &resid, td);
 	if (error)
 		goto out;
+	for (i = 0; i < ef->nprogtab; i++) {
+		error = vn_rdwr(UIO_READ, nd.ni_vp,
+		    ef->progtab[pb].addr,
+		    ef->progtab[pb].size,
+		    ef->progtab[pb].fileoff
+		    UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
+		    &resid, td);
+		if (error)
+			goto out;
+	}
+	for (i = 0; i < ef->nreltab; i++) {
+		error = vn_rdwr(UIO_READ, nd.ni_vp,
+		    ef->reltab[pb].addr,
+		    ef->reltab[pb].size,
+		    ef->reltab[pb].fileoff
+		    UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
+		    &resid, td);
+		if (error)
+			goto out;
+	}
+	for (i = 0; i < ef->nrelatab; i++) {
+		error = vn_rdwr(UIO_READ, nd.ni_vp,
+		    ef->relatab[pb].addr,
+		    ef->relatab[pb].size,
+		    ef->relatab[pb].fileoff
+		    UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
+		    &resid, td);
+		if (error)
+			goto out;
+	}
 
 
 /* XXX *************** STEP 4 GOES HERE ************* XXX */



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