From owner-p4-projects@FreeBSD.ORG Tue Mar 30 11:02:20 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7C41C16A4D0; Tue, 30 Mar 2004 11:02:20 -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 5633E16A4CE for ; Tue, 30 Mar 2004 11:02:20 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 37E7F43D62 for ; Tue, 30 Mar 2004 11:02:20 -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 i2UJ2JGe088827 for ; Tue, 30 Mar 2004 11:02:19 -0800 (PST) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i2UJ2Jll088818 for perforce@freebsd.org; Tue, 30 Mar 2004 11:02:19 -0800 (PST) (envelope-from peter@freebsd.org) Date: Tue, 30 Mar 2004 11:02:19 -0800 (PST) Message-Id: <200403301902.i2UJ2Jll088818@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 49986 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: Tue, 30 Mar 2004 19:02:21 -0000 http://perforce.freebsd.org/chv.cgi?CH=49986 Change 49986 by peter@peter_daintree on 2004/03/30 11:01:54 bah, the code/data/bss needs to be in a single block so that profiling and gdb -k can see it as a single entity. Not to mention the kldstat output that shows the base/size. Affected files ... .. //depot/projects/hammer/sys/kern/link_elf_obj.c#8 edit Differences ... ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#8 (text+ko) ==== @@ -208,6 +208,7 @@ caddr_t firstpage; int nbytes, i; int nsegs; + caddr_t mapbase; size_t mapsize; Elf_Addr base_vlimit; int error = 0; @@ -221,6 +222,7 @@ int strcnt; int nsym; int pb, nb, rl, ra; + int alignmask; GIANT_REQUIRED; @@ -404,29 +406,41 @@ nb = 0; rl = 0; ra = 0; + alignmask = 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); + case SHT_NOBITS: + alignmask = (1u << shdr[i].sh_addralign) - 1; + mapsize += alignmask; + mapsize &= ~alignmask; + break; + } + + switch (shdr[i].sh_type) { + case SHT_PROGBITS: + ef->progtab[pb].addr = mapsize; ef->progtab[pb].fileoff = shdr[i].sh_offset; ef->progtab[pb].size = shdr[i].sh_size; ef->progtab[pb].align = shdr[i].sh_addralign; + mapsize += shdr[i].sh_size; pb++; break; case SHT_NOBITS: - ef->nobittab[nb].addr = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK | M_ZERO); + ef->nobittab[nb].addr = mapsize; ef->nobittab[nb].size = shdr[i].sh_size; ef->nobittab[nb].align = shdr[i].sh_addralign; + mapsize += shdr[i].sh_size; nb++; break; case SHT_REL: - ef->reltab[rl].addr = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK); + 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].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++; @@ -441,6 +455,18 @@ panic("lots rel"); if (ra != ef->nrelatab) panic("lots rela"); + + 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 */ + 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 */