Hi,

the diff below is generated by CVS. For this I removed include/elf_abi.h and 
added include/elf.h. I've also merged two _KERNEL sections together and fixed 
platforms ld.so/*/archdep.h files for inclusion of elf_abi.h. Otherwise the 
description from previous version still apply.

Karel

On Fri, 14 Jul 2017 20:44:12 +0200
Karel Gardas <gard...@gmail.com> wrote:

> 
> Hi,
> 
> below is another diff of my elf.h cleanup work. I'm still keeping 
> /usr/include/elf_abi.h to not break GHC and all
> Haskell based ports.
> 
> What I have done in this version is went thorough whole spec and check 
> everything in the exec_elf.h. What's not in spec
> I commented out with "not in spec" mark. I've also reordered code to be in a 
> line with spec so curious man can open spec
> and header file side by side and check without jumping here and there either 
> in spec or in file just scroll down both while reading...
> 
> The most important fixes in exec_elf.h were:
> - Elf64 types (Half/Quarter/Shalf), either badly defined or not in spec at all
> - __alpha__ specific type definition is not in spec, hence commented out, 
> hence Alpha may be broken
> - a lot of other fixed here and there. Mostly additions of missing stuff, but 
> some stuff also removed, especially
>   from machines definitions.
> - I've also added clear comments where the following part of the code is 
> specified (URL) to easy checking
> - I've also added a comment where spec. ends in the code and that OS specific 
> or historically usable definitions continue
> - I've moved into OS specific section some values commented out in the spec. 
> section originally -- just to make base
>   compilable and runnable on AMD64

? .cvsignore
Index: distrib/sets/lists/comp/mi
===================================================================
RCS file: /cvs/src/distrib/sets/lists/comp/mi,v
retrieving revision 1.1358
diff -u -p -u -r1.1358 mi
--- distrib/sets/lists/comp/mi  2 Jul 2017 07:46:05 -0000       1.1358
+++ distrib/sets/lists/comp/mi  18 Jul 2017 20:24:42 -0000
@@ -822,7 +822,7 @@
 ./usr/include/dirent.h
 ./usr/include/disktab.h
 ./usr/include/dlfcn.h
-./usr/include/elf_abi.h
+./usr/include/elf.h
 ./usr/include/endian.h
 ./usr/include/err.h
 ./usr/include/errno.h
Index: games/hangman/ksyms.c
===================================================================
RCS file: /cvs/src/games/hangman/ksyms.c,v
retrieving revision 1.10
diff -u -p -u -r1.10 ksyms.c
--- games/hangman/ksyms.c       8 Jan 2016 13:40:05 -0000       1.10
+++ games/hangman/ksyms.c       18 Jul 2017 20:25:05 -0000
@@ -18,7 +18,7 @@
 
 #include <ctype.h>
 #include <curses.h>
-#include <elf_abi.h>
+#include <elf.h>
 #include <err.h>
 #include <errno.h>
 #include <fcntl.h>
Index: include/Makefile
===================================================================
RCS file: /cvs/src/include/Makefile,v
retrieving revision 1.219
diff -u -p -u -r1.219 Makefile
--- include/Makefile    17 Apr 2017 15:53:21 -0000      1.219
+++ include/Makefile    18 Jul 2017 20:28:30 -0000
@@ -11,7 +11,7 @@
 
 FILES= a.out.h ar.h asr.h assert.h bitstring.h blf.h bsd_auth.h \
        complex.h cpio.h ctype.h curses.h db.h dirent.h disktab.h \
-       dlfcn.h elf_abi.h err.h errno.h fenv.h float.h fnmatch.h fstab.h fts.h \
+       dlfcn.h elf.h err.h errno.h fenv.h float.h fnmatch.h fstab.h fts.h \
        ftw.h getopt.h glob.h grp.h icdb.h ieeefp.h ifaddrs.h inttypes.h \
        iso646.h kvm.h langinfo.h libgen.h limits.h link.h link_elf.h \
        locale.h login_cap.h math.h md5.h memory.h ndbm.h netdb.h netgroup.h \
Index: include/elf.h
===================================================================
RCS file: include/elf.h
diff -N include/elf.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ include/elf.h       18 Jul 2017 20:28:30 -0000
@@ -0,0 +1,33 @@
+/*     $OpenBSD: elf.h,v 1.4 1996/05/22 07:46:22 etheisen Exp $        */
+/*
+ * Copyright (c) 1996 Erik Theisen
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef _ELF_H_
+#define _ELF_H_
+
+#include <sys/exec_elf.h>
+
+#endif /* _ELF_H_ */
Index: include/elf_abi.h
===================================================================
RCS file: include/elf_abi.h
diff -N include/elf_abi.h
--- include/elf_abi.h   22 May 1996 07:46:22 -0000      1.4
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,33 +0,0 @@
-/*     $OpenBSD: elf_abi.h,v 1.4 1996/05/22 07:46:22 etheisen Exp $    */
-/*
- * Copyright (c) 1996 Erik Theisen
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef _ELF_ABI_H_
-#define _ELF_ABI_H_
-
-#include <sys/exec_elf.h>
-
-#endif /* _ELF_ABI_H_ */
Index: include/link_elf.h
===================================================================
RCS file: /cvs/src/include/link_elf.h,v
retrieving revision 1.7
diff -u -p -u -r1.7 link_elf.h
--- include/link_elf.h  20 Sep 2016 18:24:55 -0000      1.7
+++ include/link_elf.h  18 Jul 2017 20:28:30 -0000
@@ -7,7 +7,7 @@
 #ifndef _LINK_ELF_H
 #define _LINK_ELF_H
 
-#include <elf_abi.h>
+#include <elf.h>
 
 #ifndef DT_PROCNUM
 #define DT_PROCNUM 0
Index: lib/libc/gen/elf_hash.c
===================================================================
RCS file: /cvs/src/lib/libc/gen/elf_hash.c,v
retrieving revision 1.9
diff -u -p -u -r1.9 elf_hash.c
--- lib/libc/gen/elf_hash.c     16 Jan 2015 16:48:51 -0000      1.9
+++ lib/libc/gen/elf_hash.c     18 Jul 2017 20:28:38 -0000
@@ -37,7 +37,7 @@
 #include <unistd.h>
 #include <sys/exec.h>
 
-#include <elf_abi.h>
+#include <elf.h>
 
 /*
  * Standard ELF ABI hash function.
Index: lib/libc/gen/nlist.c
===================================================================
RCS file: /cvs/src/lib/libc/gen/nlist.c,v
retrieving revision 1.68
diff -u -p -u -r1.68 nlist.c
--- lib/libc/gen/nlist.c        25 Dec 2016 20:30:41 -0000      1.68
+++ lib/libc/gen/nlist.c        18 Jul 2017 20:28:38 -0000
@@ -40,7 +40,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <a.out.h>             /* pulls in nlist.h */
-#include <elf_abi.h>
+#include <elf.h>
 
 #define MINIMUM(a, b)  (((a) < (b)) ? (a) : (b))
 
Index: libexec/ld.so/aarch64/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/aarch64/archdep.h,v
retrieving revision 1.4
diff -u -p -u -r1.4 archdep.h
--- libexec/ld.so/aarch64/archdep.h     24 Jan 2017 07:48:37 -0000      1.4
+++ libexec/ld.so/aarch64/archdep.h     18 Jul 2017 20:28:47 -0000
@@ -33,7 +33,7 @@
 
 #define        MACHID  EM_AARCH64      /* ELF e_machine ID value checked */
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <machine/reloc.h>
 #include "syscall.h"
 #include "util.h"
Index: libexec/ld.so/alpha/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/alpha/archdep.h,v
retrieving revision 1.20
diff -u -p -u -r1.20 archdep.h
--- libexec/ld.so/alpha/archdep.h       24 Jan 2017 07:48:37 -0000      1.20
+++ libexec/ld.so/alpha/archdep.h       18 Jul 2017 20:28:47 -0000
@@ -33,7 +33,7 @@
 
 #define        MACHID  EM_ALPHA_EXP    /* ELF e_machine ID value checked */
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <machine/reloc.h>
 #include "syscall.h"
 #include "util.h"
Index: libexec/ld.so/amd64/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/amd64/archdep.h,v
retrieving revision 1.11
diff -u -p -u -r1.11 archdep.h
--- libexec/ld.so/amd64/archdep.h       21 Jan 2017 01:15:00 -0000      1.11
+++ libexec/ld.so/amd64/archdep.h       18 Jul 2017 20:28:47 -0000
@@ -33,7 +33,7 @@
 
 #define        MACHID  EM_AMD64        /* ELF e_machine ID value checked */
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <machine/reloc.h>
 #include "syscall.h"
 #include "util.h"
Index: libexec/ld.so/arm/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/arm/archdep.h,v
retrieving revision 1.12
diff -u -p -u -r1.12 archdep.h
--- libexec/ld.so/arm/archdep.h 24 Jan 2017 07:48:37 -0000      1.12
+++ libexec/ld.so/arm/archdep.h 18 Jul 2017 20:28:47 -0000
@@ -33,7 +33,7 @@
 
 #define        MACHID  EM_ARM  /* ELF e_machine ID value checked */
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <machine/reloc.h>
 #include "syscall.h"
 #include "util.h"
Index: libexec/ld.so/hppa/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/hppa/archdep.h,v
retrieving revision 1.15
diff -u -p -u -r1.15 archdep.h
--- libexec/ld.so/hppa/archdep.h        24 Jan 2017 07:48:37 -0000      1.15
+++ libexec/ld.so/hppa/archdep.h        18 Jul 2017 20:28:47 -0000
@@ -35,7 +35,7 @@
 
 #define        MACHID  EM_PARISC               /* ELF e_machine ID value 
checked */
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <machine/reloc.h>
 #include "syscall.h"
 #include "util.h"
