PERFORCE change 49923 for review
Peter Wemm
peter at FreeBSD.org
Mon Mar 29 15:30:04 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=49923
Change 49923 by peter at 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 */
More information about the p4-projects
mailing list