PERFORCE change 50029 for review
Peter Wemm
peter at FreeBSD.org
Tue Mar 30 19:03:58 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=50029
Change 50029 by peter at peter_hammer on 2004/03/30 19:03:31
delay boom! until later.
provide a test module that has really low objectives in life.
Affected files ...
.. //depot/projects/hammer/sys/kern/link_elf_obj.c#14 edit
.. //depot/projects/hammer/sys/modules/test/Makefile#1 add
.. //depot/projects/hammer/sys/modules/test/testmod.c#1 add
Differences ...
==== //depot/projects/hammer/sys/kern/link_elf_obj.c#14 (text+ko) ====
@@ -101,13 +101,15 @@
Elf_relent *reltab;
int nrel;
- const Elf_Sym* ddbsymtab; /* The symbol table we are using */
+ Elf_Sym *ddbsymtab; /* The symbol table we are using */
long ddbsymcnt; /* Number of symbols */
caddr_t ddbstrtab; /* String table */
long ddbstrcnt; /* number of bytes in string table */
+#if 0
caddr_t symbase; /* malloc'ed symbol base */
caddr_t strbase; /* malloc'ed string base */
+#endif
} *elf_file_t;
static int link_elf_link_preload(linker_class_t cls,
@@ -223,13 +225,14 @@
}
#endif
+printf("link_elf_obj: malloc header\n");
/* Read the elf header from the file. */
- hdr = malloc(sizeof(Elf_Ehdr *), M_LINKER, M_WAITOK);
+ hdr = malloc(sizeof(*hdr), M_LINKER, M_WAITOK);
if (hdr == NULL) {
error = ENOMEM;
goto out;
}
- error = vn_rdwr(UIO_READ, nd.ni_vp, (void *)hdr, PAGE_SIZE, 0,
+ error = vn_rdwr(UIO_READ, nd.ni_vp, (void *)hdr, sizeof(*hdr), 0,
UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
&resid, td);
if (error)
@@ -239,28 +242,33 @@
goto out;
}
+printf("link_elf_obj: is_elf?\n");
if (!IS_ELF(*hdr)) {
error = ENOEXEC;
goto out;
}
+printf("link_elf_obj: right class?\n");
if (hdr->e_ident[EI_CLASS] != ELF_TARG_CLASS
|| hdr->e_ident[EI_DATA] != ELF_TARG_DATA) {
link_elf_error("Unsupported file layout");
error = ENOEXEC;
goto out;
}
+printf("link_elf_obj: right version?\n");
if (hdr->e_ident[EI_VERSION] != EV_CURRENT
|| hdr->e_version != EV_CURRENT) {
link_elf_error("Unsupported file version");
error = ENOEXEC;
goto out;
}
- if (hdr->e_type != ET_EXEC && hdr->e_type != ET_REL) {
+printf("link_elf_obj: relocatable?\n");
+ if (hdr->e_type != ET_REL) {
link_elf_error("Unsupported file type");
error = ENOEXEC;
goto out;
}
+printf("link_elf_obj: right machine?\n");
if (hdr->e_machine != ELF_TARG_MACH) {
link_elf_error("Unsupported machine");
error = ENOEXEC;
@@ -338,6 +346,7 @@
break;
}
}
+printf("finished scan 1\n");
if (ef->nprogtab == 0 && ef->nnobittab == 0) {
link_elf_error("file has no contents");
error = ENOEXEC;
@@ -375,7 +384,7 @@
ef->ddbstrcnt = shdr[symstrindex].sh_size;
ef->ddbstrtab = malloc(shdr[symstrindex].sh_size, M_LINKER, M_WAITOK);
- if (ef->symbase == NULL || ef->strbase == NULL) {
+ if (ef->ddbsymtab == NULL || ef->ddbstrtab == NULL) {
error = ENOMEM;
goto out;
}
@@ -391,7 +400,7 @@
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
- alignmask = (1u << shdr[i].sh_addralign) - 1;
+ alignmask = shdr[i].sh_addralign - 1;
printf("addralign %ld mask %d\n", shdr[i].sh_addralign, alignmask);
mapsize += alignmask;
mapsize &= ~alignmask;
@@ -468,14 +477,14 @@
printf("reading symbols\n");
/* Load the symbol table. */
error = vn_rdwr(UIO_READ, nd.ni_vp,
- ef->symbase, ef->ddbsymcnt, shdr[symtabindex].sh_offset,
+ (void *)ef->ddbsymtab, ef->ddbsymcnt, shdr[symtabindex].sh_offset,
UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
&resid, td);
if (error)
goto out;
printf("reading strings\n");
error = vn_rdwr(UIO_READ, nd.ni_vp,
- ef->strbase, ef->ddbstrcnt, shdr[symstrindex].sh_offset,
+ ef->ddbstrtab, ef->ddbstrcnt, shdr[symstrindex].sh_offset,
UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
&resid, td);
if (error)
@@ -486,9 +495,9 @@
for (i = 0; i < ef->nprogtab; i++) {
printf("reading progbits %d\n", i);
error = vn_rdwr(UIO_READ, nd.ni_vp,
- ef->progtab[pb].addr,
- ef->progtab[pb].filesz,
- ef->progtab[pb].fileoff,
+ ef->progtab[i].addr,
+ ef->progtab[i].filesz,
+ ef->progtab[i].fileoff,
UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
&resid, td);
if (error)
@@ -502,9 +511,9 @@
printf("reading rel\n");
for (i = 0; i < ef->nrel; i++) {
error = vn_rdwr(UIO_READ, nd.ni_vp,
- (void *)ef->reltab[pb].rel,
- ef->reltab[pb].filesz,
- ef->reltab[pb].fileoff,
+ (void *)ef->reltab[i].rel,
+ ef->reltab[i].filesz,
+ ef->reltab[i].fileoff,
UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
&resid, td);
if (error)
@@ -513,9 +522,9 @@
printf("reading rela\n");
for (i = 0; i < ef->nrela; i++) {
error = vn_rdwr(UIO_READ, nd.ni_vp,
- (void *)ef->relatab[pb].rela,
- ef->relatab[pb].filesz,
- ef->relatab[pb].fileoff,
+ (void *)ef->relatab[i].rela,
+ ef->relatab[i].filesz,
+ ef->relatab[i].fileoff,
UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED,
&resid, td);
if (error)
@@ -525,7 +534,7 @@
printf("now do post link stuff\n");
/* Inform the kld system about the situation */
- lf->address = ef->address;
+ lf->address = ef->address = mapbase;
lf->size = mapsize;
printf("do intra-module relocs\n");
@@ -577,10 +586,10 @@
if (ef->address)
free(ef->address, M_LINKER);
- if (ef->symbase)
- free(ef->symbase, M_LINKER);
- if (ef->strbase)
- free(ef->strbase, M_LINKER);
+ if (ef->ddbsymtab)
+ free(ef->ddbsymtab, M_LINKER);
+ if (ef->ddbstrtab)
+ free(ef->ddbstrtab, M_LINKER);
}
static const char *
More information about the p4-projects
mailing list