[PATCH v1 1/5] sys/exec_elf.h: Bring in newer file

Ryan Long ryan.long at oarcorp.com
Wed Jul 20 21:36:29 UTC 2022


Updated this file with the newer version in NetBSD.

Updates #4682
---
 cpukit/include/sys/exec_elf.h | 840 ++++++++++++++++++++++++----------
 1 file changed, 608 insertions(+), 232 deletions(-)

diff --git a/cpukit/include/sys/exec_elf.h b/cpukit/include/sys/exec_elf.h
index 4242415f54..b50da6b272 100644
--- a/cpukit/include/sys/exec_elf.h
+++ b/cpukit/include/sys/exec_elf.h
@@ -1,4 +1,4 @@
-/*	$NetBSD: exec_elf.h,v 1.102 2010/03/01 11:27:29 skrll Exp $	*/
+/*	$NetBSD: exec_elf.h,v 1.168 2020/10/19 19:33:02 christos Exp $	*/
 
 /*-
  * Copyright (c) 1994 The NetBSD Foundation, Inc.
@@ -44,6 +44,7 @@
 #include <sys/types.h>
 #else
 #include <inttypes.h>
+#include <stddef.h>
 #endif /* _KERNEL || _STANDALONE */
 
 #if defined(ELFSIZE)
@@ -60,49 +61,41 @@
 #include <machine/elf_machdep.h>
 #endif
 
-typedef	uint8_t  	Elf_Byte;
-
-typedef	uint32_t	Elf32_Addr;
-#define	ELF32_FSZ_ADDR	4
-typedef	uint32_t	Elf32_Off;
-typedef	int32_t		Elf32_SOff;
-#define	ELF32_FSZ_OFF	4
-typedef	int32_t		Elf32_Sword;
-#define	ELF32_FSZ_SWORD	4
-typedef	uint32_t	Elf32_Word;
-#define	ELF32_FSZ_WORD	4
-typedef	uint16_t	Elf32_Half;
-#define	ELF32_FSZ_HALF	2
-typedef	uint64_t	Elf32_Lword;
-#define	ELF32_FSZ_LWORD	8
-
-typedef	uint64_t	Elf64_Addr;
-#define	ELF64_FSZ_ADDR	8
-typedef	uint64_t	Elf64_Off;
-typedef	int64_t		Elf64_SOff;
-#define	ELF64_FSZ_OFF	8
-typedef	int32_t		Elf64_Shalf;
-#define	ELF64_FSZ_SHALF	4
-
-#ifndef ELF64_FSZ_SWORD
-typedef	int32_t		Elf64_Sword;
-#define	ELF64_FSZ_SWORD	4
-#endif /* ELF64_FSZ_SWORD */
-#ifndef ELF64_FSZ_WORD
-typedef	uint32_t	Elf64_Word;
-#define	ELF64_FSZ_WORD	4
-#endif /* ELF64_FSZ_WORD */
-
-typedef	int64_t		Elf64_Sxword;
-#define	ELF64_FSZ_SXWORD 8
-typedef	uint64_t	Elf64_Xword;
-#define	ELF64_FSZ_XWORD	8
-typedef	uint64_t	Elf64_Lword;
-#define	ELF64_FSZ_LWORD	8
-typedef	uint32_t	Elf64_Half;
-#define	ELF64_FSZ_HALF	4
-typedef	uint16_t	Elf64_Quarter;
-#define	ELF64_FSZ_QUARTER 2
+typedef uint8_t		Elf_Byte;
+
+typedef uint32_t	Elf32_Addr;
+#define ELF32_FSZ_ADDR	4
+typedef uint32_t	Elf32_Off;
+typedef int32_t		Elf32_SOff;
+#define ELF32_FSZ_OFF	4
+typedef int32_t		Elf32_Sword;
+#define ELF32_FSZ_SWORD 4
+typedef uint32_t	Elf32_Word;
+#define ELF32_FSZ_WORD	4
+typedef uint16_t	Elf32_Half;
+#define ELF32_FSZ_HALF	2
+typedef uint64_t	Elf32_Lword;
+#define ELF32_FSZ_LWORD 8
+
+typedef uint64_t	Elf64_Addr;
+#define ELF64_FSZ_ADDR	8
+typedef uint64_t	Elf64_Off;
+typedef int64_t		Elf64_SOff;
+#define ELF64_FSZ_OFF	8
+
+typedef int32_t		Elf64_Sword;
+#define ELF64_FSZ_SWORD 4
+typedef uint32_t	Elf64_Word;
+#define ELF64_FSZ_WORD	4
+
+typedef int64_t		Elf64_Sxword;
+#define ELF64_FSZ_SXWORD 8
+typedef uint64_t	Elf64_Xword;
+#define ELF64_FSZ_XWORD 8
+typedef uint64_t	Elf64_Lword;
+#define ELF64_FSZ_LWORD 8
+typedef uint16_t	Elf64_Half;
+#define ELF64_FSZ_HALF 2
 
 /*
  * ELF Header
@@ -118,29 +111,29 @@ typedef struct {
 	Elf32_Off	e_phoff;		/* Program hdr offset */
 	Elf32_Off	e_shoff;		/* Section hdr offset */
 	Elf32_Word	e_flags;		/* Processor flags */
