Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Mar 2004 14:33:51 -0800 (PST)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 50010 for review
Message-ID:  <200403302233.i2UMXpxB045657@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=50010

Change 50010 by peter@peter_daintree on 2004/03/30 14:33:40

	oh the horror! make it compile.

Affected files ...

.. //depot/projects/hammer/sys/kern/link_elf_obj.c#10 edit

Differences ...

==== //depot/projects/hammer/sys/kern/link_elf_obj.c#10 (text+ko) ====

@@ -65,20 +65,20 @@
 
 typedef struct {
 	void		*addr;
-	Elf_Off		filesz;
+	Elf_Off		memsz;
 	int		align;
 	int		flags;
 } Elf_nobitent;
 	
 typedef struct {
-	const Elf_Rel	*rel;
+	Elf_Rel		*rel;
 	int		relsize;
 	Elf_Off		fileoff;
 	Elf_Off		filesz;
 } Elf_relent;
 
 typedef struct {
-	const Elf_Rela	*rela;
+	Elf_Rela	*rela;
 	int		relasize;
 	Elf_Off		fileoff;
 	Elf_Off		filesz;
@@ -189,10 +189,8 @@
 	Elf_Ehdr *hdr;
 	caddr_t firstpage;
 	int nbytes, i;
-	int nsegs;
 	caddr_t mapbase;
 	size_t mapsize;
-	Elf_Addr base_vlimit;
 	int error = 0;
 	int resid, flags;
 	elf_file_t ef;
@@ -200,8 +198,6 @@
 	Elf_Shdr *shdr;
 	int symtabindex;
 	int symstrindex;
-	int symcnt;
-	int strcnt;
 	int nsym;
 	int pb, nb, rl, ra;
 	int alignmask;
@@ -303,8 +299,8 @@
 	ef = (elf_file_t) lf;
 
 	/* Scan the section header for information and table sizing. */
-	ef->nprogent = 0;
-	ef->nnobits = 0;
+	ef->nprogtab = 0;
+	ef->nnobittab = 0;
 	nsym = 0;
 	ef->nrel = 0;
 	ef->nrela = 0;
@@ -324,14 +320,14 @@
 			symstrindex = shdr[i].sh_link;
 			break;
 		case SHT_REL:
-			ef->nreltab++;
+			ef->nrel++;
 			break;
 		case SHT_RELA:
-			ef->nrelatab++;
+			ef->nrela++;
 			break;
 		}
 	}
-	if (nprogbits == 0 && nnobits == 0) {
+	if (ef->nprogtab == 0 && ef->nnobittab == 0) {
 		link_elf_error("file has no contents");
 		error = ENOEXEC;
 		goto out;
@@ -342,7 +338,7 @@
 		error = ENOEXEC;
 		goto out;
 	}
-	if (symstrindex < 0 || sysmstrindex > hdr->e_shnum ||
+	if (symstrindex < 0 || symstrindex > hdr->e_shnum ||
 	    shdr[symstrindex].sh_type != SHT_STRTAB) {
 		link_elf_error("file has invalid symbol strings");
 		error = ENOEXEC;
@@ -354,19 +350,19 @@
 	if (ef->nprogtab != 0)
 		ef->progtab = malloc(ef->nprogtab * sizeof(*ef->progtab), M_LINKER, M_WAITOK);
 	if (ef->nnobittab != 0)
-		ef->nobittab = malloc(ef->nobbittab * sizeof(*ef->nobittab), M_LINKER, M_WAITOK);
-	if (ef->nreltab != 0)
-		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);
+		ef->nobittab = malloc(ef->nnobittab * sizeof(*ef->nobittab), M_LINKER, M_WAITOK);
+	if (ef->nrel != 0)
+		ef->reltab = malloc(ef->nrel * sizeof(*ef->reltab), M_LINKER, M_WAITOK);
+	if (ef->nrela != 0)
+		ef->relatab = malloc(ef->nrela * sizeof(*ef->relatab), M_LINKER, M_WAITOK);
 	/* XXX check for failures */
 
 	/* Space for symbol table */
 	ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym);
-	ef->ddbsymbase = malloc(shdr[symtabindex].sh_size, M_LINKER, M_WAITOK);
+	ef->ddbsymtab = malloc(shdr[symtabindex].sh_size, M_LINKER, M_WAITOK);
 
 	ef->ddbstrcnt = shdr[symstrindex].sh_size;
-	ef->ddbstrbase = malloc(shdr[symstrindex].sh_size, M_LINKER, M_WAITOK);
+	ef->ddbstrtab = malloc(shdr[symstrindex].sh_size, M_LINKER, M_WAITOK);
 
 	if (ef->symbase == NULL || ef->strbase == NULL) {
 		error = ENOMEM;
@@ -391,30 +387,30 @@
 
 		switch (shdr[i].sh_type) {
 		case SHT_PROGBITS:
-			ef->progtab[pb].addr = mapsize;
+			ef->progtab[pb].addr = (void *)(uintptr_t)mapsize;
 			ef->progtab[pb].fileoff = shdr[i].sh_offset;
-			ef->progtab[pb].size = shdr[i].sh_size;
+			ef->progtab[pb].filesz = 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 = mapsize;
-			ef->nobittab[nb].size = shdr[i].sh_size;
+			ef->nobittab[nb].addr = (void *)(uintptr_t)mapsize;
+			ef->nobittab[nb].memsz = 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].rel = 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;
+			ef->reltab[rl].filesz = 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].rela = 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;
+			ef->relatab[ra].filesz = shdr[i].sh_size;
 			ra++;
 			break;
 		}
