summaryrefslogtreecommitdiff
path: root/distrib
diff options
context:
space:
mode:
authorDale Rahn <drahn@cvs.openbsd.org>2011-07-08 21:39:33 +0000
committerDale Rahn <drahn@cvs.openbsd.org>2011-07-08 21:39:33 +0000
commit9bd8584be003206951fc40592b806b6e8403eb6f (patch)
treefeb5841cf8a27b312fd8eaf8b67676c88e4b03d0 /distrib
parent20f2a7c4359811d4c20ec3078b7360cc5a706289 (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/Makefile6
-rw-r--r--distrib/alpha/common/Makefile.inc6
-rw-r--r--distrib/amd64/common/Makefile.inc9
-rw-r--r--distrib/armish/ramdisk/Makefile6
-rw-r--r--distrib/beagle/ramdisk/Makefile6
-rw-r--r--distrib/common/elf32.c2
-rw-r--r--distrib/common/elf64.c2
-rw-r--r--distrib/common/elfrd_size.c358
-rw-r--r--distrib/common/elfrdsetroot.c94
-rw-r--r--distrib/common/elfrdsetroot.h11
-rw-r--r--distrib/i386/common/Makefile.inc6
-rw-r--r--distrib/landisk/ramdisk/Makefile6
-rw-r--r--distrib/loongson/ramdisk/Makefile6
-rw-r--r--distrib/macppc/ramdisk/Makefile6
-rw-r--r--distrib/palm/ramdisk/Makefile6
-rw-r--r--distrib/sgi/ramdisk/Makefile6
-rw-r--r--distrib/socppc/ramdisk/Makefile6
-rw-r--r--distrib/sparc64/bsd.rd/Makefile6
-rw-r--r--distrib/sparc64/ramdisk/Makefile6
-rw-r--r--distrib/sparc64/ramdiskB/Makefile6
-rw-r--r--distrib/zaurus/ramdisk/Makefile6
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}