-	Elf32_Half      e_ehsize;		/* sizeof ehdr */
-	Elf32_Half      e_phentsize;		/* Program header entry size */
-	Elf32_Half      e_phnum;		/* Number of program headers */
-	Elf32_Half      e_shentsize;		/* Section header entry size */
-	Elf32_Half      e_shnum;		/* Number of section headers */
-	Elf32_Half      e_shstrndx;		/* String table index */
+	Elf32_Half	e_ehsize;		/* sizeof ehdr */
+	Elf32_Half	e_phentsize;		/* Program header entry size */
+	Elf32_Half	e_phnum;		/* Number of program headers */
+	Elf32_Half	e_shentsize;		/* Section header entry size */
+	Elf32_Half	e_shnum;		/* Number of section headers */
+	Elf32_Half	e_shstrndx;		/* String table index */
 } Elf32_Ehdr;
 
 typedef struct {
 	unsigned char	e_ident[ELF_NIDENT];	/* Id bytes */
-	Elf64_Quarter	e_type;			/* file type */
-	Elf64_Quarter	e_machine;		/* machine type */
-	Elf64_Half	e_version;		/* version number */
+	Elf64_Half	e_type;			/* file type */
+	Elf64_Half	e_machine;		/* machine type */
+	Elf64_Word	e_version;		/* version number */
 	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_ident offsets */
@@ -184,11 +177,11 @@ typedef struct {
 #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 */
+#define ELFOSABI_GNU		3	/* GNU/Linux */
+#define ELFOSABI_HURD		4	/* GNU/Hurd - historical */
+#define ELFOSABI_86OPEN		5	/* 86Open - historical */
 #define ELFOSABI_SOLARIS	6	/* Solaris */
-#define ELFOSABI_MONTEREY	7	/* Monterey */
+#define ELFOSABI_AIX		7	/* AIX */
 #define ELFOSABI_IRIX		8	/* IRIX */
 #define ELFOSABI_FREEBSD	9	/* FreeBSD */
 #define ELFOSABI_TRU64		10	/* TRU64 UNIX */
@@ -197,12 +190,18 @@ typedef struct {
 #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 */
 /* Unofficial OSABIs follow */
 #define ELFOSABI_ARM		97	/* ARM */
 #define	ELFOSABI_STANDALONE	255	/* Standalone (embedded) application */
 
 #define	ELFOSABI_NONE		ELFOSABI_SYSV
-#define	ELFOSABI_AIX		ELFOSABI_MONTEREY
+
+/* Historical aliases. */
+#define ELFOSABI_LINUX		ELFOSABI_GNU
+#define ELFOSABI_MONTEREY	ELFOSABI_AIX
 
 /* e_type */
 #define	ET_NONE		0	/* No file type */
@@ -224,7 +223,8 @@ typedef struct {
 #define	EM_386		3	/* Intel 80386 */
 #define	EM_68K		4	/* Motorola 68000 */
 #define	EM_88K		5	/* Motorola 88000 */
-#define	EM_486		6	/* Intel 80486 */
+#define EM_486		6	/* Intel 80486 [old] */
+#define EM_IAMCU  6	/* Intel MCU. */
 #define	EM_860		7	/* Intel 80860 */
 #define	EM_MIPS		8	/* MIPS I Architecture */
 #define	EM_S370		9	/* Amdahl UTS on System/370 */
@@ -238,14 +238,15 @@ typedef struct {
 #define	EM_960		19	/* Intel 80960 */
 #define	EM_PPC		20	/* PowerPC */
 #define	EM_PPC64	21	/* 64-bit PowerPC */
-			/* 22-35 - Reserved */
-#define	EM_S390		22	/* System/390 XXX reserved */
+#define EM_S390		22	/* IBM System/390 Processor */
+#define EM_SPU		23	/* IBM SPU/SPC */
+			/* 24-35 - Reserved */
 #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	/* Advanced RISC Machines ARM */
-#define	EM_ALPHA	41	/* DIGITAL Alpha */
+#define	EM_OLD_ALPHA	41	/* DIGITAL Alpha (obsolete) */
 #define	EM_SH		42	/* Hitachi Super-H */
 #define	EM_SPARCV9	43	/* SPARC Version 9 */
 #define	EM_TRICORE	44	/* Siemens Tricore */
@@ -296,7 +297,8 @@ typedef struct {
 #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_OR1K		92	/* OpenRISC 32-bit embedded processor */
+#define EM_OPENRISC	EM_OR1K
 #define	EM_ARC_A5	93	/* ARC Cores Tangent-A5 */
 #define	EM_XTENSA	94	/* Tensilica Xtensa Architecture */
 #define	EM_VIDEOCORE	95	/* Alphamosaic VideoCore processor */
@@ -318,19 +320,96 @@ typedef struct {
 #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 CRX */
+#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 */
-
-#define EM_LATTICEMICO32 138    /* RICS processor for Lattice FPGA architecture */
-
-#define EM_MICROBLAZE   189     /* Xilinx MicroBlaze 32-bit RISC soft processor core */
-
-#define EM_MOXIE  0xFEED
+			/* 121-130 - Reserved */
+#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 */
+#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 */
+#define EM_AARCH64	183	/* AArch64 64-bit ARM microprocessor */
+			/* 184 - Reserved */
+//#define EM_AVR32	185	/* Atmel Corporation 32-bit microprocessor family*/
+#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 - Reserved */
+#define EM_RISCV	243	/* RISC-V */
 
 /* Unofficial machine types follow */
 #define	EM_AVR32	6317	/* used by NetBSD/avr32 */
@@ -352,8 +431,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 */
@@ -370,14 +449,22 @@ typedef struct {
 #define	PT_NOTE		4		/* Auxiliary information */
 #define	PT_SHLIB	5		/* Reserved, unspecified semantics */
 #define	PT_PHDR		6		/* Entry for header table itself */
-#define	PT_NUM		7
+#define PT_TLS		7		/* TLS initialisation image */
+#define	PT_NUM		8
+
+#define PT_LOOS		0x60000000	/* OS-specific range */
 
-#define	PT_LOOS         0x60000000	/* OS-specific range */
-#define	PT_HIOS         0x6fffffff
-#define	PT_LOPROC	0x70000000	/* Processor-specific range */
-#define	PT_HIPROC	0x7fffffff
+/* GNU-specific */
+#define PT_GNU_EH_FRAME 0x6474e550	/* EH frame segment */
+#define PT_GNU_STACK	0x6474e551	/* Indicate executable stack */
+#define PT_GNU_RELRO	0x6474e552	/* Make read-only after relocation */
+
+#define PT_HIOS		0x6fffffff
+#define PT_LOPROC	0x70000000	/* Processor-specific range */
+#define PT_HIPROC	0x7fffffff
 
 #define	PT_MIPS_REGINFO	0x70000000
+#define PT_MIPS_ABIFLAGS 0x70000003
 
 /* p_flags */
 #define	PF_R		0x4	/* Segment is readable */
@@ -407,66 +494,91 @@ typedef struct {
 } Elf32_Shdr;
 
 typedef struct {
-	Elf64_Half	sh_name;	/* section name (.shstrtab index) */
-	Elf64_Half	sh_type;	/* section type */
+	Elf64_Word	sh_name;	/* section name (.shstrtab index) */
+	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;
 
 /* sh_type */
-#define	SHT_NULL	0		/* Section header table entry unused */
-#define	SHT_PROGBITS	1		/* Program information */
-#define	SHT_SYMTAB	2		/* Symbol table */
-#define	SHT_STRTAB	3		/* String table */
-#define	SHT_RELA	4		/* Relocation information w/ addend */
-#define	SHT_HASH	5		/* Symbol hash table */
-#define	SHT_DYNAMIC	6		/* Dynamic linking information */
-#define	SHT_NOTE	7		/* Auxiliary information */
-#define	SHT_NOBITS	8		/* No space allocated in file image */
-#define	SHT_REL		9		/* Relocation information w/o addend */
-#define	SHT_SHLIB	10		/* Reserved, unspecified semantics */
-#define	SHT_DYNSYM	11		/* Symbol table for dynamic linker */
-#define	SHT_INIT_ARRAY	14		/* Initialization function pointers */
-#define	SHT_FINI_ARRAY	15		/* Termination function pointers */
-#define	SHT_PREINIT_ARRAY 16		/* Pre-initialization function ptrs */
-#define	SHT_GROUP	17		/* Section group */
-#define	SHT_SYMTAB_SHNDX 18		/* Section indexes (see SHN_XINDEX) */
-#define	SHT_NUM		19
-
-#define	SHT_LOOS	0x60000000	/* Operating system specific range */
-#define	SHT_SUNW_move	0x6ffffffa
-#define	SHT_SUNW_syminfo 0x6ffffffc
-#define SHT_SUNW_verdef	0x6ffffffd	/* Versions defined by file */
-#define	SHT_GNU_verdef	SHT_SUNW_verdef
-#define SHT_SUNW_verneed 0x6ffffffe	/* Versions needed by file */
-#define	SHT_GNU_verneed	SHT_SUNW_verneed
-#define SHT_SUNW_versym	0x6fffffff	/* Symbol versions */
-#define	SHT_GNU_versym	SHT_SUNW_versym
-#define	SHT_HIOS	0x6fffffff
-#define	SHT_LOPROC	0x70000000	/* Processor-specific range */
-#define	SHT_AMD64_UNWIND 0x70000001	/* unwind information */
-#define	SHT_HIPROC	0x7fffffff
-#define	SHT_LOUSER	0x80000000	/* Application-specific range */
-#define	SHT_HIUSER	0xffffffff
+#define SHT_NULL	      0		/* Section header table entry unused */
+#define SHT_PROGBITS	      1		/* Program information */
+#define SHT_SYMTAB	      2		/* Symbol table */
+#define SHT_STRTAB	      3		/* String table */
+#define SHT_RELA	      4		/* Relocation information w/ addend */
+#define SHT_HASH	      5		/* Symbol hash table */
+#define SHT_DYNAMIC	      6		/* Dynamic linking information */
+#define SHT_NOTE	      7		/* Auxiliary information */
+#define SHT_NOBITS	      8		/* No space allocated in file image */
+#define SHT_REL		      9		/* Relocation information w/o addend */
+#define SHT_SHLIB	     10		/* Reserved, unspecified semantics */
+#define SHT_DYNSYM	     11		/* Symbol table for dynamic linker */
+#define SHT_INIT_ARRAY	     14		/* Initialization function pointers */
+#define SHT_FINI_ARRAY	     15		/* Termination function pointers */
+#define SHT_PREINIT_ARRAY    16		/* Pre-initialization function ptrs */
+#define SHT_GROUP	     17		/* Section group */
+#define SHT_SYMTAB_SHNDX     18		/* Section indexes (see SHN_XINDEX) */
+#define SHT_NUM		     19
+
+#define SHT_LOOS	     0x60000000 /* Operating system specific range */
+#define SHT_GNU_INCREMENTAL_INPUTS 0x6fff4700   /* GNU incremental build data */
+#define	SHT_LOSUNW	     0x6ffffff4
+#define	SHT_SUNW_dof	     0x6ffffff4
+#define	SHT_GNU_ATTRIBUTES   0x6ffffff5	/* GNU object attributes */
+#define	SHT_SUNW_cap	     0x6ffffff5
+#define	SHT_SUNW_SIGNATURE   0x6ffffff6
+#define SHT_GNU_HASH	     0x6ffffff6 /* GNU style symbol hash table */
+#define SHT_GNU_LIBLIST	     0x6ffffff7 /* GNU list of prelink dependencies */
+#define SHT_SUNW_move	     0x6ffffffa
+#define	SHT_SUNW_COMDAT	     0x6ffffffb
+#define SHT_SUNW_syminfo     0x6ffffffc
+#define SHT_SUNW_verdef	     0x6ffffffd /* Versions defined by file */
+#define SHT_GNU_verdef	     SHT_SUNW_verdef
+#define SHT_SUNW_verneed     0x6ffffffe /* Versions needed by file */
+#define SHT_GNU_verneed	     SHT_SUNW_verneed
+#define SHT_SUNW_versym	     0x6fffffff /* Symbol versions */
+#define SHT_GNU_versym	     SHT_SUNW_versym
+#define	SHT_HISUNW	     0x6fffffff
+#define SHT_HIOS	     0x6fffffff
+#define SHT_LOPROC	     0x70000000 /* Processor-specific range */
+#define SHT_AMD64_UNWIND     0x70000001 /* unwind information */
+#define SHT_ARM_EXIDX	     0x70000001	/* exception index table */
+#define SHT_ARM_PREEMPTMAP   0x70000002 /* BPABI DLL dynamic linking 
+					 * pre-emption map */
+#define SHT_ARM_ATTRIBUTES   0x70000003 /* Object file compatibility 
+					 * attributes */
+#define SHT_ARM_DEBUGOVERLAY 0x70000004 /* See DBGOVL for details */
+#define SHT_ARM_OVERLAYSECTION 0x70000005
+#define	SHT_MIPS_REGINFO     0x70000006
+#define	SHT_MIPS_OPTIONS     0x7000000d
+#define	SHT_MIPS_DWARF	     0x7000001e	/* MIPS gcc uses MIPS_DWARF */
+#define	SHT_MIPS_XHASH	     0x7000002b	/* MIPS version of GNU_HASH */
+#define SHT_HIPROC	     0x7fffffff
+#define SHT_LOUSER	     0x80000000 /* Application-specific range */
+#define SHT_HIUSER	     0xffffffff
 
 /* sh_flags */
-#define	SHF_WRITE	0x1		/* Section contains writable data */
-#define	SHF_ALLOC	0x2		/* Section occupies memory */
-#define	SHF_EXECINSTR	0x4		/* Section contains executable insns */
-#define	SHF_MERGE	0x10		/* Section contains data that can be merged */
-#define	SHF_STRINGS	0x20		/* Section contains null-terminated strings */
-#define	SHF_INFO_LINK	0x40		/* Section header's sh_info holds table index */
-#define	SHF_LINK_ORDER	0x80		/* Section has special ordering requirements */
-
-#define	SHF_MASKOS	0x0f000000	/* Operating system specific values */
-#define	SHF_MASKPROC	0xf0000000	/* Processor-specific values */
-
+#define SHF_WRITE	     0x00000001 /* Contains writable data */
+#define SHF_ALLOC	     0x00000002 /* Occupies memory */
+#define SHF_EXECINSTR	     0x00000004 /* Contains executable insns */
+#define SHF_MERGE	     0x00000010 /* Might be merged */
+#define SHF_STRINGS	     0x00000020 /* Contains nul terminated strings */
+#define SHF_INFO_LINK	     0x00000040 /* "sh_info" contains SHT index */
+#define SHF_LINK_ORDER	     0x00000080 /* Preserve order after combining */
+#define SHF_OS_NONCONFORMING 0x00000100 /* OS specific handling required */
+#define SHF_GROUP	     0x00000200 /* Is member of a group */
+#define SHF_TLS		     0x00000400 /* Holds thread-local data */
+#define SHF_MASKOS	     0x0ff00000 /* Operating system specific values */
+#define SHF_MASKPROC	     0xf0000000 /* Processor-specific values */
+#define SHF_ORDERED	     0x40000000 /* Ordering requirement (Solaris) */
+#define SHF_EXCLUDE	     0x80000000 /* Excluded unless unles ref/alloc
+					   (Solaris).*/
 /*
  * Symbol Table
  */
@@ -480,10 +592,10 @@ typedef struct {
 } Elf32_Sym;
 
 typedef struct {
-	Elf64_Half	st_name;	/* Symbol name (.strtab index) */
+	Elf64_Word	st_name;	/* Symbol name (.strtab index) */
 	Elf_Byte	st_info;	/* type / binding attrs */
 	Elf_Byte	st_other;	/* unused */
-	Elf64_Quarter	st_shndx;	/* section index of symbol */
+	Elf64_Half	st_shndx;	/* section index of symbol */
 	Elf64_Addr	st_value;	/* value of symbol */
 	Elf64_Xword	st_size;	/* size of symbol */
 } Elf64_Sym;
@@ -515,6 +627,7 @@ typedef struct {
 #define	STT_NUM			7
 
 #define	STT_LOOS		10	/* Operating system specific range */
+#define STT_GNU_IFUNC		10	/* GNU extension: indirect function */
 #define	STT_HIOS		12
 #define	STT_LOPROC		13	/* Processor-specific range */
 #define	STT_HIPROC		15
@@ -610,8 +723,8 @@ typedef struct {
 	Elf64_Lword	m_value;	/* symbol value */
 	Elf64_Xword	m_info;		/* size + index */
 	Elf64_Xword	m_poffset;	/* symbol offset */
-	Elf64_Half	m_repeat;	/* repeat count */
-	Elf64_Half	m_stride;	/* stride info */
+	Elf64_Word	m_repeat;	/* repeat count */
+	Elf64_Word	m_stride;	/* stride info */
 } Elf64_Move;
 
 #define	ELF64_M_SYM(info)	((info) >> 8)
@@ -686,9 +799,15 @@ typedef struct {
 #define	DT_FINI_ARRAY	26	/* Size, in bytes, of DT_INIT_ARRAY array */
 #define	DT_INIT_ARRAYSZ	27	/* Address of termination function array */
 #define	DT_FINI_ARRAYSZ	28	/* Size, in bytes, of DT_FINI_ARRAY array*/
-#define	DT_NUM		29
+#define DT_RUNPATH	29	/* overrides DT_RPATH */
+#define DT_FLAGS	30	/* Encodes ORIGIN, SYMBOLIC, TEXTREL, BIND_NOW, STATIC_TLS */
+#define DT_ENCODING	31	/* ??? */
+#define DT_PREINIT_ARRAY 32	/* Address of pre-init function array */
+#define DT_PREINIT_ARRAYSZ 33	/* Size, in bytes, of DT_PREINIT_ARRAY array */
+#define DT_NUM		34
 
 #define	DT_LOOS		0x60000000	/* Operating system specific range */
+#define DT_GNU_HASH	0x6ffffef5	/* GNU-style hash table */
 #define DT_VERSYM	0x6ffffff0	/* Symbol versions */
 #define	DT_FLAGS_1	0x6ffffffb	/* ELF dynamic flags */
 #define DT_VERDEF	0x6ffffffc	/* Versions defined by file */
@@ -697,10 +816,44 @@ typedef struct {
 #define DT_VERNEEDNUM	0x6fffffff	/* Number of versions needed by file */
 #define	DT_HIOS		0x6fffffff
 #define	DT_LOPROC	0x70000000	/* Processor-specific range */
+#define DT_MIPS_XHASH	0x70000036	/* MIPS version of GNU_HASH */
 #define	DT_HIPROC	0x7fffffff
 
-/* Flag values for DT_FLAGS_1 (incomplete) */
-#define	DF_1_INITFIRST	0x00000020	/* Object's init/fini take priority */
+/* Flag values for DT_FLAGS */
+#define DF_ORIGIN	0x00000001	/* uses $ORIGIN */
+#define DF_SYMBOLIC	0x00000002	/* */
+#define DF_TEXTREL	0x00000004	/* */
+#define DF_BIND_NOW	0x00000008	/* */
+#define DF_STATIC_TLS	0x00000010	/* */
+
+/* Flag values for DT_FLAGS_1 */
+#define	DF_1_NOW	0x00000001	/* Same as DF_BIND_NOW */
+#define	DF_1_GLOBAL	0x00000002	/* Unused */
+#define	DF_1_GROUP	0x00000004	/* Is member of group */
+#define	DF_1_NODELETE	0x00000008	/* Cannot be deleted from process */
+#define	DF_1_LOADFLTR	0x00000010	/* Immediate loading of filters */
+#define	DF_1_INITFIRST	0x00000020	/* init/fini takes priority */
+#define	DF_1_NOOPEN	0x00000040	/* Do not allow loading on dlopen() */
+#define	DF_1_ORIGIN	0x00000080 	/* Require $ORIGIN processing */
+#define	DF_1_DIRECT	0x00000100	/* Enable direct bindings */
+#define	DF_1_INTERPOSE 	0x00000400	/* Is an interposer */
+#define	DF_1_NODEFLIB	0x00000800 	/* Ignore default library search path */
+#define	DF_1_NODUMP	0x00001000 	/* Cannot be dumped with dldump(3C) */
+#define	DF_1_CONFALT	0x00002000 	/* Configuration alternative */
+#define	DF_1_ENDFILTEE	0x00004000	/* Filtee ends filter's search */
+#define	DF_1_DISPRELDNE	0x00008000	/* Did displacement relocation */
+#define	DF_1_DISPRELPND 0x00010000	/* Pending displacement relocation */
+#define	DF_1_NODIRECT	0x00020000 	/* Has non-direct bindings */
+#define	DF_1_IGNMULDEF	0x00040000	/* Used internally */
+#define	DF_1_NOKSYMS	0x00080000	/* Used internally */
+#define	DF_1_NOHDR	0x00100000	/* Used internally */
+#define	DF_1_EDITED	0x00200000	/* Has been modified since build */
+#define	DF_1_NORELOC	0x00400000 	/* Used internally */
+#define	DF_1_SYMINTPOSE 0x00800000 	/* Has individual symbol interposers */
+#define	DF_1_GLOBAUDIT	0x01000000	/* Require global auditing */
+#define	DF_1_SINGLETON	0x02000000	/* Has singleton symbols */
+#define	DF_1_STUB	0x04000000	/* Stub */
+#define	DF_1_PIE	0x08000000	/* Position Independent Executable */
 
 /*
  * Auxiliary Vectors
@@ -711,8 +864,8 @@ typedef struct {
 } Aux32Info;
 
 typedef struct {
-	Elf64_Half	a_type;				/* 32-bit id */
-	Elf64_Xword	a_v;				/* 64-bit id */
+	Elf64_Word	a_type;		/* 32-bit id */
+	Elf64_Xword	a_v;		/* 64-bit id */
 } Aux64Info;
 
 /* a_type */
@@ -729,6 +882,7 @@ typedef struct {
 #define	AT_DCACHEBSIZE	10	/* Data cache block size */
 #define	AT_ICACHEBSIZE	11	/* Instruction cache block size */
 #define	AT_UCACHEBSIZE	12	/* Unified cache block size */
+#define AT_STACKBASE	13	/* Base address of the main thread */
 
 	/* Vendor specific */
 #define	AT_MIPS_NOTELF	10	/* XXX a_val != 0 -> MIPS XCOFF executable */
@@ -755,6 +909,16 @@ typedef struct {
 	/* Executable's fully resolved name */
 #define	AT_SUN_EXECNAME	2014
 
+/*
+ * The header for GNU-style hash sections.
+ */
+typedef struct {
+	uint32_t	gh_nbuckets;	/* Number of hash buckets. */
+	uint32_t	gh_symndx;	/* First visible symbol in .dynsym. */
+	uint32_t	gh_maskwords;	/* #maskwords used in bloom filter. */
+	uint32_t	gh_shift2;	/* Bloom filter shift count. */
+} Elf_GNU_Hash_Header;
+
 /*
  * Note Headers
  */
@@ -765,42 +929,155 @@ 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;
 
-#define	ELF_NOTE_TYPE_ABI_TAG		1
+#define ELF_NOTE_GNU_NAMESZ		4
+#define ELF_NOTE_GNU_NAME		"GNU\0"
 
+/*
+ * GNU-specific note type: ABI tag
+ * name: GNU\0
+ * namesz: 4
+ * desc:
+ *	word[0]: OS tag
+ *	word[1]: major version
+ *	word[2]: minor version
+ *	word[3]: teeny version
+ * descsz: 16
+ */
 /* GNU-specific note name and description sizes */
-#define	ELF_NOTE_ABI_NAMESZ		4
-#define	ELF_NOTE_ABI_DESCSZ		16
-/* GNU-specific note name */
-#define	ELF_NOTE_ABI_NAME		"GNU\0"
-
+#define ELF_NOTE_TYPE_ABI_TAG		1
+#define ELF_NOTE_ABI_NAME		ELF_NOTE_GNU_NAME
+#define ELF_NOTE_ABI_NAMESZ		ELF_NOTE_GNU_NAMESZ
+#define ELF_NOTE_ABI_DESCSZ		16
 /* GNU-specific OS/version value stuff */
-#define	ELF_NOTE_ABI_OS_LINUX		0
-#define	ELF_NOTE_ABI_OS_HURD		1
-#define	ELF_NOTE_ABI_OS_SOLARIS		2
+#define ELF_NOTE_ABI_OS_LINUX		0
+#define ELF_NOTE_ABI_OS_HURD		1
+#define ELF_NOTE_ABI_OS_SOLARIS		2
+#define ELF_NOTE_ABI_OS_KFREEBSD	3
+#define ELF_NOTE_ABI_OS_KNETBSD		4
+
+/* Old gcc style, under the ABI tag */
+#define ELF_NOTE_OGCC_NAMESZ		8
+#define ELF_NOTE_OGCC_NAME		"01.01\0\0\0\0"
+#define ELF_NOTE_OGCC_DESCSZ		0
 
-/* NetBSD-specific note type: Emulation name.  desc is emul name string. */
-#define	ELF_NOTE_TYPE_NETBSD_TAG	1
+/*
+ * GNU-specific note type: Hardware capabilities
+ * name: GNU\0
+ * namesz: 4
+ * desc:
+ *	word[0]: Number of entries
+ *	word[1]: Bitmask of enabled entries
+ *	Followed by a byte id, and a NUL terminated string per entry
+ * descsz: variable
+ */
+#define ELF_NOTE_TYPE_GNU_HWCAP		2
+
+/*
+ * GNU-specific note type: Build ID generated by ld
+ * name: GNU\0
+ * desc:
+ *	word[0..4] SHA1 [default] 
+ * or
+ *	word[0..3] md5 or uuid
+ * descsz: 16 or 20
+ */
+#define ELF_NOTE_TYPE_GNU_BUILD_ID	3
+
+/* SuSE-specific note type: ABI
+ * name: SuSE\0
+ * namesz: 5
+ * desc:
+ *	half[0] = MMmm
+ *
+ *	M = product major version
+ *	m = product minor version
+ * descsz: 2
+ */
+#define ELF_NOTE_TYPE_SUSE_TAG	1
+/* SuSE-specific note name and description sizes */
+#define ELF_NOTE_SUSE_NAMESZ	5
+#define ELF_NOTE_SUSE_DESCSZ	2
+/* SuSE-specific note name */
+#define ELF_NOTE_SUSE_NAME		"SuSE\0"
+
+/* SuSE-specific note type: version
+ * name: SuSE\0\0\0\0
+ * namesz: 8
+ * desc: 
+ *	word[0] = VVTTMMmm
+ *
+ *	V = version of following data
+ *	T = product type: [box, sles, nld, whatever]
+ *	M = product major version
+ *	m = product minor version
+ * descsz: 8
+ */
+#define ELF_NOTE_TYPE_SUSE_VERSION_TAG	0x45537553	/* SuSE in LE */
+/* SuSE-specific note name and description sizes */
+#define ELF_NOTE_SUSE_VERSION_NAMESZ	8
+#define ELF_NOTE_SUSE_VERSION_DESCSZ	8
+/* SuSE-specific note name */
+#define ELF_NOTE_SUSE_VERSION_NAME		"SuSE\0\0\0\0"
+
+/* Go-specific note type: buildid
+ * name: Go\0\0
+ * namesz: 4
+ * desc: 
+ *	words[10]
+ * descsz: 40
+ */
+#define ELF_NOTE_TYPE_GO_BUILDID_TAG	4
+#define ELF_NOTE_GO_BUILDID_NAMESZ	4
+#define ELF_NOTE_GO_BUILDID_DESCSZ	40
+#define ELF_NOTE_GO_BUILDID_NAME	"Go\0\0"
+
+/* NetBSD-specific note type: NetBSD ABI version.
+ * name: NetBSD\0\0
+ * namesz: 8
+ * desc: 
+ *	word[0]: MMmmrrpp00
+ *
+ *	M = major version
+ *	m = minor version
+ *	r = release ["",A-Z,Z[A-Z] but numeric]
+ *	p = patchlevel
+ * descsz: 4
+ */
+#define ELF_NOTE_TYPE_NETBSD_TAG	1
 /* NetBSD-specific note name and description sizes */
 #define	ELF_NOTE_NETBSD_NAMESZ		7
 #define	ELF_NOTE_NETBSD_DESCSZ		4
 /* NetBSD-specific note name */
-#define	ELF_NOTE_NETBSD_NAME		"NetBSD\0\0"
-
-/* NetBSD-specific note type: Checksum.  There should be 1 NOTE per PT_LOAD
-   section.  desc is a tuple of <phnum>(16),<chk-type>(16),<chk-value>. */
-#define	ELF_NOTE_TYPE_CHECKSUM_TAG	2
-#define	ELF_NOTE_CHECKSUM_CRC32		1
-#define	ELF_NOTE_CHECKSUM_MD5		2
-#define	ELF_NOTE_CHECKSUM_SHA1		3
-#define	ELF_NOTE_CHECKSUM_SHA256	4
-
-/* NetBSD-specific note type: PaX.  There should be 1 NOTE per executable.
-   section.  desc is a 32 bit bitmask */
+#define ELF_NOTE_NETBSD_NAME		"NetBSD\0\0"
+
+/* NetBSD-specific note type: Emulation (obsolete; last used early 2000)
+ * name: NetBSD\0\0
+ * namesz: 8
+ * desc:
+ *	"netbsd\0"
+ *	
+ * descsz: 8
+ */
+#define ELF_NOTE_TYPE_NETBSD_EMUL_TAG	2
+#define ELF_NOTE_NETBSD_EMUL_NAMESZ	7
+#define ELF_NOTE_NETBSD_EMUL_DESCSZ	7
+/* NetBSD-specific note name */
+#define ELF_NOTE_NETBSD_EMUL_NAME	"NetBSD\0\0"
+
+/*
+ * NetBSD-specific note type: PaX.
+ * There should be 1 NOTE per executable.
+ * name: PaX\0
+ * namesz: 4
+ * desc:
+ *	word[0]: capability bitmask
+ * descsz: 4
+ */
 #define ELF_NOTE_TYPE_PAX_TAG		3
 #define	ELF_NOTE_PAX_MPROTECT		0x01	/* Force enable Mprotect */
 #define	ELF_NOTE_PAX_NOMPROTECT		0x02	/* Force disable Mprotect */
@@ -825,6 +1102,8 @@ typedef struct {
  *
  *	ELF_NOTE_NETBSD_CORE_PROCINFO
  *		Note is a "netbsd_elfcore_procinfo" structure.
+ *	ELF_NOTE_NETBSD_CORE_AUXV
+ *		Note is an array of AuxInfo structures.
  *
  * We also use ptrace(2) request numbers (the ones that exist in
  * machine-dependent space) to identify register info notes.  The
@@ -838,6 +1117,7 @@ typedef struct {
 #define	ELF_NOTE_NETBSD_CORE_NAME	"NetBSD-CORE"
 
 #define	ELF_NOTE_NETBSD_CORE_PROCINFO	1
+#define ELF_NOTE_NETBSD_CORE_AUXV	2
 
 #define	NETBSD_ELFCORE_PROCINFO_VERSION	1
 
@@ -849,8 +1129,8 @@ struct netbsd_elfcore_procinfo {
 	uint32_t	cpi_sigcode;	/* signal code */
 	uint32_t	cpi_sigpend[4];	/* pending signals */
 	uint32_t	cpi_sigmask[4];	/* blocked signals */
-	uint32_t	cpi_sigignore[4];/* blocked signals */
-	uint32_t	cpi_sigcatch[4];/* blocked signals */
+	uint32_t	cpi_sigignore[4];/* ignored signals */
+	uint32_t	cpi_sigcatch[4];/* caught signals */
 	int32_t		cpi_pid;	/* process ID */
 	int32_t		cpi_ppid;	/* parent process ID */
 	int32_t		cpi_pgrp;	/* process group ID */
@@ -867,46 +1147,108 @@ struct netbsd_elfcore_procinfo {
 	int32_t		cpi_siglwp;	/* LWP target of killing signal */
 };
 
+/*
+ * NetBSD-specific note type: MACHINE_ARCH.
+ * There should be 1 NOTE per executable.
+ * name:	NetBSD\0
+ * namesz:	7
+ * desc:	string
+ * descsz:	variable
+ */
+#define ELF_NOTE_TYPE_MARCH_TAG		5
+/* NetBSD-specific note name and description sizes */
+#define ELF_NOTE_MARCH_NAMESZ		ELF_NOTE_NETBSD_NAMESZ
+/* NetBSD-specific note name */
+#define ELF_NOTE_MARCH_NAME		ELF_NOTE_NETBSD_NAME
+
+/*
+ * NetBSD-specific note type: MCMODEL
+ * There should be 1 NOTE per executable.
+ * name:	NetBSD\0
+ * namesz:	7
+ * code model:	string
+ */
+
+#define ELF_NOTE_TYPE_MCMODEL_TAG	6
+/* NetBSD-specific note name and description sizes */
+#define ELF_NOTE_MCMODEL_NAMESZ		ELF_NOTE_NETBSD_NAMESZ
+/* NetBSD-specific note name */
+#define ELF_NOTE_MCMODEL_NAME		ELF_NOTE_NETBSD_NAME
+
+
+#if !defined(ELFSIZE)
+# if defined(_RUMPKERNEL) || !defined(_KERNEL)
+#  define ELFSIZE ARCH_ELFSIZE
+# else
+#  define ELFSIZE KERN_ELFSIZE
+# endif
+#endif
+
+#if defined(ELFSIZE)
+#define CONCAT(x,y)	__CONCAT(x,y)
+#define ELFNAME(x)	CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x)))
+#define ELFNAME2(x,y)	CONCAT(x,CONCAT(_elf,CONCAT(ELFSIZE,CONCAT(_,y))))
+#define ELFNAMEEND(x)	CONCAT(x,CONCAT(_elf,ELFSIZE))
+#define ELFDEFNNAME(x)	CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x)))
+#define	ElfW(x)		CONCAT(Elf,CONCAT(ELFSIZE,CONCAT(_,x)))
+#endif
+
 #if defined(ELFSIZE) && (ELFSIZE == 32)
-#define	Elf_Ehdr	Elf32_Ehdr
-#define	Elf_Phdr	Elf32_Phdr
-#define	Elf_Shdr	Elf32_Shdr
-#define	Elf_Sym		Elf32_Sym
-#define	Elf_Rel		Elf32_Rel
-#define	Elf_Rela	Elf32_Rela
-#define	Elf_Dyn		Elf32_Dyn
-#define	Elf_Word	Elf32_Word
-#define	Elf_Sword	Elf32_Sword
-#define	Elf_Addr	Elf32_Addr
-#define	Elf_Off		Elf32_Off
-#define	Elf_SOff	Elf32_SOff
-#define	Elf_Nhdr	Elf32_Nhdr
-
-#define	ELF_R_SYM	ELF32_R_SYM
-#define	ELF_R_TYPE	ELF32_R_TYPE
-#define	ELFCLASS	ELFCLASS32
-
-#define	AuxInfo		Aux32Info
+#define Elf_Ehdr	Elf32_Ehdr
+#define Elf_Phdr	Elf32_Phdr
+#define Elf_Shdr	Elf32_Shdr
+#define Elf_Sym		Elf32_Sym
+#define Elf_Rel		Elf32_Rel
+#define Elf_Rela	Elf32_Rela
+#define Elf_Dyn		Elf32_Dyn
+#define Elf_Word	Elf32_Word
+#define Elf_Sword	Elf32_Sword
+#define Elf_Half	Elf32_Half
+#define Elf_Addr	Elf32_Addr
+#define Elf_Off		Elf32_Off
+#define Elf_SOff	Elf32_SOff
+#define Elf_Nhdr	Elf32_Nhdr
+#define Elf_Verdef	Elf32_Verdef
+#define Elf_Verdaux	Elf32_Verdaux
+#define Elf_Verneed	Elf32_Verneed
+#define Elf_Vernaux	Elf32_Vernaux
+#define Elf_Versym	Elf32_Versym
+
+#define ELF_R_SYM	ELF32_R_SYM
+#define ELF_R_TYPE	ELF32_R_TYPE
+#define ELFCLASS	ELFCLASS32
+
+#define AuxInfo		Aux32Info
 #elif defined(ELFSIZE) && (ELFSIZE == 64)
-#define	Elf_Ehdr	Elf64_Ehdr
-#define	Elf_Phdr	Elf64_Phdr
-#define	Elf_Shdr	Elf64_Shdr
-#define	Elf_Sym		Elf64_Sym
-#define	Elf_Rel		Elf64_Rel
-#define	Elf_Rela	Elf64_Rela
-#define	Elf_Dyn		Elf64_Dyn
-#define	Elf_Word	Elf64_Word
-#define	Elf_Sword	Elf64_Sword
-#define	Elf_Addr	Elf64_Addr
-#define	Elf_Off		Elf64_Off
-#define	Elf_SOff	Elf64_SOff
-#define	Elf_Nhdr	Elf64_Nhdr
-
-#define	ELF_R_SYM	ELF64_R_SYM
-#define	ELF_R_TYPE	ELF64_R_TYPE
-#define	ELFCLASS	ELFCLASS64
-
-#define	AuxInfo		Aux64Info
+#define Elf_Ehdr	Elf64_Ehdr
+#define Elf_Phdr	Elf64_Phdr
+#define Elf_Shdr	Elf64_Shdr
+#define Elf_Sym		Elf64_Sym
+#define Elf_Rel		Elf64_Rel
+#define Elf_Rela	Elf64_Rela
+#define Elf_Dyn		Elf64_Dyn
+#define Elf_Word	Elf64_Word
+#define Elf_Sword	Elf64_Sword
+#define Elf_Half	Elf64_Half
+#define Elf_Addr	Elf64_Addr
+#define Elf_Off		Elf64_Off
+#define Elf_SOff	Elf64_SOff
+#define Elf_Nhdr	Elf64_Nhdr
+#define Elf_Verdef	Elf64_Verdef
+#define Elf_Verdaux	Elf64_Verdaux
+#define Elf_Verneed	Elf64_Verneed
+#define Elf_Vernaux	Elf64_Vernaux
+#define Elf_Versym	Elf64_Versym
+
+#define ELF_R_SYM	ELF64_R_SYM
+#define ELF_R_TYPE	ELF64_R_TYPE
+#define ELFCLASS	ELFCLASS64
+
+#define AuxInfo		Aux64Info
+#endif
+
+#ifndef Elf_Symindx
+#define Elf_Symindx	uint32_t
 #endif
 
 #define	ELF32_ST_BIND(info)		ELF_ST_BIND(info)
@@ -925,8 +1267,8 @@ typedef struct {
 } Elf32_Syminfo;
 
 typedef struct {
-	Elf64_Half	si_boundto;	/* direct bindings - symbol bound to */
-	Elf64_Half	si_flags;	/* per symbol flags */
+	Elf64_Word	si_boundto;	/* direct bindings - symbol bound to */
+	Elf64_Word	si_flags;	/* per symbol flags */
 } Elf64_Syminfo;
 
 #define	SYMINFO_FLG_DIRECT	0x0001	/* symbol ref has direct association
@@ -956,7 +1298,12 @@ typedef struct {
  * These constants are used for Elf32_Verdef struct's version number.
  */
 #define VER_DEF_NONE		0
-#define	VER_DEF_CURRENT		1
+#define VER_DEF_CURRENT		1
+
+/*
+ * These constants are used for Elf32_Verdef struct's vd_ndx.
+ */
+#define VER_DEF_IDX(x)		VER_NDX(x)
 
 /*
  * These constants are used for Elf32_Verdef struct's vd_flags.
@@ -967,8 +1314,9 @@ typedef struct {
 /*
  * These are used in an Elf32_Versym field.
  */
-#define	VER_NDX_LOCAL		0
-#define	VER_NDX_GLOBAL		1
+#define VER_NDX_LOCAL		0
+#define VER_NDX_GLOBAL		1
+#define VER_NDX_GIVEN		2
 
 /*
  * These constants are used for Elf32_Verneed struct's version number.
@@ -977,10 +1325,20 @@ typedef struct {
 #define	VER_NEED_CURRENT	1
 
 /*
- * GNU Extension hidding symb
+ * These constants are used for Elf32_Vernaux struct's vna_other.
  */
-#define	VERSYM_HIDDEN		0x8000
-#define	VERSYM_VERSION		0x7fff
+#define VER_NEED_HIDDEN		VER_NDX_HIDDEN
+#define VER_NEED_IDX(x)		VER_NDX(x)
+
+/* index */
+#define VER_NDX_HIDDEN		0x8000
+#define VER_NDX(x)		((x) & ~VER_NDX_HIDDEN)
+
+/*
+ * GNU Extension hidding symbol
+ */
+#define VERSYM_HIDDEN		0x8000
+#define VERSYM_VERSION		0x7fff
 
 #define	ELF_VER_CHR		'@'
 
@@ -1030,7 +1388,14 @@ typedef	Elf32_Versym	Elf64_Versym;
 
 #ifdef _KERNEL
 
-#define ELF_AUX_ENTRIES	14	/* Max size of aux array passed to loader */
+/*
+ * Arbitrary limits to avoid DoS for excessive memory allocation.
+ */
+#define ELF_MAXPHNUM	128
+#define ELF_MAXSHNUM	32768
+#define ELF_MAXNOTESIZE	1024
+
+#define ELF_AUX_ENTRIES 15	/* Max size of aux array passed to loader */
 #define ELF32_NO_ADDR	(~(Elf32_Addr)0) /* Indicates addr. not yet filled in */
 #define ELF32_LINK_ADDR	((Elf32_Addr)-2) /* advises to use link address */
 #define ELF64_NO_ADDR	(~(Elf64_Addr)0) /* Indicates addr. not yet filled in */
@@ -1060,11 +1425,11 @@ typedef	Elf32_Versym	Elf64_Versym;
 
 #if defined(ELFSIZE)
 struct elf_args {
-        Elf_Addr  arg_entry;      /* program entry point */
-        Elf_Addr  arg_interp;     /* Interpreter load address */
-        Elf_Addr  arg_phaddr;     /* program header address */
-        Elf_Addr  arg_phentsize;  /* Size of program header */
-        Elf_Addr  arg_phnum;      /* Number of program headers */
+	Elf_Addr	arg_entry;	/* program entry point */
+	Elf_Addr	arg_interp;	/* Interpreter load address */
+	Elf_Addr	arg_phaddr;	/* program header address */
+	Elf_Addr	arg_phentsize;	/* Size of program header */
+	Elf_Addr	arg_phnum;	/* Number of program headers */
 };
 #endif
 
@@ -1072,30 +1437,41 @@ struct elf_args {
 #include "opt_execfmt.h"
 #endif
 
+struct ps_strings;
+struct coredump_iostate;
+struct note_state;
+struct exec_package;
+
 #ifdef EXEC_ELF32
 int	exec_elf32_makecmds(struct lwp *, struct exec_package *);
+int	elf32_populate_auxv(struct lwp *, struct exec_package *, char **);
 int	elf32_copyargs(struct lwp *, struct exec_package *,
     	    struct ps_strings *, char **, void *);
 
-int	coredump_elf32(struct lwp *, void *);
-int	coredump_writenote_elf32(struct proc *, void *, Elf32_Nhdr *,
-	    const char *, void *);
-
-int	elf32_check_header(Elf32_Ehdr *, int);
+int	elf32_check_header(Elf32_Ehdr *);
 #endif
 
+int	real_coredump_elf32(struct lwp *, struct coredump_iostate *);
+int	coredump_elf32(struct lwp *, struct coredump_iostate *);
+void	coredump_savenote_elf32(struct note_state *, unsigned int,
+	    const char *, void *, size_t);
+
+
 #ifdef EXEC_ELF64
 int	exec_elf64_makecmds(struct lwp *, struct exec_package *);
+int	elf64_populate_auxv(struct lwp *, struct exec_package *, char **);
 int	elf64_copyargs(struct lwp *, struct exec_package *,
 	    struct ps_strings *, char **, void *);
 
-int	coredump_elf64(struct lwp *, void *);
-int	coredump_writenote_elf64(struct proc *, void *, Elf64_Nhdr *,
-	    const char *, void *);
-
-int	elf64_check_header(Elf64_Ehdr *, int);
+int	elf64_check_header(Elf64_Ehdr *);
 #endif
 
+int	real_coredump_elf64(struct lwp *, struct coredump_iostate *);
+int	coredump_elf64(struct lwp *, struct coredump_iostate *);
+void	coredump_savenote_elf64(struct note_state *, unsigned int,
+	    const char *, void *, size_t);
+
+
 #endif /* _KERNEL */
 
 #endif /* !_SYS_EXEC_ELF_H_ */
-- 
2.30.2



More information about the devel mailing list