From owner-p4-projects@FreeBSD.ORG Mon Mar 29 15:30:04 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 2468116A4D0; Mon, 29 Mar 2004 15:30:04 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id D62A916A4CE for ; Mon, 29 Mar 2004 15:30:03 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id BA0D543D2D for ; Mon, 29 Mar 2004 15:30:03 -0800 (PST) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.10/8.12.10) with ESMTP id i2TNU3Ge098633 for ; Mon, 29 Mar 2004 15:30:03 -0800 (PST) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i2TNU3GD098630 for perforce@freebsd.org; Mon, 29 Mar 2004 15:30:03 -0800 (PST) (envelope-from peter@freebsd.org) Date: Mon, 29 Mar 2004 15:30:03 -0800 (PST) Message-Id: <200403292330.i2TNU3GD098630@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 49923 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Mar 2004 23:30:04 -0000 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 */