Index: libexec/ld.so/i386/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/i386/archdep.h,v
retrieving revision 1.19
diff -u -p -u -r1.19 archdep.h
--- libexec/ld.so/i386/archdep.h        24 Jan 2017 07:48:37 -0000      1.19
+++ libexec/ld.so/i386/archdep.h        18 Jul 2017 20:28:47 -0000
@@ -33,7 +33,7 @@
 
 #define        MACHID  EM_386          /* ELF e_machine ID value checked */
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <machine/reloc.h>
 #include "syscall.h"
 #include "util.h"
Index: libexec/ld.so/ldd/ldd.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/ldd/ldd.c,v
retrieving revision 1.21
diff -u -p -u -r1.21 ldd.c
--- libexec/ld.so/ldd/ldd.c     2 Jul 2017 19:06:12 -0000       1.21
+++ libexec/ld.so/ldd/ldd.c     18 Jul 2017 20:28:47 -0000
@@ -26,7 +26,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <elf_abi.h>
+#include <elf.h>
 #include <err.h>
 #include <fcntl.h>
 #include <string.h>
Index: libexec/ld.so/m88k/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/m88k/archdep.h,v
retrieving revision 1.5
diff -u -p -u -r1.5 archdep.h
--- libexec/ld.so/m88k/archdep.h        24 Jan 2017 07:48:37 -0000      1.5
+++ libexec/ld.so/m88k/archdep.h        18 Jul 2017 20:28:47 -0000
@@ -33,7 +33,7 @@
 
 #define        MACHID                  EM_88K  /* ELF e_machine ID value 
checked */
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <machine/reloc.h>
 #include "syscall.h"
 #include "util.h"
Index: libexec/ld.so/powerpc/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/powerpc/archdep.h,v
retrieving revision 1.21
diff -u -p -u -r1.21 archdep.h
--- libexec/ld.so/powerpc/archdep.h     24 Jan 2017 07:48:37 -0000      1.21
+++ libexec/ld.so/powerpc/archdep.h     18 Jul 2017 20:28:48 -0000
@@ -33,7 +33,7 @@
 
 #define        MACHID  EM_PPC  /* ELF e_machine ID value checked */
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <machine/reloc.h>
 #include "syscall.h"
 #include "util.h"
Index: libexec/ld.so/sh/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/sh/archdep.h,v
retrieving revision 1.10
diff -u -p -u -r1.10 archdep.h
--- libexec/ld.so/sh/archdep.h  24 Jan 2017 07:48:37 -0000      1.10
+++ libexec/ld.so/sh/archdep.h  18 Jul 2017 20:28:48 -0000
@@ -33,7 +33,7 @@
 
 #define        MACHID  EM_SH   /* ELF e_machine ID value checked */
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <machine/reloc.h>
 #include "syscall.h"
 #include "util.h"
Index: libexec/ld.so/sparc64/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/sparc64/archdep.h,v
retrieving revision 1.25
diff -u -p -u -r1.25 archdep.h
--- libexec/ld.so/sparc64/archdep.h     24 Jan 2017 07:48:37 -0000      1.25
+++ libexec/ld.so/sparc64/archdep.h     18 Jul 2017 20:28:48 -0000
@@ -33,7 +33,7 @@
 
 #define        MACHID  EM_SPARCV9      /* ELF e_machine ID value checked */
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <machine/reloc.h>
 #include "syscall.h"
 #include "util.h"
Index: sys/ddb/db_dwarf.c
===================================================================
RCS file: /cvs/src/sys/ddb/db_dwarf.c,v
retrieving revision 1.5
diff -u -p -u -r1.5 db_dwarf.c
--- sys/ddb/db_dwarf.c  20 Apr 2016 08:02:59 -0000      1.5
+++ sys/ddb/db_dwarf.c  18 Jul 2017 20:30:30 -0000
@@ -397,7 +397,7 @@ next:
 #include <sys/endian.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
-#include <elf_abi.h>
+#include <elf.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
Index: sys/sys/exec_elf.h
===================================================================
RCS file: /cvs/src/sys/sys/exec_elf.h,v
retrieving revision 1.74
diff -u -p -u -r1.74 exec_elf.h
--- sys/sys/exec_elf.h  30 May 2017 15:39:05 -0000      1.74
+++ sys/sys/exec_elf.h  18 Jul 2017 20:30:34 -0000
@@ -33,99 +33,69 @@
 #ifndef _SYS_EXEC_ELF_H_
 #define _SYS_EXEC_ELF_H_
 
-#include <sys/types.h>
 #include <machine/exec.h>
 
-typedef __uint8_t      Elf_Byte;
+/*
+ * System V Application Binary Interface - DRAFT - 10 June 2013
+ * http://www.sco.com/developers/gabi/latest/contents.html
+ */
+
+/*
+ * Introduction/Data Representation
+ * http://www.sco.com/developers/gabi/latest/ch4.intro.html
+ */
+/*
+ * 32-Bit Data Types
+ */
+
+/* typedef __uint8_t   Elf_Byte; -- not in spec! */
 
 typedef __uint32_t     Elf32_Addr;     /* Unsigned program address */
 typedef __uint32_t     Elf32_Off;      /* Unsigned file offset */
-typedef __int32_t      Elf32_Sword;    /* Signed large integer */
-typedef __uint32_t     Elf32_Word;     /* Unsigned large integer */
 typedef __uint16_t     Elf32_Half;     /* Unsigned medium integer */
+typedef __uint32_t     Elf32_Word;     /* Unsigned large integer */
+typedef __int32_t      Elf32_Sword;    /* Signed large integer */
+/* spec also counts with `unsigned char' being 1 byte long with
+   1 byte alignment as an unsigned small integer */
 
-typedef __uint64_t     Elf64_Addr;
-typedef __uint64_t     Elf64_Off;
-typedef __int32_t      Elf64_Shalf;
+/*
+ * 64-Bit Data Types
+ */
 
+typedef __uint64_t     Elf64_Addr;     /* Unsigned program address */
+typedef __uint64_t     Elf64_Off;      /* Unsigned file offset */
+typedef __uint16_t     Elf64_Half;     /* Unsigned medium integer */
+/* typedef __int32_t   Elf64_Shalf; -- not in spec! */
+/* alpha definition is not in spec!
 #ifdef __alpha__
-typedef __int64_t      Elf64_Sword;
 typedef __uint64_t     Elf64_Word;
-#else
-typedef __int32_t      Elf64_Sword;
-typedef __uint32_t     Elf64_Word;
-#endif
-
-typedef __int64_t      Elf64_Sxword;
-typedef __uint64_t     Elf64_Xword;
+typedef __int64_t      Elf64_Sword;
+#else */
+typedef __uint32_t     Elf64_Word;     /* Unsigned integer */
+typedef __int32_t      Elf64_Sword;    /* Signed integer */
+/* #endif */
+typedef __uint64_t     Elf64_Xword;    /* Unsigned long integer */
+typedef __int64_t      Elf64_Sxword;   /* Signed long integer */
 
+/* incorrect width with regarding to spec (Elf64_Half)
+   and not in spec at all (Elf64_Quarter)
 typedef __uint32_t     Elf64_Half;
 typedef __uint16_t     Elf64_Quarter;
+*/
+/* spec also counts with `unsigned char' being 1 byte long with
+   1 byte alignment as an unsigned small integer */
 
 /*
- * e_ident[] identification indexes
- * See http://www.sco.com/developers/gabi/latest/ch4.eheader.html
+ * ELF Header
+ * http://www.sco.com/developers/gabi/latest/ch4.eheader.html
  */
-#define EI_MAG0                0               /* file ID */
-#define EI_MAG1                1               /* file ID */
-#define EI_MAG2                2               /* file ID */
-#define EI_MAG3                3               /* file ID */
-#define EI_CLASS       4               /* file class */
-#define EI_DATA                5               /* data encoding */
-#define EI_VERSION     6               /* ELF header version */
-#define EI_OSABI       7               /* OS/ABI ID */
-#define EI_ABIVERSION  8               /* ABI version */
-#define EI_PAD         9               /* start of pad bytes */
-#define EI_NIDENT      16              /* Size of e_ident[] */
 
