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>