@@ -423,9 +419,9 @@
 		panic("lots progbits");
 	if (nb != ef->nnobittab)
 		panic("lots nobits");
-	if (rl != ef->nreltab)
+	if (rl != ef->nrel)
 		panic("lots rel");
-	if (ra != ef->nrelatab)
+	if (ra != ef->nrela)
 		panic("lots rela");
 
 	/*
@@ -440,21 +436,21 @@
 	}
 
 	/* Add the base address to the previously calculated/aligned offsets */
-	for (i = 0; i < ef->nprogtab)
-		ef->progtab[i].addr += mapbase;
-	for (i = 0; i < ef->nnobittab)
-		ef->nobittab[i].addr += mapbase;
+	for (i = 0; i < ef->nprogtab; i++)
+		ef->progtab[i].addr = mapbase + (uintptr_t)ef->progtab[i].addr;
+	for (i = 0; i < ef->nnobittab; i++)
+		ef->nobittab[i].addr = mapbase + (uintptr_t)ef->nobittab[i].addr;
 	
 
 	/* Load the symbol table. */
 	error = vn_rdwr(UIO_READ, nd.ni_vp,
-	    ef->symbase, symcnt, shdr[symtabindex].sh_offset,
+	    ef->symbase, ef->ddbsymcnt, shdr[symtabindex].sh_offset,
 	    UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
 	    &resid, td);
 	if (error)
 		goto out;
 	error = vn_rdwr(UIO_READ, nd.ni_vp,
-	    ef->strbase, strcnt, shdr[symstrindex].sh_offset,
+	    ef->strbase, ef->ddbstrcnt, shdr[symstrindex].sh_offset,
 	    UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
 	    &resid, td);
 	if (error)
@@ -464,8 +460,8 @@
 	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
+		    ef->progtab[pb].filesz,
+		    ef->progtab[pb].fileoff,
 		    UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
 		    &resid, td);
 		if (error)
@@ -476,21 +472,21 @@
 	 * Read in relocation tables.  Platforms use rel or rela, but
 	 * usually not both.
 	 */