-/* e_ident[] magic number */
-#define        ELFMAG0         0x7f            /* e_ident[EI_MAG0] */
-#define        ELFMAG1         'E'             /* e_ident[EI_MAG1] */
-#define        ELFMAG2         'L'             /* e_ident[EI_MAG2] */
-#define        ELFMAG3         'F'             /* e_ident[EI_MAG3] */
-#define        ELFMAG          "\177ELF"       /* magic */
-#define        SELFMAG         4               /* size of magic */
-
-/* e_ident[] file class */
-#define        ELFCLASSNONE    0               /* invalid */
-#define        ELFCLASS32      1               /* 32-bit objs */
-#define        ELFCLASS64      2               /* 64-bit objs */
-#define        ELFCLASSNUM     3               /* number of classes */
-
-/* e_ident[] data encoding */
-#define ELFDATANONE    0               /* invalid */
-#define ELFDATA2LSB    1               /* Little-Endian */
-#define ELFDATA2MSB    2               /* Big-Endian */
-#define ELFDATANUM     3               /* number of data encode defines */
-
-/* e_ident[] Operating System/ABI */
-#define ELFOSABI_SYSV          0       /* UNIX System V ABI */
-#define ELFOSABI_HPUX          1       /* HP-UX operating system */
-#define ELFOSABI_NETBSD                2       /* NetBSD */
-#define ELFOSABI_LINUX         3       /* GNU/Linux */
-#define ELFOSABI_HURD          4       /* GNU/Hurd */
-#define ELFOSABI_86OPEN                5       /* 86Open common IA32 ABI */
-#define ELFOSABI_SOLARIS       6       /* Solaris */
-#define ELFOSABI_MONTEREY      7       /* Monterey */
-#define ELFOSABI_IRIX          8       /* IRIX */
-#define ELFOSABI_FREEBSD       9       /* FreeBSD */
-#define ELFOSABI_TRU64         10      /* TRU64 UNIX */
-#define ELFOSABI_MODESTO       11      /* Novell Modesto */
-#define ELFOSABI_OPENBSD       12      /* OpenBSD */
-#define ELFOSABI_ARM           97      /* ARM */
-#define ELFOSABI_STANDALONE    255     /* Standalone (embedded) application */
-
-/* e_ident */
-#define IS_ELF(ehdr) ((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \
-                      (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \
-                      (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \
-                      (ehdr).e_ident[EI_MAG3] == ELFMAG3)
+#define EI_NIDENT      16              /* Size of e_ident[] */
 
-/* ELF Header */
-typedef struct elfhdr {
+typedef struct {
        unsigned char   e_ident[EI_NIDENT]; /* ELF Identification */
        Elf32_Half      e_type;         /* object file type */
-       Elf32_Half      e_machine;      /* machine */
+       Elf32_Half      e_machine;      /* machine type */
        Elf32_Word      e_version;      /* object file version */
        Elf32_Addr      e_entry;        /* virtual entry point */
        Elf32_Off       e_phoff;        /* program header table offset */
@@ -141,70 +111,394 @@ typedef struct elfhdr {
 } Elf32_Ehdr;
 
 typedef struct {
-       unsigned char   e_ident[EI_NIDENT];     /* Id bytes */
-       Elf64_Quarter   e_type;                 /* file type */
-       Elf64_Quarter   e_machine;              /* machine type */
-       Elf64_Half      e_version;              /* version number */
+       unsigned char   e_ident[EI_NIDENT];     /* ELF Identification */
+       Elf64_Half      e_type;                 /* object file type */
+       Elf64_Half      e_machine;              /* machine type */
+       Elf64_Word      e_version;              /* object file version */
        Elf64_Addr      e_entry;                /* entry point */
        Elf64_Off       e_phoff;                /* Program hdr offset */
        Elf64_Off       e_shoff;                /* Section hdr offset */
-       Elf64_Half      e_flags;                /* Processor flags */
-       Elf64_Quarter   e_ehsize;               /* sizeof ehdr */
-       Elf64_Quarter   e_phentsize;            /* Program header entry size */
-       Elf64_Quarter   e_phnum;                /* Number of program headers */
-       Elf64_Quarter   e_shentsize;            /* Section header entry size */
-       Elf64_Quarter   e_shnum;                /* Number of section headers */
-       Elf64_Quarter   e_shstrndx;             /* String table index */
+       Elf64_Word      e_flags;                /* Processor flags */
+       Elf64_Half      e_ehsize;               /* sizeof ehdr */
+       Elf64_Half      e_phentsize;            /* Program header entry size */
+       Elf64_Half      e_phnum;                /* Number of program headers */
+       Elf64_Half      e_shentsize;            /* Section header entry size */
+       Elf64_Half      e_shnum;                /* Number of section headers */
+       Elf64_Half      e_shstrndx;             /* String table index */
 } Elf64_Ehdr;
 
-/* e_type */
+/* e_type  -- This member identifies the object file type. */
 #define ET_NONE                0               /* No file type */
 #define ET_REL         1               /* relocatable file */
 #define ET_EXEC                2               /* executable file */
 #define ET_DYN         3               /* shared object file */
 #define ET_CORE                4               /* core file */
-#define ET_NUM         5               /* number of types */
-#define ET_LOPROC      0xff00          /* reserved range for processor */
-#define ET_HIPROC      0xffff          /*  specific e_type */
+/* #define ET_NUM              5*/             /* number of types */ /*-- not 
in spec! */
+#define ET_LOOS                0xfe00          /* operating system specific */
+#define ET_HIOS                0xfeff          /* operating system specific */
+#define ET_LOPROC      0xff00          /* processor specific */
+#define ET_HIPROC      0xffff          /* processor specific */
 
-/* e_machine */
+/* e_machine  -- This member's value specifies the required architecture
+   for an individual file. */
 #define EM_NONE                0               /* No Machine */
 #define EM_M32         1               /* AT&T WE 32100 */
 #define EM_SPARC       2               /* SPARC */
 #define EM_386         3               /* Intel 80386 */
 #define EM_68K         4               /* Motorola 68000 */
 #define EM_88K         5               /* Motorola 88000 */
-#define EM_486         6               /* Intel 80486 - unused? */
+#define EM_IAMCU       6               /* Intel MCU */
 #define EM_860         7               /* Intel 80860 */
-#define EM_MIPS                8               /* MIPS R3000 Big-Endian only */
-/*
- * Don't know if EM_MIPS_RS4_BE,
- * EM_SPARC64, EM_PARISC,
- * or EM_PPC are ABI compliant
- */
-#define EM_MIPS_RS4_BE 10              /* MIPS R4000 Big-Endian */
-#define EM_SPARC64     11              /* SPARC v9 64-bit unofficial */
+#define EM_MIPS                8               /* MIPS I Architecture
+                                          (R3000 Big-Endian only) */
+#define        EM_S370         9               /* IBM System/370 Processor */
+#define EM_MIPS_RS3_LE 10              /* MIPS R3000 Little-Endian */
+       /* 11 - 14 reserved for future use */
 #define EM_PARISC      15              /* HPPA */
+       /* 16 reserved for future use */
+#define        EM_VPP500       17              /* Fujitsu VPP500 */
 #define EM_SPARC32PLUS 18              /* Enhanced instruction set SPARC */
+#define EM_960         19              /* Intel 960 */
 #define EM_PPC         20              /* PowerPC */
-#define EM_ARM         40              /* Advanced RISC Machines ARM */
+#define EM_PPC64       21              /* PowerPC 64 */
+#define EM_S390                22              /* IBM System/390 Processor */
+#define EM_SPU         23              /* IBM SPU/SPC */
+       /* 24 - 35 reserved for future use */
+#define EM_V800                36              /* NEC V800 */
+#define EM_FR20                37              /* Fujitsu FR20 */
+#define EM_RH32                38              /* TRW RH-32 */
+#define EM_RCE         39              /* Motorola RCE */
+#define EM_ARM         40              /* ARM 32-bit architecture (AARCH32) */
 #define EM_ALPHA       41              /* DEC ALPHA */
 #define        EM_SH           42              /* Hitachi/Renesas Super-H */
 #define EM_SPARCV9     43              /* SPARC version 9 */
+#define EM_TRICORE     44              /* Siemens TriCore embedded processor */
+#define EM_ARC         45              /* Argonaut RISC Core,
+                                          Argonaut Technologies Inc. */
+#define        EM_H8_300       46              /* Hitachi H8/300 */
+#define EM_H8_300H     47              /* Hitachi H8/300H */
+#define EM_H8S         48              /* Hitachi H8S */
+#define EM_H8_500      49              /* Hitachi H8/500 */
 #define EM_IA_64       50              /* Intel IA-64 Processor */
-#define EM_AMD64       62              /* AMD64 architecture */
+#define EM_MIPS_X      51              /* Stanford MIPS-X */
+#define EM_COLDFIRE    52              /* Motorola ColdFire */
+#define EM_68HC12      53              /* Motorola H68HC12 */
+#define EM_MMA         54              /* Fujitsu MMA Multimedia Accelerator */
+#define EM_PCP         55              /* Siemens PCP */
+#define EM_NCPU                56              /* Sony nCPU embedded RISC 
processor */
+#define EM_NDR1                57              /* Denso NDR1 microprocessor */
+#define EM_STARCORE    58              /* Motorola Star*Core processor */
+#define EM_ME16                59              /* Toyota ME16 processor */
+#define EM_ST100       60              /* STMicroelectronics ST100 processor */
+#define EM_TINYJ       61              /* Advanced Logic Corp. TineJ
+                                          embedded processor family */
+#define EM_X86_64      62              /* AMD x86-64 architecture */
+#define EM_DPSP                63              /* Sony DSP Processor */
+#define EM_PDP10       64              /* Digital Equipment Corp. PDP-10 */
+#define EM_PDP11       65              /* Digital Equipment Corp. PDP-11 */
+#define EM_FX66                66              /* Siemens FX66 microcontroller 
*/
+#define EM_ST9PLUS     67              /* STMicroelectronics ST9+
+                                          8/16 bit microcontroller */
+#define EM_ST7         68              /* STMicroelectronics ST7
+                                          8-bit microcontroller */
+#define        EM_68HC16       69              /* Motorola MC68HC16 
Microcontroller */
+#define        EM_68HC11       70              /* Motorola MC68HC11 
Microcontroller */
+#define        EM_68HC08       71              /* Motorola MC68HC08 
Microcontroller */
+#define        EM_68HC05       72              /* Motorola MC68HC05 
Microcontroller */
+#define        EM_SVX          73              /* Silicon Graphics SVx */
+#define        EM_ST19         74              /* STMicroelectronics ST19
+                                          8-bit microcontroller */
 #define EM_VAX         75              /* DEC VAX */
-#define EM_AARCH64     183             /* ARM 64-bit architecture (AArch64) */
+#define        EM_CRIS         76              /* Axis Communications
+                                          32-bit embedded processor */
+#define        EM_JAVELIN      77              /* Infineon Technologies
+                                          32-bit embedded processor */
+#define EM_FIREPATH    78              /* Element 14 64-bit DSP Processor */
+#define        EM_ZSP          79              /* LSI Logic 16-bit DSP 
Processor */
+#define        EM_MMIX         80              /* Donald Knuth's educational
+                                          64-bit processor */
+#define        EM_HUANY        81              /* Harvard Uni. 
machine-independent
+                                          object files */
+#define        EM_PRISM        82              /* SiTera Prism */
+#define        EM_AVR          83              /* Atmel AVR 8-bit 
microcontroller */
+#define        EM_FR30         84              /* Fujitsu FR30 */
+#define        EM_D10V         85              /* Mitsubishi D10V */
+#define        EM_D30V         86              /* Mitsubishi D30V */
+#define        EM_V850         87              /* NEC v850 */
+#define        EM_M32R         88              /* Mitsubishi M32R */
+#define        EM_MN10300      89              /* Matsushita MN10300 */
+#define        EM_MN10200      90              /* Matsushita MN10200 */
+#define        EM_PJ           91              /* picoJava */
+#define        EM_OPENRISC     92              /* OpenRISC 32-bit embedded 
processor */
+#define        EM_ARC_COMPACT  93              /* ARC International ARCompact 
processor
+                                          (old spelling/synonym: EM_ARC_A5) */
+#define        EM_XTENSA       94              /* Tensilica Xtensa 
Architecture */
+#define        EM_VIDEOCORE    95              /* Alphamosaic VideoCore 
processor */
+#define        EM_TMM_GPP      96              /* Thompson Multimedia General 
Purpose
+                                          Processor */
+#define        EM_NS32K        97              /* National Semiconductor 32000 
series*/
+#define        EM_TPC          98              /* Tenor Network TPC processor 
*/
+#define        EM_SNP1K        99              /* Trebia SNP 1000 processor */
+#define        EM_ST200        100             /* STMicroelectronics ST200
+                                          microcontroller */
+#define        EM_IP2K         101             /* Ubicom IP2xxx microcontroller
+                                          family */
+#define        EM_MAX          102             /* MAX Processor */
+#define        EM_CR           103             /* National Semiconductor 
CompactRISC
+                                          microprocessor */
+#define        EM_F2MC16       104             /* Fujitsu F2MC16 */
+#define        EM_MSP430       105             /* Texas Instruments embedded
+                                          microcontroller msp430 */
+#define        EM_BLACKFIN     106             /* Analog Devices Blackfin (DSP)
+                                          processor */
+#define        EM_SE_C33       107             /* S1C33 Family of Seiko Epson
+                                          processors */
+#define        EM_SEP          108             /* Sharp embedded 
microprocessor */
+#define        EM_ARCA         109             /* Arca RISC Microprocessor */
+#define        EM_UNICORE      110             /* Microprocessor series from 
PKU-Unity
+                                          Ltd. and MPRC of Peking University */
+#define        EM_EXCESS       111             /* eXcess: 16/32/64-bit 
configurable
+                                          embedded CPU */
+#define EM_DXP         112             /* Icera Semiconductor Inc. Deep
+                                          Execution Processor */
+#define EM_ALTERA_NIOS2        113             /* Altera Nios II soft-core 
processor */
+#define EM_CRX         114             /* National Semiconductor CompactRISC
+                                          CRX microprocessor */
+#define EM_XGATE       115             /* Motorola XGATE embedded processor */
+#define EM_C166                116             /* Infineon C16x/XC16x 
processor */
+#define EM_M16C                117             /* Renesas M16C series 
microprocessors*/
+#define EM_DSPIC30F    118             /* Microchip Technology dsPIC30F
+                                          Digital Signal Controller */
+#define EM_CE          119             /* Freescale Communication Engine RISC
+                                          core */
+#define EM_M32C                120             /* Renesas M32C series 
microprocessors*/
+       /* 121-130 Reserved for future use */
+#define EM_TSK3000     131             /* Altium TSK3000 core */
+#define EM_RS08                132             /* Freescale RS08 embedded 
processor */
+#define EM_SHARC       133             /* Analog Devices SHARC family
+                                          of 32-bit DSP processors */
+#define EM_ECOG2       134             /*Cyan Technology eCOG2 microprocessor*/
+#define EM_SCORE7      135             /* Sunplus S+core7 RISC processor */
+#define EM_DSP24       136             /* New Japan Radio (NJR) 24-bit DSP
+                                          Processor */
+#define EM_VIDEOCORE3  137             /* Broadcom VideoCore III processor */
+#define EM_LATTICEMICO32       138     /* RISC processor for Lattice FPGA
+                                          architecture */
+#define EM_SE_C17      139             /* Seiko Epson C17 family */
+#define EM_TI_C6000    140             /* The Texas Instruments TMS320C6000 DSP
+                                          family */
+#define EM_TI_C2000    141             /* The Texas Instruments TMS320C2000 DSP
+                                          family */
+#define EM_TI_C5500    142             /* The Texas Instruments TMS320C55x DSP
+                                          family */
+#define EM_TI_ARP32    143             /* Texas Instruments Application
+                                          Specific RISC Processor,32bit fetch*/
+#define EM_TI_PRU      144             /* Texas Instruments Programmable
+                                          Realtime Unit */
+       /* 145-159 Reserved for future use */
+#define EM_MMDSP_PLUS  160             /* STMicroelectronics 64bit VLIW Data
+                                          Signal Processor */
+#define EM_CYPRESS_M8C 161             /* Cypress M8C microprocessor */
+#define EM_R32C                162             /* Renesas R32C series 
microprocessors*/
+#define EM_TRIMEDIA    163             /* NXP Semiconductors TriMedia
+                                          architecture family */
+#define EM_QDSP6       164             /* QUALCOMM DSP6 Processor */
+#define EM_8051                165             /* Intel 8051 and variants */
+#define EM_STXP7X      166             /* STMicroelectronics STxP7x family
+                                          of configurable and extensible RISC
+                                          processors */
+#define EM_NDS32       167             /* Andes Technology compact code size
+                                          embedded RISC processor family */
+#define EM_ECOG1       168             /* Cyan Technology eCOG1X family */
+#define EM_ECOG1X      168             /* Cyan Technology eCOG1X family */
+#define EM_MAXQ30      169             /* Dallas Semiconductor MAXQ30 Core
+                                          Micro-controllers */
+#define EM_XIMO16      170             /* New Japan Radio (NJR) 16-bit DSP
+                                          Processor */
+#define EM_MANIK       171             /* M2000 Reconfigurable RISC
+                                          Microprocessor */
+#define EM_CRAYNV2     172             /* Cray Inc. NV2 vector architecture */
+#define EM_RX          173             /* Renesas RX family */
+#define EM_METAG       174             /* Imagination Technologies META
+                                          processor architecture */
+#define EM_MCST_ELBRUS 175             /* MCST Elbrus general purpose hardware
+                                          architecture */
+#define        EM_ECOG16       176             /* Cyan Technology eCOG16 
family */
+#define        EM_CR16         177             /* National Semiconductor 
CompactRISC
+                                          CR16 16-bit microprocessor */
+#define        EM_ETPU         178             /* Freescale Extended Time 
Processing
+                                          Unit */
+#define        EM_SLE9X        179             /* Infineon Technologies SLE9X 
core */
+#define        EM_L10M         180             /* Intel L10M */
+#define        EM_K10M         181             /* Intel K10M */
+       /* 182 Reserved for future Intel use */
+#define        EM_AARCH64      183             /* ARM 64-bit architecture 
(AARCH64) */
+       /* 184 Reserved for future ARM use */
+#define        EM_AVR32        185             /* Atmel Corporation 32-bit
+                                          microprocessor family */
+#define        EM_STM8         186             /* STMicroeletronics STM8 8-bit
+                                          microcontroller */
+#define        EM_TILE64       187             /* Tilera TILE64 multicore 
architecture
+                                          family */
+#define        EM_TILEPRO      188             /* Tilera TILEPro multicore
+                                          architecture family */
+#define        EM_MICROBLAZE   189             /* Xilinx MicroBlaze 32-bit 
RISC soft
+                                          processor core */
+#define        EM_CUDA         190             /* NVIDIA CUDA architecture */
+#define        EM_TILEGX       191             /* Tilera TILE-Gx multicore
+                                          architecture family */
+#define        EM_CLOUDSHIELD  192             /* CloudShield architecture 
family */
+#define        EM_COREA_1ST    193             /* KIPO-KAIST Core-A 1st 
generation
+                                          processor family */
+#define        EM_COREA_2ND    194             /* KIPO-KAIST Core-A 2nd 
generation
+                                          processor family */
+#define        EM_ARC_COMPACT2 195             /* Synopsys ARCompact V2 */
+#define        EM_OPEN8        196             /* Open8 8-bit RISC soft 
processor
+                                          core */
+#define        EM_RL78         197             /* Renesas RL78 family */
+#define        EM_VIDEOCORE5   198             /* Broadcom VideoCore V 
processor */
+#define        EM_78KOR        199             /* Renesas 78KOR family */
+#define        EM_56800EX      200             /* Freescale 56800EX Digital 
Signal
+                                          Controller (DSC) */
+#define        EM_BA1          201             /* Beyond BA1 CPU architecture 
*/
+#define        EM_BA2          202             /* Beyond BA2 CPU architecture 
*/
+#define        EM_XCORE        203             /* XMOS xCORE processor family 
*/
+#define        EM_MCHP_PIC     204             /* Microchip 8-bit PIC(r) 
family */
+#define        EM_INTEL205     205             /* Reserved by Intel */
+#define        EM_INTEL206     206             /* Reserved by Intel */
+#define        EM_INTEL207     207             /* Reserved by Intel */
+#define        EM_INTEL208     208             /* Reserved by Intel */
+#define        EM_INTEL209     209             /* Reserved by Intel */
+#define        EM_KM32         210             /* KM211 KM32 32-bit processor 
*/
+#define        EM_KMX32        211             /* KM211 KMX32 32-bit processor 
*/
+#define        EM_KMX16        212             /* KM211 KMX16 16-bit processor 
*/
+#define        EM_KMX8         213             /* KM211 KMX8 8-bit processor */
+#define        EM_KVARC        214             /* KM211 KVARC processor */
+#define        EM_CDP          215             /* Paneve CDP architecture 
family */
+#define        EM_COGE         216             /* Cognitive Smart Memory 
Processor */
+#define        EM_COOL         217             /* Bluechip Systems CoolEngine 
*/
+#define        EM_NORC         218             /* Nanoradio Optimized RISC */
+#define        EM_CSR_KALIMBA  219             /* CSR Kalimba architecture 
family */
+#define        EM_Z80          220             /* Zilog Z80 */
+#define        EM_VISIUM       221             /* Controls and Data Services
+                                          VISIUMcore processor */
+#define        EM_FT32         222             /* FTDI Chip FT32 high 
performance
+                                          32-bit RISC architecture */
+#define        EM_MOXIE        223             /* Moxie processor family */
+#define        EM_AMDGPU       224             /* AMD GPU architecture */
+       /* 225 - 242 */
+#define        EM_RISCV        243             /* RISC-V */
 
 /* Non-standard */
-#define EM_ALPHA_EXP   0x9026          /* DEC ALPHA */
+/* not in spec! */
+/* #define EM_ALPHA_EXP        0x9026*/                /* DEC ALPHA */
+/* not in spec! */
+/* #define EM_NUM              22*/            /* number of machine types */
+
+/* e_version -- This member identifies the object file version. */
+#define EV_NONE                0               /* Invalid */
+#define EV_CURRENT     1               /* Current */
+/* not in spec!
+#define EV_NUM         2*/             /* number of versions */
+
+/*
+ * ELF Indentification
+ */
+/*
+ * e_ident[] identification indexes
+ */
+#define EI_MAG0                0               /* file ID */
+#define EI_MAG1                1               /* file ID */
+#define EI_MAG2                2               /* file ID */
+#define EI_MAG3                3               /* file ID */
+#define EI_CLASS       4               /* file class */
+#define EI_DATA                5               /* data encoding */
+#define EI_VERSION     6               /* ELF header version */
+#define EI_OSABI       7               /* OS/ABI ID */
+#define EI_ABIVERSION  8               /* ABI version */
+#define EI_PAD         9               /* start of pad bytes */
+/* there is also EI_NIDENT 16 defined here, but it's moved up
+   to make ELF header code compilable */
+
+/* e_ident[] magic number */
+#define        ELFMAG0         0x7f            /* e_ident[EI_MAG0] */
+#define        ELFMAG1         'E'             /* e_ident[EI_MAG1] */
+#define        ELFMAG2         'L'             /* e_ident[EI_MAG2] */
+#define        ELFMAG3         'F'             /* e_ident[EI_MAG3] */
+/* not in spec!
+#define        ELFMAG          "\177ELF"*/     /* magic */
+/* not in spec!
+#define        SELFMAG         4*/             /* size of magic */
+
+/* e_ident[] file class */
+#define        ELFCLASSNONE    0               /* invalid */
+#define        ELFCLASS32      1               /* 32-bit objs */
+#define        ELFCLASS64      2               /* 64-bit objs */
+/* not in spec!
+#define        ELFCLASSNUM     3*/             /* number of classes */
 
-#define EM_NUM         22              /* number of machine types */
+/* e_ident[] data encoding */
+#define ELFDATANONE    0               /* invalid */
+#define ELFDATA2LSB    1               /* Little-Endian */
+#define ELFDATA2MSB    2               /* Big-Endian */
+/* not in spec!
+#define ELFDATANUM     3*/             /* number of data encode defines */
+
+/* e_ident[] Operating System/ABI */
+#define ELFOSABI_SYSV          0       /* UNIX System V ABI */
+#define ELFOSABI_HPUX          1       /* HP-UX operating system */
+#define ELFOSABI_NETBSD                2       /* NetBSD */
+#define ELFOSABI_GNU           3       /* GNU */
+#define ELFOSABI_LINUX         3       /* Linux  historical - alias
+                                          for ELFOSABI_GNU */
+/* not in spec!
+#define ELFOSABI_HURD          4*/     /* GNU/Hurd */
+/* not in spec!
+#define ELFOSABI_86OPEN                5*/     /* 86Open common IA32 ABI */
+#define ELFOSABI_SOLARIS       6       /* Solaris */
+#define ELFOSABI_AIX           7       /* AIX */
+#define ELFOSABI_IRIX          8       /* IRIX */
+#define ELFOSABI_FREEBSD       9       /* FreeBSD */
+#define ELFOSABI_TRU64         10      /* TRU64 UNIX */
+#define ELFOSABI_MODESTO       11      /* Novell Modesto */
+#define ELFOSABI_OPENBSD       12      /* OpenBSD */
+#define ELFOSABI_OPENVMS       13      /* OpenVMS */
+#define ELFOSABI_NSK           14      /* HP Non-Stop Kernel */
+#define ELFOSABI_AROS          15      /* Amiga Research OS */
+#define ELFOSABI_FENIXOS       16      /* The FenixOS highly scalable
+                                          multi-core OS */
+#define ELFOSABI_CLOUDABI      17      /* Nuxi CloudABI */
+#define ELFOSABI_OPENVOS       18      /* Stratus Technologies OpenVOS */
+       /* 64 - 255 Architecture-specific value range */
+/* not in spec!
+#define ELFOSABI_ARM           97*/    /* ARM */
+/* not in spec!
+#define ELFOSABI_STANDALONE    255*/   /* Standalone (embedded) application */
 
-/* Version */
+/* e_version This member identifies the object file version. */
 #define EV_NONE                0               /* Invalid */
 #define EV_CURRENT     1               /* Current */
-#define EV_NUM         2               /* number of versions */
+/* not in spec!
+#define EV_NUM         2*/             /* number of versions */
+
+/*
+ * Sections
+ * http://www.sco.com/developers/gabi/latest/ch4.sheader.html
+ */
+
+/* Special Section Indexes */
+#define SHN_UNDEF      0               /* undefined */
+#define SHN_LORESERVE  0xff00          /* lower bounds of reserved indexes */
+#define SHN_LOPROC     0xff00          /* reserved range for processor lowend*/
+#define SHN_HIPROC     0xff1f          /* reserved range for processor hiend*/
+#define SHN_LOOS       0xff20          /* reserved range for OS lowend */
+#define SHN_HIOS       0xff3f          /* reserved range for OS hiend */
+#define SHN_ABS                0xfff1          /* absolute value */
+#define SHN_COMMON     0xfff2          /* common symbol */
+#define SHN_XINDEX     0xffff          /* represents escape value to mark too
+                                          big index value */
+#define SHN_HIRESERVE  0xffff          /* upper bounds of reserved indexes */
+
 
 /* Section Header */
 typedef struct {
@@ -222,27 +516,18 @@ typedef struct {
 } Elf32_Shdr;
 
 typedef struct {
-       Elf64_Half      sh_name;        /* section name */
-       Elf64_Half      sh_type;        /* section type */
+       Elf64_Word      sh_name;        /* section name */
+       Elf64_Word      sh_type;        /* section type */
        Elf64_Xword     sh_flags;       /* section flags */
        Elf64_Addr      sh_addr;        /* virtual address */
        Elf64_Off       sh_offset;      /* file offset */
        Elf64_Xword     sh_size;        /* section size */
-       Elf64_Half      sh_link;        /* link to another */
-       Elf64_Half      sh_info;        /* misc info */
+       Elf64_Word      sh_link;        /* link to another */
+       Elf64_Word      sh_info;        /* misc info */
        Elf64_Xword     sh_addralign;   /* memory alignment */
        Elf64_Xword     sh_entsize;     /* table entry size */
 } Elf64_Shdr;
 
-/* Special Section Indexes */
-#define SHN_UNDEF      0               /* undefined */
-#define SHN_LORESERVE  0xff00          /* lower bounds of reserved indexes */
-#define SHN_LOPROC     0xff00          /* reserved range for processor */
-#define SHN_HIPROC     0xff1f          /*   specific section indexes */
-#define SHN_ABS                0xfff1          /* absolute value */
-#define SHN_COMMON     0xfff2          /* common symbol */
-#define SHN_HIRESERVE  0xffff          /* upper bounds of reserved indexes */
-
 /* sh_type */
 #define SHT_NULL       0               /* inactive */
 #define SHT_PROGBITS   1               /* program defined information */
@@ -256,24 +541,87 @@ typedef struct {
 #define SHT_REL                9               /* relation section without 
addends */
 #define SHT_SHLIB      10              /* reserved - purpose unknown */
 #define SHT_DYNSYM     11              /* dynamic symbol table section */
-#define SHT_NUM                12              /* number of section types */
-#define SHT_LOPROC     0x70000000      /* reserved range for processor */
-#define SHT_HIPROC     0x7fffffff      /*  specific section header types */
+#define SHT_INIT_ARRAY 14              /* pointers to init functions */
+#define SHT_FINI_ARRAY 15              /* pointers to termination functions */
+#define SHT_PREINIT_ARRAY      16      /* pointers to pre-init functions */
+#define SHT_GROUP      17              /* section group */
+#define SHT_SYMTAB_SHNDX       18      /* symbol table section */
+#define SHT_LOOS       0x60000000      /* OS specific semantics low-end */
+#define SHT_HIOS       0x6fffffff      /* OS specific semantics hi-end */
+/* not in spec!
+#define SHT_NUM                12*/            /* number of section types */
+#define SHT_LOPROC     0x70000000      /* CPU specific semantics low-end */
+#define SHT_HIPROC     0x7fffffff      /* CPU specific semantics hi-end */
 #define SHT_LOUSER     0x80000000      /* reserved range for application */
 #define SHT_HIUSER     0xffffffff      /*  specific indexes */
 
+/* sh_flags - Section Attribute Flags */
+#define SHF_WRITE      0x1             /* Writable */
+#define SHF_ALLOC      0x2             /* occupies memory */
+#define SHF_EXECINSTR  0x4             /* executable */
+#define SHF_MERGE      0x10            /* merge to eliminate duplication */
+#define SHF_STRINGS    0x20            /* null-terminated strings */
+#define SHF_INFO_LINK  0x40            /* sh_info holds section header index */
+#define SHF_LINK_ORDER 0x80            /* ordering requirements */
+#define SHF_OS_NONFONFORMING   0x100   /* OS specific processing necessary */
+#define SHF_GROUP      0x200           /* member of a section group */
+#define SHF_TLS                0x400           /* thread local storage */
+#define SHF_COMPRESSED 0x800           /* marks section with compressed data */
+#define SHF_MARKOS     0x0ff00000      /* reserved bits for OS */
+#define SHF_MASKPROC   0xf0000000      /* reserved bits for processor */
+
+/*
+ * Compression Header
+ */
+
+typedef struct {
+       Elf32_Word      ch_type;        /* compression algorithm */
+       Elf32_Word      ch_size;        /* size of uncompressed data */
+       Elf32_Word      ch_addralign;   /* required alignment for uncompressed
+                                          data */
+} Elf32_Chdr;
+
+typedef struct {
+       Elf64_Word      ch_type;        /* compression algorithm */
+       Elf64_Word      ch_reserved;
+       Elf64_Xword     ch_size;        /* size of uncompressed data */
+       Elf64_Xword     ch_addralign;   /* required alignment for uncompressed
+                                          data */
+} Elf64_Chdr;
+
+/* ch_type ELF Compression Types */
+#define        ELFCOMPRESS_ZLIB        1               /* ZLIB algorithm */
+#define ELFCOMPRESS_LOOS       0x60000000      /* OS spec. semantics low-end */
+#define ELFCOMPRESS_HIOS       0x6fffffff      /* OS spec. semantics hi-end */
+#define ELFCOMPRESS_LOPROC     0x70000000      /* CPU spec. semantics low-end*/
+#define ELFCOMPRESS_HIPROC     0x7fffffff      /* CPU spec. semantics hi-end*/
+
+
+/* Section Group Flags */
+#define        GRP_COMDAT      0x1             /* COMDAT group */
+#define GRP_MASKOS     0x0ff00000      /* OS specific semantics */
+#define GRP_MASKPROC   0xf0000000      /* Processor specific semantics */
+
+/* Special Sections -- following sections definitions ELF_* are not
+   part of the spec. Specification however defines all the sections name
+   E.g. .bss, .comment, .data etc. so I leave those defines here too. */
 /* Section names */
 #define ELF_BSS         ".bss"         /* uninitialized data */
+#define ELF_COMMENT    ".comment"      /* version control information */
 #define ELF_DATA        ".data"                /* initialized data */
-#define ELF_CTF                ".SUNW_ctf"     /* CTF data */
+#define ELF_DATA1      ".data1"        /* initialized data */
+/* not in spec!
+#define ELF_CTF                ".SUNW_ctf"*/   /* CTF data */
 #define ELF_DEBUG       ".debug"       /* debug */
 #define ELF_DYNAMIC     ".dynamic"     /* dynamic linking information */
 #define ELF_DYNSTR      ".dynstr"      /* dynamic string table */
 #define ELF_DYNSYM      ".dynsym"      /* dynamic symbol table */
 #define ELF_FINI        ".fini"                /* termination code */
+#define ELF_FINI_ARR   ".fini_array"   /* termination functions array */
 #define ELF_GOT         ".got"         /* global offset table */
 #define ELF_HASH        ".hash"                /* symbol hash table */
 #define ELF_INIT        ".init"                /* initialization code */
+#define ELF_INIT_ARR   ".init_array"   /* initialization functions array */
 #define ELF_REL_DATA    ".rel.data"    /* relocation data */
 #define ELF_REL_FINI    ".rel.fini"    /* relocation termination code */
 #define ELF_REL_INIT    ".rel.init"    /* relocation initialization code */
@@ -281,22 +629,28 @@ typedef struct {
 #define ELF_REL_RODATA  ".rel.rodata"  /* relocation read-only data */
 #define ELF_REL_TEXT    ".rel.text"    /* relocation code */
 #define ELF_RODATA      ".rodata"      /* read-only data */
+#define ELF_RODATA1    ".rodata1"      /* read-only data */
 #define ELF_SHSTRTAB    ".shstrtab"    /* section header string table */
 #define ELF_STRTAB      ".strtab"      /* string table */
 #define ELF_SYMTAB      ".symtab"      /* symbol table */
+#define ELF_SYMTAB_SHNDX       ".symtab_shndx" /* symbol table section index
+                                                  array */
+#define ELF_TBSS       ".tbss"         /* TLS uninitialized data */
+#define ELF_TDATA      ".tdata"        /* TLS initialized data */
+#define ELF_TDATA1     ".tdata1"       /* TLS initialized data */
 #define ELF_TEXT        ".text"                /* code */
 
 
-/* Section Attribute Flags - sh_flags */
-#define SHF_WRITE      0x1             /* Writable */
-#define SHF_ALLOC      0x2             /* occupies memory */
-#define SHF_EXECINSTR  0x4             /* executable */
-#define SHF_TLS                0x400           /* thread local storage */
-#define SHF_MASKPROC   0xf0000000      /* reserved bits for processor */
-                                       /*  specific section attributes */
+/*
+ * Symbol Table
+ * http://www.sco.com/developers/gabi/latest/ch4.symtab.html
+ */
+
+/* Symbol table index */
+#define STN_UNDEF      0               /* undefined */
 
 /* Symbol Table Entry */
-typedef struct elf32_sym {
+typedef struct {
        Elf32_Word      st_name;        /* name - index into string table */
        Elf32_Addr      st_value;       /* symbol value */
        Elf32_Word      st_size;        /* symbol size */
@@ -306,17 +660,14 @@ typedef struct elf32_sym {
 } Elf32_Sym;
 
 typedef struct {
-       Elf64_Half      st_name;        /* Symbol name index in str table */
-       Elf_Byte        st_info;        /* type / binding attrs */
-       Elf_Byte        st_other;       /* unused */
-       Elf64_Quarter   st_shndx;       /* section index of symbol */
-       Elf64_Xword     st_value;       /* value of symbol */
+       Elf64_Word      st_name;        /* Symbol name index in str table */
+       unsigned char   st_info;        /* type / binding attrs */
+       unsigned char   st_other;       /* unused */
+       Elf64_Half      st_shndx;       /* section index of symbol */
+       Elf64_Addr      st_value;       /* value of symbol */
        Elf64_Xword     st_size;        /* size of symbol */
 } Elf64_Sym;
 
-/* Symbol table index */
-#define STN_UNDEF      0               /* undefined */
-
 /* Extract symbol info - st_info */
 #define ELF32_ST_BIND(x)       ((x) >> 4)
 #define ELF32_ST_TYPE(x)       (((unsigned int) x) & 0xf)
@@ -326,11 +677,18 @@ typedef struct {
 #define ELF64_ST_TYPE(x)       (((unsigned int) x) & 0xf)
 #define ELF64_ST_INFO(b,t)     (((b) << 4) + ((t) & 0xf))
 
+/* Extract symbol other attribute - st_other -- used for symbol visibility */
+#define ELF32_ST_VISIBILITY(o) ((o)&0x3)
+#define ELF64_ST_VISIBILITY(o) ((o)&0x3)
+
 /* Symbol Binding - ELF32_ST_BIND - st_info */
 #define STB_LOCAL      0               /* Local symbol */
 #define STB_GLOBAL     1               /* Global symbol */
 #define STB_WEAK       2               /* like global - lower precedence */
-#define STB_NUM                3               /* number of symbol bindings */
+#define STB_LOOS       10              /* OS specific semantics low-end */
+#define STB_HIOS       12              /* OS specific semantics hi-end */
+/* not in spec!
+#define STB_NUM                3*/             /* number of symbol bindings */
 #define STB_LOPROC     13              /* reserved range for processor */
 #define STB_HIPROC     15              /*  specific symbol bindings */
 
@@ -340,10 +698,27 @@ typedef struct {
 #define STT_FUNC       2               /* function */
 #define STT_SECTION    3               /* section */
 #define STT_FILE       4               /* file */
+#define STT_COMMON     5               /* uninitialized common block */
 #define STT_TLS                6               /* thread local storage */
+#define STT_LOOS       10              /* reserved range for OS */
+#define STT_HIOS       12              /*  specific symbol types */
 #define STT_LOPROC     13              /* reserved range for processor */
 #define STT_HIPROC     15              /*  specific symbol types */
 
+/* Symbol Visibility */
+#define STV_DEFAULT    0               /* default visibility for given symbol's
+                                          binding type: global & weak are
+                                          visible. Locals are hidden */
+#define STV_INTERNAL   1               /* Visibility of this type is defined
+                                          by processor supplement(s) */
+#define STV_HIDDEN     2               /* not visible symbol */
+#define STV_PROTECTED  3               /* visible but not preemptable symbol */
+
+/*
+ * Relocation
+ * http://www.sco.com/developers/gabi/latest/ch4.reloc.html
+ */
+
 /* Relocation entry with implicit addend */
 typedef struct {
        Elf32_Addr      r_offset;       /* offset of relocation */
@@ -357,26 +732,28 @@ typedef struct {
        Elf32_Sword     r_addend;
 } Elf32_Rela;
 
-/* Extract relocation info - r_info */
-#define ELF32_R_SYM(i)         ((i) >> 8)
-#define ELF32_R_TYPE(i)                ((unsigned char) (i))
-#define ELF32_R_INFO(s,t)      (((s) << 8) + (unsigned char)(t))
-
 typedef struct {
-       Elf64_Xword     r_offset;       /* where to do it */
+       Elf64_Addr      r_offset;       /* where to do it */
        Elf64_Xword     r_info;         /* index & type of relocation */
 } Elf64_Rel;
 
 typedef struct {
-       Elf64_Xword     r_offset;       /* where to do it */
+       Elf64_Addr      r_offset;       /* where to do it */
        Elf64_Xword     r_info;         /* index & type of relocation */
        Elf64_Sxword    r_addend;       /* adjustment value */
 } Elf64_Rela;
 
+/* Extract relocation info - r_info */
+#define ELF32_R_SYM(i)         ((i) >> 8)
+#define ELF32_R_TYPE(i)                ((unsigned char) (i))
+#define ELF32_R_INFO(s,t)      (((s) << 8) + (unsigned char)(t))
+
 #define        ELF64_R_SYM(info)       ((info) >> 32)
 #define        ELF64_R_TYPE(info)      ((info) & 0xFFFFFFFF)
-#define ELF64_R_INFO(s,t)      (((s) << 32) + (__uint32_t)(t))
+#define ELF64_R_INFO(s,t)      (((s) << 32) + (__uint32_t)((t)&0xFFFFFFFF))
 
+/* spec allows processor specific relocation types to be added. As this is
+   allowed, let's keep those here inside the spec. stuff */
 #if defined(__mips64__) && defined(__MIPSEL__)
 /*
  * The 64-bit MIPS ELF ABI uses a slightly different relocation format
@@ -391,6 +768,10 @@ typedef struct {
 #define        ELF64_R_INFO(s,t)       (((__uint64_t)swap32(t) << 32) + 
(__uint32_t)(s))
 #endif /* __mips64__ && __MIPSEL__ */
 
+/*
+ * Program Header
+ * http://www.sco.com/developers/gabi/latest/ch5.pheader.html
+ */
 /* Program Header */
 typedef struct {
        Elf32_Word      p_type;         /* segment type */
@@ -404,8 +785,8 @@ typedef struct {
 } Elf32_Phdr;
 
 typedef struct {
-       Elf64_Half      p_type;         /* entry type */
-       Elf64_Half      p_flags;        /* flags */
+       Elf64_Word      p_type;         /* entry type */
+       Elf64_Word      p_flags;        /* flags */
        Elf64_Off       p_offset;       /* offset */
        Elf64_Addr      p_vaddr;        /* virtual address */
        Elf64_Addr      p_paddr;        /* physical address */
@@ -428,19 +809,17 @@ typedef struct {
 #define PT_LOPROC      0x70000000      /* reserved range for processor */
 #define PT_HIPROC      0x7fffffff      /*  specific segment types */
 
-#define PT_GNU_EH_FRAME                0x6474e550      /* Exception handling 
info */
-#define PT_GNU_RELRO           0x6474e552      /* Read-only after relocation */
-
-#define PT_OPENBSD_RANDOMIZE   0x65a3dbe6      /* fill with random data */
-#define PT_OPENBSD_WXNEEDED    0x65a3dbe7      /* program performs W^X 
violations */
-#define PT_OPENBSD_BOOTDATA    0x65a41be6      /* section for boot arguments */
-
 /* Segment flags - p_flags */
 #define PF_X           0x1             /* Executable */
 #define PF_W           0x2             /* Writable */
 #define PF_R           0x4             /* Readable */
+#define PF_MASKOS      0x0ff00000      /* OS specific semantics */
 #define PF_MASKPROC    0xf0000000      /* reserved bits for processor */
                                        /*  specific segment flags */
+/*
+ * Dynamic Linking
+ * http://www.sco.com/developers/gabi/latest/ch5.dynamic.html
+ */
 
 /* Dynamic structure */
 typedef struct {
@@ -451,14 +830,25 @@ typedef struct {
        } d_un;
 } Elf32_Dyn;
 
+/* spec also defines here:
+   extern Elf32_Dyn    _DYNAMIC[];
+   symbol, but this is defined below using Elf_Dyn to avoid name clash
+   with 64bit _DYNAMIC[] */
+
 typedef struct {
-       Elf64_Xword     d_tag;          /* controls meaning of d_val */
+       Elf64_Sxword    d_tag;          /* controls meaning of d_val */
        union {
-               Elf64_Addr      d_ptr;
                Elf64_Xword     d_val;
+               Elf64_Addr      d_ptr;
        } d_un;
 } Elf64_Dyn;
 
+/* spec also defines here:
+   extern Elf64_Dyn    _DYNAMIC[];
+   symbol, but this is defined below using Elf_Dyn to avoid name clash
+   with 32bit _DYNAMIC[] */
+
+
 /* Dynamic Array Tags - d_tag */
 #define DT_NULL                0               /* marks end of _DYNAMIC array 
*/
 #define DT_NEEDED      1               /* string table offset of needed lib */
@@ -495,16 +885,12 @@ typedef struct {
 #define DT_ENCODING    31              /* further DT_* follow encoding rules */
 #define DT_PREINIT_ARRAY       32      /* address of array of preinit func */
 #define DT_PREINIT_ARRAYSZ     33      /* size of array of preinit func */
+#define DT_SYMTAB_SHNDX        34              /* address of symtab section */
 #define DT_LOOS                0x6000000d      /* reserved range for OS */
 #define DT_HIOS                0x6ffff000      /*  specific dynamic array tags 
*/
 #define DT_LOPROC      0x70000000      /* reserved range for processor */
 #define DT_HIPROC      0x7fffffff      /*  specific dynamic array tags */
 
-/* some other useful tags */
-#define DT_RELACOUNT   0x6ffffff9      /* if present, number of RELATIVE */
-#define DT_RELCOUNT    0x6ffffffa      /* relocs, which must come first */
-#define DT_FLAGS_1      0x6ffffffb
-
 /* Dynamic Flags - DT_FLAGS .dynamic entry */
 #define DF_ORIGIN       0x00000001
 #define DF_SYMBOLIC     0x00000002
@@ -512,22 +898,6 @@ typedef struct {
 #define DF_BIND_NOW     0x00000008
 #define DF_STATIC_TLS   0x00000010
 
-/* Dynamic Flags - DT_FLAGS_1 .dynamic entry */
-#define DF_1_NOW       0x00000001
-#define DF_1_GLOBAL    0x00000002
-#define DF_1_GROUP     0x00000004
-#define DF_1_NODELETE  0x00000008
-#define DF_1_LOADFLTR  0x00000010
-#define DF_1_INITFIRST 0x00000020
-#define DF_1_NOOPEN    0x00000040
-#define DF_1_ORIGIN    0x00000080
-#define DF_1_DIRECT    0x00000100
-#define DF_1_TRANS     0x00000200
-#define DF_1_INTERPOSE 0x00000400
-#define DF_1_NODEFLIB  0x00000800
-#define DF_1_NODUMP    0x00001000
-#define DF_1_CONLFAT   0x00002000
-
 /* Standard ELF hashing function */
 unsigned int elf_hash(const unsigned char *name);
 
@@ -541,9 +911,9 @@ typedef struct {
 } Elf32_Nhdr;
 
 typedef struct {
-       Elf64_Half n_namesz;
-       Elf64_Half n_descsz;
-       Elf64_Half n_type;
+       Elf64_Word n_namesz;
+       Elf64_Word n_descsz;
+       Elf64_Word n_type;
 } Elf64_Nhdr;
 
 /*
@@ -556,72 +926,58 @@ typedef struct {
 } Elf32_Note;
 
 typedef struct {
-       Elf64_Half namesz;
-       Elf64_Half descsz;
-       Elf64_Half type;
+       Elf64_Word namesz;
+       Elf64_Word descsz;
+       Elf64_Word type;
 } Elf64_Note;
 
 /*
- * OpenBSD-specific core file information.
- *
- * OpenBSD ELF core files use notes to provide information about
- * the process's state.  The note name is "OpenBSD" for information
- * that is global to the process, and "OpenBSD@nn", where "nn" is the
- * thread ID of the thread that the information belongs to (such as
- * register state).
- *
- * We use the following note identifiers:
- *
- *     NT_OPENBSD_PROCINFO
- *             Note is a "elfcore_procinfo" structure.
- *     NT_OPENBSD_AUXV
- *             Note is a a bunch of Auxilliary Vectors, terminated by
- *             an AT_NULL entry.
- *     NT_OPENBSD_REGS
- *             Note is a "reg" structure.
- *     NT_OPENBSD_FPREGS
- *             Note is a "fpreg" structure.
- *
- * Please try to keep the members of the "elfcore_procinfo" structure
- * nicely aligned, and if you add elements, add them to the end and
- * bump the version.
+ * here comes the end of the specification. The definitions below are either
+ * generally usable (or historic) or OS specific
  */
 
-#define NT_OPENBSD_PROCINFO    10
-#define NT_OPENBSD_AUXV                11
+/* e_ident */
+#define IS_ELF(ehdr) ((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \
+                      (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \
+                      (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \
+                      (ehdr).e_ident[EI_MAG3] == ELFMAG3)
 
-#define NT_OPENBSD_REGS                20
-#define NT_OPENBSD_FPREGS      21
-#define NT_OPENBSD_XFPREGS     22
-#define NT_OPENBSD_WCOOKIE     23
+#define        EM_AMD64        EM_X86_64       /* AMD x86-64 architecture */
+#define EM_ALPHA_EXP   0x9026          /* DEC ALPHA */
 
-struct elfcore_procinfo {
-       /* Version 1 fields start here. */
-       uint32_t        cpi_version;    /* netbsd_elfcore_procinfo version */
-#define ELFCORE_PROCINFO_VERSION       1
-       uint32_t        cpi_cpisize;    /* sizeof(netbsd_elfcore_procinfo) */
-       uint32_t        cpi_signo;      /* killing signal */
-       uint32_t        cpi_sigcode;    /* signal code */
-       uint32_t        cpi_sigpend;    /* pending signals */
-       uint32_t        cpi_sigmask;    /* blocked signals */
-       uint32_t        cpi_sigignore;  /* ignored signals */
-       uint32_t        cpi_sigcatch;   /* signals being caught by user */
-       int32_t         cpi_pid;        /* process ID */
-       int32_t         cpi_ppid;       /* parent process ID */
-       int32_t         cpi_pgrp;       /* process group ID */
-       int32_t         cpi_sid;        /* session ID */
-       uint32_t        cpi_ruid;       /* real user ID */
-       uint32_t        cpi_euid;       /* effective user ID */
-       uint32_t        cpi_svuid;      /* saved user ID */
-       uint32_t        cpi_rgid;       /* real group ID */
-       uint32_t        cpi_egid;       /* effective group ID */
-       uint32_t        cpi_svgid;      /* saved group ID */
-       int8_t          cpi_name[32];   /* copy of pr->ps_comm */
-};
+#define        ELFMAG          "\177ELF"       /* magic */
+#define        SELFMAG         4               /* size of magic */
+/* this section type definition is used by vmd */
+#define ELF_CTF                ".SUNW_ctf"     /* CTF data */
+
+/* some other useful tags */
+#define DT_RELACOUNT   0x6ffffff9      /* if present, number of RELATIVE */
+#define DT_RELCOUNT    0x6ffffffa      /* relocs, which must come first */
+#define DT_FLAGS_1      0x6ffffffb
+
+/* Dynamic Flags - DT_FLAGS_1 .dynamic entry */
+#define DF_1_NOW       0x00000001
+#define DF_1_GLOBAL    0x00000002
+#define DF_1_GROUP     0x00000004
+#define DF_1_NODELETE  0x00000008
+#define DF_1_LOADFLTR  0x00000010
+#define DF_1_INITFIRST 0x00000020
+#define DF_1_NOOPEN    0x00000040
+#define DF_1_ORIGIN    0x00000080
+#define DF_1_DIRECT    0x00000100
+#define DF_1_TRANS     0x00000200
+#define DF_1_INTERPOSE 0x00000400
+#define DF_1_NODEFLIB  0x00000800
+#define DF_1_NODUMP    0x00001000
+#define DF_1_CONLFAT   0x00002000
+
+#define PT_GNU_EH_FRAME                0x6474e550      /* Exception handling 
info */
+#define PT_GNU_RELRO           0x6474e552      /* Read-only after relocation */
+
+#define PT_OPENBSD_RANDOMIZE   0x65a3dbe6      /* fill with random data */
+#define PT_OPENBSD_WXNEEDED    0x65a3dbe7      /* program performs W^X 
violations */
+#define PT_OPENBSD_BOOTDATA    0x65a41be6      /* section for boot arguments */
 
-/*
- * XXX - these _KERNEL items aren't part of the ABI!
- */
 #if defined(_KERNEL) || defined(_DYN_LOADER)
 
 #define ELF32_NO_ADDR  ((uint32_t) ~0) /* Indicates addr. not yet filled in */
@@ -634,7 +990,7 @@ typedef struct {
 #define ELF64_NO_ADDR  ((__uint64_t) ~0)/* Indicates addr. not yet filled in */
 
 typedef struct {
-       Elf64_Shalf     au_id;                          /* 32-bit id */
+       Elf64_Sword     au_id;                          /* 32-bit id */
        Elf64_Xword     au_v;                           /* 64-bit value */
 } Aux64Info;
 
@@ -663,7 +1019,7 @@ struct elf_args {
         u_long  arg_phnum;             /* Number of program headers */
 };
 
-#endif
+#endif /* _KERNEL || _DYN_LOADER */
 
 #if !defined(ELFSIZE) && defined(ARCH_ELFSIZE)
 #define ELFSIZE ARCH_ELFSIZE
@@ -729,13 +1085,73 @@ struct elf_args {
 
 #define ELF_NO_ADDR    ELF64_NO_ADDR
 #define AuxInfo                Aux64Info
-#endif
+#else
+#error "wrong ELF size"
+#endif /* ELFSIZE */
 
 #ifndef _KERNEL
 extern Elf_Dyn         _DYNAMIC[];
 #endif
 
 #ifdef _KERNEL
+/*
+ * OpenBSD-specific core file information.
+ *
+ * OpenBSD ELF core files use notes to provide information about
+ * the process's state.  The note name is "OpenBSD" for information
+ * that is global to the process, and "OpenBSD@nn", where "nn" is the
+ * thread ID of the thread that the information belongs to (such as
+ * register state).
+ *
+ * We use the following note identifiers:
+ *
+ *     NT_OPENBSD_PROCINFO
+ *             Note is a "elfcore_procinfo" structure.
+ *     NT_OPENBSD_AUXV
+ *             Note is a a bunch of Auxilliary Vectors, terminated by
+ *             an AT_NULL entry.
+ *     NT_OPENBSD_REGS
+ *             Note is a "reg" structure.
+ *     NT_OPENBSD_FPREGS
+ *             Note is a "fpreg" structure.
+ *
+ * Please try to keep the members of the "elfcore_procinfo" structure
+ * nicely aligned, and if you add elements, add them to the end and
+ * bump the version.
+ */
+
+#define NT_OPENBSD_PROCINFO    10
+#define NT_OPENBSD_AUXV                11
+
+#define NT_OPENBSD_REGS                20
+#define NT_OPENBSD_FPREGS      21
+#define NT_OPENBSD_XFPREGS     22
+#define NT_OPENBSD_WCOOKIE     23
+
+struct elfcore_procinfo {
+       /* Version 1 fields start here. */
+       uint32_t        cpi_version;    /* netbsd_elfcore_procinfo version */
+#define ELFCORE_PROCINFO_VERSION       1
+       uint32_t        cpi_cpisize;    /* sizeof(netbsd_elfcore_procinfo) */
+       uint32_t        cpi_signo;      /* killing signal */
+       uint32_t        cpi_sigcode;    /* signal code */
+       uint32_t        cpi_sigpend;    /* pending signals */
+       uint32_t        cpi_sigmask;    /* blocked signals */
+       uint32_t        cpi_sigignore;  /* ignored signals */
+       uint32_t        cpi_sigcatch;   /* signals being caught by user */
+       int32_t         cpi_pid;        /* process ID */
+       int32_t         cpi_ppid;       /* parent process ID */
+       int32_t         cpi_pgrp;       /* process group ID */
+       int32_t         cpi_sid;        /* session ID */
+       uint32_t        cpi_ruid;       /* real user ID */
+       uint32_t        cpi_euid;       /* effective user ID */
+       uint32_t        cpi_svuid;      /* saved user ID */
+       uint32_t        cpi_rgid;       /* real group ID */
+       uint32_t        cpi_egid;       /* effective group ID */
+       uint32_t        cpi_svgid;      /* saved group ID */
+       int8_t          cpi_name[32];   /* copy of pr->ps_comm */
+};
+
 struct exec_package;
 
 int    exec_elf_makecmds(struct proc *, struct exec_package *);
Index: usr.bin/nm/elf.c
===================================================================
RCS file: /cvs/src/usr.bin/nm/elf.c,v
retrieving revision 1.34
diff -u -p -u -r1.34 elf.c
--- usr.bin/nm/elf.c    9 Dec 2015 19:28:34 -0000       1.34
+++ usr.bin/nm/elf.c    18 Jul 2017 20:30:37 -0000
@@ -29,7 +29,7 @@
 #include <sys/mman.h>
 #include <unistd.h>
 #include <a.out.h>
-#include <elf_abi.h>
+#include <elf.h>
 #include <errno.h>
 #include <err.h>
 #include <stdint.h>
Index: usr.bin/nm/nm.c
===================================================================
RCS file: /cvs/src/usr.bin/nm/nm.c,v
retrieving revision 1.51
diff -u -p -u -r1.51 nm.c
--- usr.bin/nm/nm.c     9 Dec 2015 19:28:34 -0000       1.51
+++ usr.bin/nm/nm.c     18 Jul 2017 20:30:37 -0000
@@ -36,7 +36,7 @@
 #include <sys/types.h>
 #include <sys/mman.h>
 #include <a.out.h>
-#include <elf_abi.h>
+#include <elf.h>
 #include <ar.h>
 #include <ranlib.h>
 #include <unistd.h>
Index: usr.bin/rdist/isexec.c
===================================================================
RCS file: /cvs/src/usr.bin/rdist/isexec.c,v
retrieving revision 1.10
diff -u -p -u -r1.10 isexec.c
--- usr.bin/rdist/isexec.c      20 Jan 2015 09:00:16 -0000      1.10
+++ usr.bin/rdist/isexec.c      18 Jul 2017 20:30:37 -0000
@@ -30,7 +30,7 @@
  */
 
 #include <sys/types.h>
-#include <elf_abi.h>
+#include <elf.h>
 #include <fcntl.h>
 #include <unistd.h>
 
Index: usr.sbin/installboot/i386_installboot.c
===================================================================
RCS file: /cvs/src/usr.sbin/installboot/i386_installboot.c,v
retrieving revision 1.30
diff -u -p -u -r1.30 i386_installboot.c
--- usr.sbin/installboot/i386_installboot.c     4 Jun 2017 13:57:29 -0000       
1.30
+++ usr.sbin/installboot/i386_installboot.c     18 Jul 2017 20:30:46 -0000
@@ -54,7 +54,7 @@
 #include <machine/cpu.h>
 #include <machine/biosvar.h>
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <err.h>
 #include <errno.h>
 #include <fcntl.h>
Index: usr.sbin/installboot/i386_nlist.c
===================================================================
RCS file: /cvs/src/usr.sbin/installboot/i386_nlist.c,v
retrieving revision 1.5
diff -u -p -u -r1.5 i386_nlist.c
--- usr.sbin/installboot/i386_nlist.c   19 Oct 2015 19:22:32 -0000      1.5
+++ usr.sbin/installboot/i386_nlist.c   18 Jul 2017 20:30:46 -0000
@@ -34,7 +34,7 @@
 #include <sys/mman.h>
 #include <sys/stat.h>
 
-#include <elf_abi.h>
+#include <elf.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <nlist.h>
Index: usr.sbin/kvm_mkdb/nlist.c
===================================================================
RCS file: /cvs/src/usr.sbin/kvm_mkdb/nlist.c,v
retrieving revision 1.50
diff -u -p -u -r1.50 nlist.c
--- usr.sbin/kvm_mkdb/nlist.c   10 Sep 2016 05:48:18 -0000      1.50
+++ usr.sbin/kvm_mkdb/nlist.c   18 Jul 2017 20:30:46 -0000
@@ -50,7 +50,7 @@
 #include <sys/file.h>
 #include <sys/sysctl.h>
 
-#include <elf_abi.h>
+#include <elf.h>
 
 typedef struct nlist NLIST;
 #define        _strx   n_un.n_strx

Reply via email to