Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Mar 2004 11:02:19 -0800 (PST)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 49986 for review
Message-ID:  <200403301902.i2UJ2Jll088818@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 */
 



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