-	for (i = 0; i < ef->nreltab; i++) {
+	for (i = 0; i < ef->nrel; i++) {
 		error = vn_rdwr(UIO_READ, nd.ni_vp,
-		    ef->reltab[pb].addr,
-		    ef->reltab[pb].size,
-		    ef->reltab[pb].fileoff
+		    (void *)ef->reltab[pb].rel,
+		    ef->reltab[pb].filesz,
+		    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++) {
+	for (i = 0; i < ef->nrela; i++) {
 		error = vn_rdwr(UIO_READ, nd.ni_vp,
-		    ef->relatab[pb].addr,
-		    ef->relatab[pb].size,
-		    ef->relatab[pb].fileoff
+		    (void *)ef->relatab[pb].rela,
+		    ef->relatab[pb].filesz,
+		    ef->relatab[pb].fileoff,
 		    UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
 		    &resid, td);
 		if (error)
@@ -520,8 +516,6 @@
 	if (error)
 		goto out;
 
-nosyms:
-
 	*result = lf;
 
 out:
@@ -559,8 +553,8 @@
 	const Elf_Sym *ref;
 
 	if (ELF_R_SYM(r_info)) {
-		ref = ef->symtab + ELF_R_SYM(r_info);
-		return ef->strtab + ref->st_name;
+		ref = ef->ddbsymtab + ELF_R_SYM(r_info);
+		return ef->ddbstrtab + ref->st_name;
 	} else
 		return NULL;
 }
@@ -573,63 +567,41 @@
 	const Elf_Rela *relalim;
 	const Elf_Rela *rela;
 	const char *symname;
+	int i;
 
+
 	/* Perform relocations without addend if there are any: */
-	rel = ef->rel;
-	if (rel) {
-		rellim = (const Elf_Rel *)((const char *)ef->rel + ef->relsize);
-		while (rel < rellim) {
-			if (elf_reloc(&ef->lf, rel, ELF_RELOC_REL)) {
-				symname = symbol_name(ef, rel->r_info);
-				printf("link_elf: symbol %s undefined\n", symname);
-				return ENOENT;
+	for (i = 0; i < ef->nrel; i++) {
+		rel = ef->reltab[i].rel;
+		if (rel) {
+			rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].relsize);
+			while (rel < rellim) {
+				if (elf_reloc(&ef->lf, rel, ELF_RELOC_REL)) {
+					symname = symbol_name(ef, rel->r_info);
+					printf("link_elf: symbol %s undefined\n", symname);
+					return ENOENT;
+				}
+				rel++;
 			}
-			rel++;
 		}
 	}
 
 	/* Perform relocations with addend if there are any: */
-	rela = ef->rela;
-	if (rela) {
-		relalim = (const Elf_Rela *)((const char *)ef->rela + ef->relasize);
-		while (rela < relalim) {
-			if (elf_reloc(&ef->lf, rela, ELF_RELOC_RELA)) {
-				symname = symbol_name(ef, rela->r_info);
-				printf("link_elf: symbol %s undefined\n", symname);
-				return ENOENT;
-			}
-			rela++;
-		}
-	}
-
-	/* Perform PLT relocations without addend if there are any: */
-	rel = ef->pltrel;
-	if (rel) {
-		rellim = (const Elf_Rel *)((const char *)ef->pltrel + ef->pltrelsize);
-		while (rel < rellim) {
-			if (elf_reloc(&ef->lf, rel, ELF_RELOC_REL)) {
-				symname = symbol_name(ef, rel->r_info);
-				printf("link_elf: symbol %s undefined\n", symname);
-				return ENOENT;
+	for (i = 0; i < ef->nrela; i++) {
+		rela = ef->relatab[i].rela;
+		if (rela) {
+			relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].relasize);
+			while (rela < relalim) {
+				if (elf_reloc(&ef->lf, rela, ELF_RELOC_RELA)) {
+					symname = symbol_name(ef, rela->r_info);
+					printf("link_elf: symbol %s undefined\n", symname);
+					return ENOENT;
+				}
+				rela++;
 			}
-			rel++;
 		}
 	}
 
-	/* Perform relocations with addend if there are any: */
-	rela = ef->pltrela;
-	if (rela) {
-		relalim = (const Elf_Rela *)((const char *)ef->pltrela + ef->pltrelasize);
-		while (rela < relalim) {
-			if (elf_reloc(&ef->lf, rela, ELF_RELOC_RELA)) {
-				symname = symbol_name(ef, rela->r_info);
-				printf("link_elf: symbol %s undefined\n", symname);
-				return ENOENT;
-			}
-			rela++;
-		}
-	}
-
 	return 0;
 }
 
@@ -637,7 +609,6 @@
 link_elf_lookup_symbol(linker_file_t lf, const char *name, c_linker_sym_t *sym)
 {
 	elf_file_t ef = (elf_file_t) lf;
-	unsigned long symnum;
 	const Elf_Sym *symp;
 	const char *strp;
 	int i;
@@ -789,6 +760,7 @@
 	return (0);
 }
 
+#if 0
 const Elf_Sym *
 elf_get_sym(linker_file_t lf, Elf_Word symidx)
 {
@@ -810,7 +782,9 @@
 	sym = ef->symtab + symidx;
 	return (ef->strtab + sym->st_name);
 }
+#endif
 
+#if 0
 /*
  * Symbol lookup function that can be used when the symbol index is known (ie
  * in relocations). It uses the symbol index instead of doing a fully fledged
@@ -857,6 +831,7 @@
 
 	return ((Elf_Addr)linker_file_lookup_symbol(lf, symbol, deps));
 }
+#endif
 
 static void
 link_elf_reloc_local(linker_file_t lf)
@@ -866,22 +841,29 @@
 	const Elf_Rela *relalim;
 	const Elf_Rela *rela;
 	elf_file_t ef = (elf_file_t)lf;
+	int i;
 
 	/* Perform relocations without addend if there are any: */
-	if ((rel = ef->rel) != NULL) {
-		rellim = (const Elf_Rel *)((const char *)ef->rel + ef->relsize);
-		while (rel < rellim) {
-			elf_reloc_local(lf, rel, ELF_RELOC_REL);
-			rel++;
+	for (i = 0; i < ef->nrel; i++) {
+		rel = ef->reltab[i].rel;
+		if (rel) {
+			rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].relsize);
+			while (rel < rellim) {
+				elf_reloc_local(lf, rel, ELF_RELOC_REL);
+				rel++;
+			}
 		}
 	}
 
 	/* Perform relocations with addend if there are any: */
-	if ((rela = ef->rela) != NULL) {
-		relalim = (const Elf_Rela *)((const char *)ef->rela + ef->relasize);
-		while (rela < relalim) {
-			elf_reloc_local(lf, rela, ELF_RELOC_RELA);
-			rela++;
+	for (i = 0; i < ef->nrela; i++) {
+		rela = ef->relatab[i].rela;
+		if (rela) {
+			relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].relasize);
+			while (rela < relalim) {
+				elf_reloc_local(lf, rela, ELF_RELOC_RELA);
+				rela++;
+			}
 		}
 	}
 }



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