diff options
author | Dale Rahn <drahn@cvs.openbsd.org> | 2011-07-08 21:39:33 +0000 |
---|---|---|
committer | Dale Rahn <drahn@cvs.openbsd.org> | 2011-07-08 21:39:33 +0000 |
commit | 9bd8584be003206951fc40592b806b6e8403eb6f (patch) | |
tree | feb5841cf8a27b312fd8eaf8b67676c88e4b03d0 /distrib | |
parent | 20f2a7c4359811d4c20ec3078b7360cc5a706289 (diff) |
Allow the elf rdsetroot operation to function on 32 bit and 64 bit binaries.
Enables developers to build arm ramdisk kernels on amd64 archs
OK deraadt@ 'looked fine' miod@
Diffstat (limited to 'distrib')
-rw-r--r-- | distrib/alpha/bsd.rd/Makefile | 6 | ||||
-rw-r--r-- | distrib/alpha/common/Makefile.inc | 6 | ||||
-rw-r--r-- | distrib/amd64/common/Makefile.inc | 9 | ||||
-rw-r--r-- | distrib/armish/ramdisk/Makefile | 6 | ||||
-rw-r--r-- | distrib/beagle/ramdisk/Makefile | 6 | ||||
-rw-r--r-- | distrib/common/elf32.c | 2 | ||||
-rw-r--r-- | distrib/common/elf64.c | 2 | ||||
-rw-r--r-- | distrib/common/elfrd_size.c | 358 | ||||
-rw-r--r-- | distrib/common/elfrdsetroot.c | 94 | ||||
-rw-r--r-- | distrib/common/elfrdsetroot.h | 11 | ||||
-rw-r--r-- | distrib/i386/common/Makefile.inc | 6 | ||||
-rw-r--r-- | distrib/landisk/ramdisk/Makefile | 6 | ||||
-rw-r--r-- | distrib/loongson/ramdisk/Makefile | 6 | ||||
-rw-r--r-- | distrib/macppc/ramdisk/Makefile | 6 | ||||
-rw-r--r-- | distrib/palm/ramdisk/Makefile | 6 | ||||
-rw-r--r-- | distrib/sgi/ramdisk/Makefile | 6 | ||||
-rw-r--r-- | distrib/socppc/ramdisk/Makefile | 6 | ||||
-rw-r--r-- | distrib/sparc64/bsd.rd/Makefile | 6 | ||||
-rw-r--r-- | distrib/sparc64/ramdisk/Makefile | 6 | ||||
-rw-r--r-- | distrib/sparc64/ramdiskB/Makefile | 6 | ||||
-rw-r--r-- | distrib/zaurus/ramdisk/Makefile | 6 |
21 files changed, 453 insertions, 113 deletions
diff --git a/distrib/alpha/bsd.rd/Makefile b/distrib/alpha/bsd.rd/Makefile index 50c0af31935..45a2b4a4817 100644 --- a/distrib/alpha/bsd.rd/Makefile +++ b/distrib/alpha/bsd.rd/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.18 2011/04/18 16:52:09 thib Exp $ +# $OpenBSD: Makefile,v 1.19 2011/07/08 21:39:32 drahn Exp $ TOP= ${.CURDIR}/.. @@ -58,7 +58,9 @@ ${IMAGE}: do_prep do_mount do_files do_umount mv -f ${REALIMAGE} ${IMAGE} elfrdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c do_prep: dd if=/dev/zero of=${REALIMAGE} count=${NBLKS} diff --git a/distrib/alpha/common/Makefile.inc b/distrib/alpha/common/Makefile.inc index f8c81a62bca..45450cb93a9 100644 --- a/distrib/alpha/common/Makefile.inc +++ b/distrib/alpha/common/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.23 2011/04/18 16:52:09 thib Exp $ +# $OpenBSD: Makefile.inc,v 1.24 2011/07/08 21:39:32 drahn Exp $ TOP= ${.CURDIR}/.. @@ -82,7 +82,9 @@ ${IMAGE}: do_prep do_mount do_files do_umount mv -f ${REALIMAGE} ${IMAGE} elfrdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c do_prep: dd if=/dev/zero of=${REALIMAGE} count=${NBLKS} diff --git a/distrib/amd64/common/Makefile.inc b/distrib/amd64/common/Makefile.inc index 57225e833de..85bfd35cbfd 100644 --- a/distrib/amd64/common/Makefile.inc +++ b/distrib/amd64/common/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.16 2011/04/18 16:52:09 thib Exp $ +# $OpenBSD: Makefile.inc,v 1.17 2011/07/08 21:39:32 drahn Exp $ TOP= ${.CURDIR}/.. @@ -66,7 +66,8 @@ bsd.rd: ${IMAGE} bsd rdsetroot bsd: cd ${.CURDIR}/../../../sys/arch/amd64/conf && config ${RAMDISK} cd ${.CURDIR}/../../../sys/arch/amd64/compile/${RAMDISK} && \ - ${MAKE} clean && COPTS=-Os exec ${MAKE} + COPTS=-Os exec ${MAKE} +# ${MAKE} clean && COPTS=-Os exec ${MAKE} cp ${.CURDIR}/../../../sys/arch/amd64/compile/${RAMDISK}/bsd bsd ${IMAGE}: ${CBIN} rd_setup do_files rd_teardown @@ -87,7 +88,9 @@ rd_teardown: rm ${REALIMAGE} rdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o rdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/armish/ramdisk/Makefile b/distrib/armish/ramdisk/Makefile index 0eaed7e3f10..e8a272b2215 100644 --- a/distrib/armish/ramdisk/Makefile +++ b/distrib/armish/ramdisk/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.9 2011/04/18 16:52:09 thib Exp $ +# $OpenBSD: Makefile,v 1.10 2011/07/08 21:39:32 drahn Exp $ REV= ${OSrev} @@ -71,7 +71,9 @@ rd_teardown: -vnconfig -u ${VND} rdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o rdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/beagle/ramdisk/Makefile b/distrib/beagle/ramdisk/Makefile index 6b4684b3a6f..32a97e2910f 100644 --- a/distrib/beagle/ramdisk/Makefile +++ b/distrib/beagle/ramdisk/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.4 2011/04/18 16:52:09 thib Exp $ +# $OpenBSD: Makefile,v 1.5 2011/07/08 21:39:32 drahn Exp $ REV= ${OSrev} @@ -70,7 +70,9 @@ rd_teardown: -vnconfig -u ${VND} rdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o rdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/common/elf32.c b/distrib/common/elf32.c new file mode 100644 index 00000000000..7ddf2db81d5 --- /dev/null +++ b/distrib/common/elf32.c @@ -0,0 +1,2 @@ +#define ELFSIZE 32 +#include "elfrd_size.c" diff --git a/distrib/common/elf64.c b/distrib/common/elf64.c new file mode 100644 index 00000000000..e5409d76ff3 --- /dev/null +++ b/distrib/common/elf64.c @@ -0,0 +1,2 @@ +#define ELFSIZE 64 +#include "elfrd_size.c" diff --git a/distrib/common/elfrd_size.c b/distrib/common/elfrd_size.c new file mode 100644 index 00000000000..de0cf37731e --- /dev/null +++ b/distrib/common/elfrd_size.c @@ -0,0 +1,358 @@ +#include <sys/types.h> +#include <sys/file.h> +#include <sys/mman.h> +#include <sys/stat.h> + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <nlist.h> + +#include <errno.h> +#include <limits.h> + +#include <sys/exec_elf.h> + +#include "elfrdsetroot.h" + +void * +ELFNAME(locate_image)(int, struct elfhdr *, char *, long *, long *, off_t *, + size_t *); +int +ELFNAME(find_rd_root_image)(char *, int, Elf_Phdr *, int, long *, long *, + off_t *, size_t *); + +struct elf_fn ELFDEFNNAME(fn) = +{ + ELFNAME(locate_image), + ELFNAME(find_rd_root_image) +}; + +void * +ELFNAME(locate_image)(int fd, struct elfhdr *ghead, char *file, + long *prd_root_size_off, long *prd_root_image_off, off_t *pmmap_off, + size_t *pmmap_size) +{ + int n; + int found = 0; + size_t phsize; + Elf_Ehdr head; + + Elf_Phdr *ph; + + /* elfhdr may not have the full header? */ + lseek(fd, 0, SEEK_SET); + + if (read(fd, (char *)&head, sizeof(head)) != sizeof(head)) { + fprintf(stderr, "%s: can't read phdr area\n", file); + exit(1); + } + + phsize = head.e_phnum * sizeof(Elf_Phdr); + ph = (Elf_Phdr *)malloc(phsize); + + + lseek(fd, head.e_phoff, SEEK_SET); + + if (read(fd, (char *)ph, phsize) != phsize) { + fprintf(stderr, "%s: can't read phdr area\n", file); + exit(1); + } + + for (n = 0; n < head.e_phnum && !found; n++) { + if (ph[n].p_type == PT_LOAD) + found = ELFNAME(find_rd_root_image)(file, fd, &ph[n], + n, prd_root_size_off, prd_root_image_off, + pmmap_off, pmmap_size); + } + if (!found) { + fprintf(stderr, "%s: can't locate space for rd_root_image!\n", + file); + exit(1); + } + free(ph); +} + +struct nlist ELFNAME(wantsyms)[] = { + { "_rd_root_size", 0 }, + { "_rd_root_image", 0 }, + { NULL, 0 } +}; + +int +ELFNAME(find_rd_root_image)(char *file, int fd, Elf_Phdr *ph, int segment, + long *prd_root_size_off, long *prd_root_image_off, off_t *pmmap_off, + size_t *pmmap_size) +{ + unsigned long kernel_start, kernel_size; + uint64_t rd_root_size_off, rd_root_image_off; + + if (ELFNAME(nlist)(fd, ELFNAME(wantsyms))) { + fprintf(stderr, "%s: no rd_root_image symbols?\n", file); + exit(1); + } + kernel_start = ph->p_paddr; + kernel_size = ph->p_filesz; + + rd_root_size_off = ELFNAME(wantsyms)[0].n_value - kernel_start; + rd_root_size_off -= (ph->p_vaddr - ph->p_paddr); + rd_root_image_off = ELFNAME(wantsyms)[1].n_value - kernel_start; + rd_root_image_off -= (ph->p_vaddr - ph->p_paddr); + + if (debug) { + fprintf(stderr, "segment %d rd_root_size_off = 0x%x\n", segment, + rd_root_size_off); + if ((ph->p_vaddr - ph->p_paddr) != 0) + fprintf(stderr, "root_off v %x p %x, diff %x altered %x\n", + ph->p_vaddr, ph->p_paddr, + (ph->p_vaddr - ph->p_paddr), + rd_root_size_off - (ph->p_vaddr - ph->p_paddr)); + fprintf(stderr, "rd_root_image_off = 0x%x\n", rd_root_image_off); + } + + /* + * Sanity check locations of db_* symbols + */ + if (rd_root_image_off < 0 || rd_root_image_off >= kernel_size) + return (0); + if (rd_root_size_off < 0 || rd_root_size_off >= kernel_size) { + fprintf(stderr, "%s: rd_root_size not in data segment?\n", + file); + return (0); + } + *pmmap_off = ph->p_offset; + *pmmap_size = kernel_size; + *prd_root_size_off = rd_root_size_off; + *prd_root_image_off = rd_root_image_off; + return (1); +} + +/* + * __elf_is_okay__ - Determine if ehdr really + * is ELF and valid for the target platform. + * + * WARNING: This is NOT a ELF ABI function and + * as such it's use should be restricted. + */ +int +ELFNAME(__elf_is_okay__)(Elf_Ehdr *ehdr) +{ + int retval = 0; + /* + * We need to check magic, class size, endianess, + * and version before we look at the rest of the + * Elf_Ehdr structure. These few elements are + * represented in a machine independent fashion. + */ + if (IS_ELF(*ehdr) && + ehdr->e_ident[EI_DATA] == ELF_TARG_DATA && + ehdr->e_ident[EI_VERSION] == ELF_TARG_VER) { + +#if 0 /* allow cross, no arch check */ + /* Now check the machine dependant header */ + if (ehdr->e_machine == ELF_TARG_MACH && + ehdr->e_version == ELF_TARG_VER) +#endif + retval = 1; + } + + return retval; +} + +#define ISLAST(p) (p->n_name == 0 || p->n_name[0] == 0) +#define MIN(x, y) ((x)<(y)? (x) : (y)) + + +int +ELFNAME(nlist)(int fd, struct nlist *list) +{ + struct nlist *p; + caddr_t strtab; + Elf_Off symoff = 0, symstroff = 0; + Elf_Word symsize = 0; + long symstrsize = 0; + Elf_Sword nent, cc, i; + Elf_Sym sbuf[1024]; + Elf_Sym *s; + Elf_Ehdr ehdr; + Elf_Shdr *shdr = NULL; + size_t shdr_size; + struct stat st; + int usemalloc = 0; + + /* Make sure obj is OK */ + if (pread(fd, &ehdr, sizeof(Elf_Ehdr), (off_t)0) != sizeof(Elf_Ehdr) || + !ELFNAME(__elf_is_okay__)(&ehdr) || fstat(fd, &st) < 0) + return (-1); + + /* calculate section header table size */ + shdr_size = ehdr.e_shentsize * ehdr.e_shnum; + + /* Make sure it's not too big to mmap */ + if (shdr_size > SIZE_T_MAX) { + errno = EFBIG; + return (-1); + } + + /* mmap section header table */ + shdr = (Elf_Shdr *)mmap(NULL, (size_t)shdr_size, PROT_READ, + MAP_SHARED|MAP_FILE, fd, (off_t) ehdr.e_shoff); + if (shdr == MAP_FAILED) { + usemalloc = 1; + if ((shdr = malloc(shdr_size)) == NULL) + return (-1); + + if (pread(fd, shdr, shdr_size, (off_t)ehdr.e_shoff) != shdr_size) { + free(shdr); + return (-1); + } + } + + /* + * Find the symbol table entry and it's corresponding + * string table entry. Version 1.1 of the ABI states + * that there is only one symbol table but that this + * could change in the future. + */ + for (i = 0; i < ehdr.e_shnum; i++) { + if (shdr[i].sh_type == SHT_SYMTAB) { + symoff = shdr[i].sh_offset; + symsize = shdr[i].sh_size; + symstroff = shdr[shdr[i].sh_link].sh_offset; + symstrsize = shdr[shdr[i].sh_link].sh_size; + break; + } + } + + /* Flush the section header table */ + if (usemalloc) + free(shdr); + else + munmap((caddr_t)shdr, shdr_size); + + /* Check for files too large to mmap. */ + /* XXX is this really possible? */ + if (symstrsize > SIZE_T_MAX) { + errno = EFBIG; + return (-1); + } + /* + * Map string table into our address space. This gives us + * an easy way to randomly access all the strings, without + * making the memory allocation permanent as with malloc/free + * (i.e., munmap will return it to the system). + */ + if (usemalloc) { + if ((strtab = malloc(symstrsize)) == NULL) + return (-1); + if (pread(fd, strtab, symstrsize, (off_t)symstroff) != symstrsize) { + free(strtab); + return (-1); + } + } else { + strtab = mmap(NULL, (size_t)symstrsize, PROT_READ, + MAP_SHARED|MAP_FILE, fd, (off_t) symstroff); + if (strtab == MAP_FAILED) + return (-1); + } + /* + * clean out any left-over information for all valid entries. + * Type and value defined to be 0 if not found; historical + * versions cleared other and desc as well. Also figure out + * the largest string length so don't read any more of the + * string table than we have to. + * + * XXX clearing anything other than n_type and n_value violates + * the semantics given in the man page. + */ + nent = 0; + for (p = list; !ISLAST(p); ++p) { + p->n_type = 0; + p->n_other = 0; + p->n_desc = 0; + p->n_value = 0; + ++nent; + } + + /* Don't process any further if object is stripped. */ + /* ELFism - dunno if stripped by looking at header */ + if (symoff == 0) + goto elf_done; + + while (symsize > 0) { + cc = MIN(symsize, sizeof(sbuf)); + if (pread(fd, sbuf, cc, (off_t)symoff) != cc) + break; + symsize -= cc; + symoff += cc; + for (s = sbuf; cc > 0; ++s, cc -= sizeof(*s)) { + int soff = s->st_name; + + if (soff == 0) + continue; + for (p = list; !ISLAST(p); p++) { + char *sym; + + /* + * First we check for the symbol as it was + * provided by the user. If that fails + * and the first char is an '_', skip over + * the '_' and try again. + * XXX - What do we do when the user really + * wants '_foo' and the are symbols + * for both 'foo' and '_foo' in the + * table and 'foo' is first? + */ + sym = p->n_name; + if (strcmp(&strtab[soff], sym) != 0 && + (sym[0] != '_' || + strcmp(&strtab[soff], sym + 1) != 0)) + continue; + + p->n_value = s->st_value; + + /* XXX - type conversion */ + /* is pretty rude. */ + switch(ELF_ST_TYPE(s->st_info)) { + case STT_NOTYPE: + switch (s->st_shndx) { + case SHN_UNDEF: + p->n_type = N_UNDF; + break; + case SHN_ABS: + p->n_type = N_ABS; + break; + case SHN_COMMON: + p->n_type = N_COMM; + break; + default: + p->n_type = N_COMM | N_EXT; + break; + } + break; + case STT_OBJECT: + p->n_type = N_DATA; + break; + case STT_FUNC: + p->n_type = N_TEXT; + break; + case STT_FILE: + p->n_type = N_FN; + break; + } + if (ELF_ST_BIND(s->st_info) == STB_LOCAL) + p->n_type = N_EXT; + p->n_desc = 0; + p->n_other = 0; + if (--nent <= 0) + break; + } + } + } +elf_done: + if (usemalloc) + free(strtab); + else + munmap(strtab, symstrsize); + return (nent); +} diff --git a/distrib/common/elfrdsetroot.c b/distrib/common/elfrdsetroot.c index 8577531e291..9c43cdec8e8 100644 --- a/distrib/common/elfrdsetroot.c +++ b/distrib/common/elfrdsetroot.c @@ -1,4 +1,4 @@ -/* $OpenBSD: elfrdsetroot.c,v 1.21 2009/04/17 07:23:26 deraadt Exp $ */ +/* $OpenBSD: elfrdsetroot.c,v 1.22 2011/07/08 21:39:32 drahn Exp $ */ /* $NetBSD: rdsetroot.c,v 1.2 1995/10/13 16:38:39 gwr Exp $ */ /* @@ -44,19 +44,10 @@ #include <unistd.h> #include <nlist.h> -#ifdef __LP64__ -#define ELFSIZE 64 -#else -#define ELFSIZE 32 -#endif #include <sys/exec_elf.h> -Elf_Ehdr head; -Elf_Phdr *ph; +#include "elfrdsetroot.h" -char *file; - -/* Virtual addresses of the symbols we frob. */ -long rd_root_image_va, rd_root_size_va; +struct elfhdr head; /* Offsets relative to start of data segment. */ long rd_root_image_off, rd_root_size_off; @@ -71,17 +62,19 @@ char *dataseg; off_t mmap_off; size_t mmap_size; -int find_rd_root_image(char *, Elf_Phdr *, int); __dead void usage(void); int debug; +struct elf_fn *elf_fn; + int main(int argc, char *argv[]) { int ch, fd, n, xflag = 0, fsd; int found = 0, phsize; char *fs = NULL; + char *file; u_int32_t *ip; while ((ch = getopt(argc, argv, "dx")) != -1) { @@ -140,23 +133,17 @@ main(int argc, char *argv[]) exit(1); } - phsize = head.e_phnum * sizeof(Elf_Phdr); - ph = (Elf_Phdr *)malloc(phsize); - lseek(fd, head.e_phoff, SEEK_SET); - if (read(fd, (char *)ph, phsize) != phsize) { - fprintf(stderr, "%s: can't read phdr area\n", file); + if (head.e_ident[EI_CLASS] == ELFCLASS32) { + elf_fn = &ELF32_fn; + } else if (head.e_ident[EI_CLASS] == ELFCLASS64) { + elf_fn = &ELF64_fn; + } else { + fprintf(stderr, "%s: invalid elf, not 32 or 64 bit", file); exit(1); } - for (n = 0; n < head.e_phnum && !found; n++) { - if (ph[n].p_type == PT_LOAD) - found = find_rd_root_image(file, &ph[n], n); - } - if (!found) { - fprintf(stderr, "%s: can't locate space for rd_root_image!\n", - file); - exit(1); - } + elf_fn->locate_image(fd, &head, file, &rd_root_size_off, + &rd_root_image_off, &mmap_off, &mmap_size); /* * Map in the whole data segment. @@ -223,59 +210,6 @@ main(int argc, char *argv[]) exit(0); } - -/* - * Find locations of the symbols to patch. - */ -struct nlist wantsyms[] = { - { "_rd_root_size", 0 }, - { "_rd_root_image", 0 }, - { NULL, 0 } -}; - -int -find_rd_root_image(char *file, Elf_Phdr *ph, int segment) -{ - unsigned long kernel_start, kernel_size; - - if (nlist(file, wantsyms)) { - fprintf(stderr, "%s: no rd_root_image symbols?\n", file); - exit(1); - } - kernel_start = ph->p_paddr; - kernel_size = ph->p_filesz; - - rd_root_size_off = wantsyms[0].n_value - kernel_start; - rd_root_size_off -= (ph->p_vaddr - ph->p_paddr); - rd_root_image_off = wantsyms[1].n_value - kernel_start; - rd_root_image_off -= (ph->p_vaddr - ph->p_paddr); - - if (debug) { - fprintf(stderr, "segment %d rd_root_size_off = 0x%x\n", segment, - rd_root_size_off); - if ((ph->p_vaddr - ph->p_paddr) != 0) - fprintf(stderr, "root_off v %x p %x, diff %x altered %x\n", - ph->p_vaddr, ph->p_paddr, - (ph->p_vaddr - ph->p_paddr), - rd_root_size_off - (ph->p_vaddr - ph->p_paddr)); - fprintf(stderr, "rd_root_image_off = 0x%x\n", rd_root_image_off); - } - - /* - * Sanity check locations of db_* symbols - */ - if (rd_root_image_off < 0 || rd_root_image_off >= kernel_size) - return (0); - if (rd_root_size_off < 0 || rd_root_size_off >= kernel_size) { - fprintf(stderr, "%s: rd_root_size not in data segment?\n", - file); - return (0); - } - mmap_off = ph->p_offset; - mmap_size = kernel_size; - return (1); -} - __dead void usage(void) { diff --git a/distrib/common/elfrdsetroot.h b/distrib/common/elfrdsetroot.h new file mode 100644 index 00000000000..748477adb7e --- /dev/null +++ b/distrib/common/elfrdsetroot.h @@ -0,0 +1,11 @@ +struct elf_fn { + void * (*locate_image)(int, struct elfhdr *, char *, long *, long *, + off_t *, size_t *); + int (*find_rd_root_image)(char *, int, Elf_Phdr *, int, long *, long *, + off_t *, size_t *); + +}; + +extern int debug; +extern struct elf_fn ELF32_fn; +extern struct elf_fn ELF64_fn; diff --git a/distrib/i386/common/Makefile.inc b/distrib/i386/common/Makefile.inc index 4c659a7e70b..fa50b3c6e41 100644 --- a/distrib/i386/common/Makefile.inc +++ b/distrib/i386/common/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.29 2011/04/18 16:52:09 thib Exp $ +# $OpenBSD: Makefile.inc,v 1.30 2011/07/08 21:39:32 drahn Exp $ TOP= ${.CURDIR}/.. @@ -92,7 +92,9 @@ rd_teardown: rm ${REALIMAGE} rdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o rdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/landisk/ramdisk/Makefile b/distrib/landisk/ramdisk/Makefile index 69c397b5e30..6b1be9bdc58 100644 --- a/distrib/landisk/ramdisk/Makefile +++ b/distrib/landisk/ramdisk/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.14 2011/04/18 16:52:09 thib Exp $ +# $OpenBSD: Makefile,v 1.15 2011/07/08 21:39:32 drahn Exp $ REV= ${OSrev} @@ -64,7 +64,9 @@ rd_teardown: -vnconfig -u ${VND} rdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o rdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/loongson/ramdisk/Makefile b/distrib/loongson/ramdisk/Makefile index 3aedd002223..acf4cd21fb8 100644 --- a/distrib/loongson/ramdisk/Makefile +++ b/distrib/loongson/ramdisk/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.6 2011/04/18 16:52:09 thib Exp $ +# $OpenBSD: Makefile,v 1.7 2011/07/08 21:39:32 drahn Exp $ REV= ${OSrev} @@ -63,7 +63,9 @@ rd_teardown: -vnconfig -u ${VND} rdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o rdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/macppc/ramdisk/Makefile b/distrib/macppc/ramdisk/Makefile index e56a30c3f93..c61d7dcf359 100644 --- a/distrib/macppc/ramdisk/Makefile +++ b/distrib/macppc/ramdisk/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.26 2011/04/18 16:52:09 thib Exp $ +# $OpenBSD: Makefile,v 1.27 2011/07/08 21:39:32 drahn Exp $ REV= ${OSrev} @@ -87,7 +87,9 @@ rd_teardown: -vnconfig -u ${VND} rdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o rdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/palm/ramdisk/Makefile b/distrib/palm/ramdisk/Makefile index 7e03a34deb5..16d50e455b6 100644 --- a/distrib/palm/ramdisk/Makefile +++ b/distrib/palm/ramdisk/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.4 2011/04/18 16:52:10 thib Exp $ +# $OpenBSD: Makefile,v 1.5 2011/07/08 21:39:32 drahn Exp $ REV= ${OSrev} @@ -64,7 +64,9 @@ rd_teardown: -vnconfig -u ${VND} rdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o rdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/sgi/ramdisk/Makefile b/distrib/sgi/ramdisk/Makefile index 477f2a141a2..40fe4300f1e 100644 --- a/distrib/sgi/ramdisk/Makefile +++ b/distrib/sgi/ramdisk/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.14 2011/04/18 16:52:10 thib Exp $ +# $OpenBSD: Makefile,v 1.15 2011/07/08 21:39:32 drahn Exp $ REV= ${OSrev} @@ -89,7 +89,9 @@ rd_teardown: -vnconfig -u ${VND} rdsetroot: ${TOP}/../common/rdsetroot.c - ${HOSTCC} -o rdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/socppc/ramdisk/Makefile b/distrib/socppc/ramdisk/Makefile index 169165f2c0d..286ca53ac7a 100644 --- a/distrib/socppc/ramdisk/Makefile +++ b/distrib/socppc/ramdisk/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.10 2011/04/18 16:52:10 thib Exp $ +# $OpenBSD: Makefile,v 1.11 2011/07/08 21:39:32 drahn Exp $ REV= ${OSrev} @@ -67,7 +67,9 @@ rd_teardown: -vnconfig -u ${VND} rdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o rdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/sparc64/bsd.rd/Makefile b/distrib/sparc64/bsd.rd/Makefile index 3a584c22fc5..b3f13ad3210 100644 --- a/distrib/sparc64/bsd.rd/Makefile +++ b/distrib/sparc64/bsd.rd/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.22 2011/04/18 16:52:10 thib Exp $ +# $OpenBSD: Makefile,v 1.23 2011/07/08 21:39:32 drahn Exp $ TOP= ${.CURDIR}/.. @@ -62,7 +62,9 @@ ${IMAGE}: do_prep do_mount do_files do_umount mv -f ${REALIMAGE} ${IMAGE} elfrdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c do_prep: dd if=/dev/zero of=${REALIMAGE} count=${NBLKS} diff --git a/distrib/sparc64/ramdisk/Makefile b/distrib/sparc64/ramdisk/Makefile index 01c6ff1efea..ecf405fc2a6 100644 --- a/distrib/sparc64/ramdisk/Makefile +++ b/distrib/sparc64/ramdisk/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.25 2011/04/18 16:52:10 thib Exp $ +# $OpenBSD: Makefile,v 1.26 2011/07/08 21:39:32 drahn Exp $ TOP= ${.CURDIR}/.. @@ -102,7 +102,9 @@ rd_teardown: -vnconfig -u ${VND} elfrdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o elfrdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/sparc64/ramdiskB/Makefile b/distrib/sparc64/ramdiskB/Makefile index ee6b90ea5fc..fe8acfb8669 100644 --- a/distrib/sparc64/ramdiskB/Makefile +++ b/distrib/sparc64/ramdiskB/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.18 2011/04/18 16:52:10 thib Exp $ +# $OpenBSD: Makefile,v 1.19 2011/07/08 21:39:32 drahn Exp $ TOP= ${.CURDIR}/.. @@ -102,7 +102,9 @@ rd_teardown: -vnconfig -u ${VND} elfrdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o elfrdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} diff --git a/distrib/zaurus/ramdisk/Makefile b/distrib/zaurus/ramdisk/Makefile index 88fb0a2f3c5..8523d363892 100644 --- a/distrib/zaurus/ramdisk/Makefile +++ b/distrib/zaurus/ramdisk/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.9 2011/04/18 16:52:10 thib Exp $ +# $OpenBSD: Makefile,v 1.10 2011/07/08 21:39:32 drahn Exp $ REV= ${OSrev} @@ -64,7 +64,9 @@ rd_teardown: -vnconfig -u ${VND} rdsetroot: ${TOP}/../common/elfrdsetroot.c - ${HOSTCC} -o rdsetroot ${TOP}/../common/elfrdsetroot.c + ${HOSTCC} ${HOSTCFLAGS} -o elfrdsetroot \ + ${TOP}/../common/elfrdsetroot.c ${TOP}/../common/elf32.c \ + ${TOP}/../common/elf64.c unconfig: -umount -f ${MOUNT_POINT} |