[Forensics-changes] [yara] 217/415: Implement our own version of elf.h to remove GPLed code

Hilko Bengen bengen at moszumanska.debian.org
Thu Apr 3 05:43:07 UTC 2014


This is an automated email from the git hooks/post-receive script.

bengen pushed a commit to branch debian
in repository yara.

commit d0106b5ce5398619e128c8a3a8c1243b170416b0
Author: Victor M. Alvarez <plusvic at gmail.com>
Date:   Mon Nov 11 17:56:07 2013 +0000

    Implement our own version of elf.h to remove GPLed code
---
 libyara/elf.h      | 1746 ++++++----------------------------------------------
 libyara/exefiles.c |  110 ++--
 2 files changed, 235 insertions(+), 1621 deletions(-)

diff --git a/libyara/elf.h b/libyara/elf.h
index f21d9c4..0fd8c3f 100644
--- a/libyara/elf.h
+++ b/libyara/elf.h
@@ -1,1591 +1,203 @@
-/* This file defines standard ELF types, structures, and macros.
-   Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ian Lance Taylor <ian at cygnus.com>.
+/*
+Copyright (c) 2013. Victor M. Alvarez [plusvic at gmail.com].
 
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
 
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
+   http://www.apache.org/licenses/LICENSE-2.0
 
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
 
 #ifndef _ELF_H
-#define	_ELF_H 1
-
-/* Standard ELF types.  */
+#define _ELF_H
 
 #ifdef _MSC_VER
-
 typedef __int16 int16_t;
 typedef unsigned __int16 uint16_t;
 typedef __int32 int32_t;
 typedef unsigned __int32 uint32_t;
 typedef __int64 int64_t;
 typedef unsigned __int64 uint64_t;
-
 #else
 #include <stdint.h>
 #endif
 
-/* Type for a 16-bit quantity.  */
-typedef uint16_t Elf32_Half;
-typedef uint16_t Elf64_Half;
-
-/* Types for signed and unsigned 32-bit quantities.  */
-typedef uint32_t Elf32_Word;
-typedef	int32_t  Elf32_Sword;
-typedef uint32_t Elf64_Word;
-typedef	int32_t  Elf64_Sword;
-
-/* Types for signed and unsigned 64-bit quantities.  */
-typedef uint64_t Elf32_Xword;
-typedef	int64_t  Elf32_Sxword;
-typedef uint64_t Elf64_Xword;
-typedef	int64_t  Elf64_Sxword;
-
-/* Type of addresses.  */
-typedef uint32_t Elf32_Addr;
-typedef uint64_t Elf64_Addr;
-
-/* Type of file offsets.  */
-typedef uint32_t Elf32_Off;
-typedef uint64_t Elf64_Off;
-
-/* Type for section indices, which are 16-bit quantities.  */
-typedef uint16_t Elf32_Section;
-typedef uint16_t Elf64_Section;
-
-/* Type of symbol indices.  */
-typedef uint32_t Elf32_Symndx;
-typedef uint64_t Elf64_Symndx;
-
-
-/* The ELF file header.  This appears at the start of every ELF file.  */
-
-#define EI_NIDENT (16)
-
-typedef struct
-{
-  unsigned char	e_ident[EI_NIDENT];	/* Magic number and other info */
-  Elf32_Half	e_type;			/* Object file type */
-  Elf32_Half	e_machine;		/* Architecture */
-  Elf32_Word	e_version;		/* Object file version */
-  Elf32_Addr	e_entry;		/* Entry point virtual address */
-  Elf32_Off	e_phoff;		/* Program header table file offset */
-  Elf32_Off	e_shoff;		/* Section header table file offset */
-  Elf32_Word	e_flags;		/* Processor-specific flags */
-  Elf32_Half	e_ehsize;		/* ELF header size in bytes */
-  Elf32_Half	e_phentsize;		/* Program header table entry size */
-  Elf32_Half	e_phnum;		/* Program header table entry count */
-  Elf32_Half	e_shentsize;		/* Section header table entry size */
-  Elf32_Half	e_shnum;		/* Section header table entry count */
-  Elf32_Half	e_shstrndx;		/* Section header string table index */
-} Elf32_Ehdr;
-
-typedef struct
-{
-  unsigned char	e_ident[EI_NIDENT];	/* Magic number and other info */
-  Elf64_Half	e_type;			/* Object file type */
-  Elf64_Half	e_machine;		/* Architecture */
-  Elf64_Word	e_version;		/* Object file version */
-  Elf64_Addr	e_entry;		/* Entry point virtual address */
-  Elf64_Off	e_phoff;		/* Program header table file offset */
-  Elf64_Off	e_shoff;		/* Section header table file offset */
-  Elf64_Word	e_flags;		/* Processor-specific flags */
-  Elf64_Half	e_ehsize;		/* ELF header size in bytes */
-  Elf64_Half	e_phentsize;		/* Program header table entry size */
-  Elf64_Half	e_phnum;		/* Program header table entry count */
-  Elf64_Half	e_shentsize;		/* Section header table entry size */
-  Elf64_Half	e_shnum;		/* Section header table entry count */
-  Elf64_Half	e_shstrndx;		/* Section header string table index */
-} Elf64_Ehdr;
-
-/* Fields in the e_ident array.  The EI_* macros are indices into the
-   array.  The macros under each EI_* macro are the values the byte
-   may have.  */
-
-#define EI_MAG0		0		/* File identification byte 0 index */
-#define ELFMAG0		0x7f		/* Magic number byte 0 */
-
-#define EI_MAG1		1		/* File identification byte 1 index */
-#define ELFMAG1		'E'		/* Magic number byte 1 */
-
-#define EI_MAG2		2		/* File identification byte 2 index */
-#define ELFMAG2		'L'		/* Magic number byte 2 */
-
-#define EI_MAG3		3		/* File identification byte 3 index */
-#define ELFMAG3		'F'		/* Magic number byte 3 */
-
-/* Conglomeration of the identification bytes, for easy testing as a word.  */
-#define	ELFMAG		"\177ELF"
-#define	SELFMAG		4
-
-#define EI_CLASS	4		/* File class byte index */
-#define ELFCLASSNONE	0		/* Invalid class */
-#define ELFCLASS32	1		/* 32-bit objects */
-#define ELFCLASS64	2		/* 64-bit objects */
-#define ELFCLASSNUM	3
-
-#define EI_DATA		5		/* Data encoding byte index */
-#define ELFDATANONE	0		/* Invalid data encoding */
-#define ELFDATA2LSB	1		/* 2's complement, little endian */
-#define ELFDATA2MSB	2		/* 2's complement, big endian */
-#define ELFDATANUM	3
-
-#define EI_VERSION	6		/* File version byte index */
-					/* Value must be EV_CURRENT */
-
-#define EI_OSABI	7		/* OS ABI identification */
-#define ELFOSABI_SYSV		0	/* UNIX System V ABI */
-#define ELFOSABI_HPUX		1	/* HP-UX */
-#define ELFOSABI_ARM		97	/* ARM */
-#define ELFOSABI_STANDALONE	255	/* Standalone (embedded) application */
-
-#define EI_ABIVERSION	8		/* ABI version */
-
-#define EI_PAD		9		/* Byte index of padding bytes */
-
-/* Legal values for e_type (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 defined types */
-#define ET_LOPROC	0xff00		/* Processor-specific */
-#define ET_HIPROC	0xffff		/* Processor-specific */
-
-/* Legal values for e_machine (architecture).  */
-
-#define EM_NONE		 0		/* No machine */
-#define EM_M32		 1		/* AT&T WE 32100 */
-#define EM_SPARC	 2		/* SUN SPARC */
-#define EM_386		 3		/* Intel 80386 */
-#define EM_68K		 4		/* Motorola m68k family */
-#define EM_88K		 5		/* Motorola m88k family */
-#define EM_486		 6		/* Intel 80486 */
-#define EM_860		 7		/* Intel 80860 */
-#define EM_MIPS		 8		/* MIPS R3000 big-endian */
-#define EM_S370		 9		/* Amdahl */
-#define EM_MIPS_RS4_BE	10		/* MIPS R4000 big-endian */
-#define EM_RS6000	11		/* RS6000 */
-
-#define EM_PARISC	15		/* HPPA */
-#define EM_nCUBE	16		/* nCUBE */
-#define EM_VPP500	17		/* Fujitsu VPP500 */
-#define EM_SPARC32PLUS	18		/* Sun's "v8plus" */
-#define EM_960		19		/* Intel 80960 */
-#define EM_PPC		20		/* PowerPC */
-
-#define EM_V800		36		/* NEC V800 series */
-#define EM_FR20		37		/* Fujitsu FR20 */
-#define EM_RH32		38		/* TRW RH32 */
-#define EM_MMA		39		/* Fujitsu MMA */
-#define EM_ARM		40		/* ARM */
-#define EM_FAKE_ALPHA	41		/* Digital Alpha */
-#define EM_SH		42		/* Hitachi SH */
-#define EM_SPARCV9	43		/* SPARC v9 64-bit */
-#define EM_TRICORE	44		/* Siemens Tricore */
-#define EM_ARC		45		/* Argonaut RISC Core */
-#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 Merced */
-#define EM_MIPS_X	51		/* Stanford MIPS-X */
-#define EM_COLDFIRE	52		/* Motorola Coldfire */
-#define EM_68HC12	53		/* Motorola M68HC12 */
-#define EM_NUM		54
-
-/* If it is necessary to assign new unofficial EM_* values, please
-   pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
-   chances of collision with official or non-GNU unofficial values.  */
-
-#define EM_ALPHA	0x9026
-
-/* Legal values for e_version (version).  */
+// 32-bit ELF base types
+
+typedef uint32_t elf32_addr_t;
+typedef uint16_t elf32_half_t;
+typedef uint32_t elf32_off_t;
+typedef uint32_t elf32_word_t;
+
+// 64-bit ELF base types
+
+typedef uint64_t elf64_addr_t;
+typedef uint16_t elf64_half_t;
+typedef uint64_t elf64_off_t;
+typedef uint32_t elf64_word_t;
+typedef uint64_t elf64_xword_t;
+
+#define ELF_MAGIC       0x464C457F
+
+#define ELF_ET_NONE     0x0000  // no type
+#define ELF_ET_REL      0x0001  // relocatable
+#define ELF_ET_EXEC     0x0002  // executeable
+#define ELF_ET_DYN      0x0003  // Shared-Object-File
+#define ELF_ET_CORE     0x0004  // Corefile
+#define ELF_ET_LOPROC   0xFF00  // Processor-specific
+#define ELF_ET_HIPROC   0x00FF  // Processor-specific
+ 
+#define ELF_EM_NONE     0x0000  // no type
+#define ELF_EM_M32      0x0001  // AT&T WE 32100
+#define ELF_EM_SPARC    0x0002  // SPARC
+#define ELF_EM_386      0x0003  // Intel 80386
+#define ELF_EM_68K      0x0004  // Motorola 68000
+#define ELF_EM_88K      0x0005  // Motorola 88000
+#define ELF_EM_860      0x0007  // Intel 80860
+#define ELF_EM_MIPS     0x0008  // MIPS RS3000
+#define ELF_EM_ARM      0x0032  // ARM
+#define ELF_EM_X86_64   0x003E  // AMD/Intel x86_64
+
+#define ELF_CLASS_NONE  0x0000
+#define ELF_CLASS_32    0x0001  // 32bit file
+#define ELF_CLASS_64    0x0002  // 64bit file
+ 
+#define ELF_DATA_NONE   0x0000
+#define ELF_DATA_2LSB   0x0001
+#define ELF_DATA_2MSB   0x002
+ 
+
+#define ELF_SHT_NULL         0     // Section header table entry unused
+#define ELF_SHT_PROGBITS     1     // Program data
+#define ELF_SHT_SYMTAB       2     // Symbol table
+#define ELF_SHT_STRTAB       3     // String table
+#define ELF_SHT_RELA         4     // Relocation entries with addends
+#define ELF_SHT_HASH         5     // Symbol hash table
+#define ELF_SHT_DYNAMIC      6     // Dynamic linking information
+#define ELF_SHT_NOTE         7     // Notes
+#define ELF_SHT_NOBITS       8     // Program space with no data (bss)
+#define ELF_SHT_REL          9     // Relocation entries, no addends
+#define ELF_SHT_SHLIB        10    // Reserved
+#define ELF_SHT_DYNSYM       11    // Dynamic linker symbol table
+#define ELF_SHT_NUM          12    // Number of defined types.
+
+
+typedef struct 
+{
+  uint32_t magic;
+  uint8_t _class;
+  uint8_t data;
+  uint8_t version;
+  uint8_t pad[8];
+  uint8_t nident;
+
+} elf_ident_t;
+
+
+typedef struct 
+{
+  elf_ident_t     ident;
+  elf32_half_t    type;
+  elf32_half_t    machine;
+  elf32_word_t    version;
+  elf32_addr_t    entry;
+  elf32_off_t     ph_offset;
+  elf32_off_t     sh_offset;
+  elf32_word_t    flags;
+  elf32_half_t    header_size;
+  elf32_half_t    ph_entry_size;
+  elf32_half_t    ph_entry_count;
+  elf32_half_t    sh_entry_size;
+  elf32_half_t    sh_entry_count;
+  elf32_half_t    sh_str_table_index;
+
+} elf32_header_t;
+
+
+typedef struct 
+{
+  elf_ident_t     ident;
+  elf64_half_t    type;
+  elf64_half_t    machine;
+  elf64_word_t    version;
+  elf64_addr_t    entry;
+  elf64_off_t     ph_offset;
+  elf64_off_t     sh_offset;
+  elf64_word_t    flags;
+  elf64_half_t    header_size;
+  elf64_half_t    ph_entry_size;
+  elf64_half_t    ph_entry_count;
+  elf64_half_t    sh_entry_size;
+  elf64_half_t    sh_entry_count;
+  elf64_half_t    sh_str_table_index;
+
+} elf64_header_t;
+
+
+typedef struct 
+{
+  elf32_word_t    type;
+  elf32_off_t     offset;
+  elf32_addr_t    virt_addr;
+  elf32_addr_t    phys_addr;
+  elf32_word_t    file_size;
+  elf32_word_t    mem_size;
+  elf32_word_t    flags;
+  elf32_word_t    alignment;
+
+} elf32_program_header_t;
+
+
+typedef struct
+{
+  elf64_word_t    type;
+  elf64_word_t    flags;
+  elf64_off_t     offset;
+  elf64_addr_t    virt_addr;
+  elf64_addr_t    phys_addr;
+  elf64_xword_t   file_size;
+  elf64_xword_t   mem_size;
+  elf64_xword_t   alignment;
+
+} elf64_program_header_t;
+
+
+typedef struct 
+{
+  elf32_word_t    name;
+  elf32_word_t    type;
+  elf32_word_t    flags;
+  elf32_addr_t    addr;
+  elf32_off_t     offset;
+  elf32_word_t    size;
+  elf32_word_t    link;
+  elf32_word_t    info;
+  elf32_word_t    align;
+  elf32_word_t    entry_size;
 
-#define EV_NONE		0		/* Invalid ELF version */
-#define EV_CURRENT	1		/* Current version */
-#define EV_NUM		2
+} elf32_section_header_t;
 
-/* Section header.  */
 
-typedef struct
-{
-  Elf32_Word	sh_name;		/* Section name (string tbl index) */
-  Elf32_Word	sh_type;		/* Section type */
-  Elf32_Word	sh_flags;		/* Section flags */
-  Elf32_Addr	sh_addr;		/* Section virtual addr at execution */
-  Elf32_Off	sh_offset;		/* Section file offset */
-  Elf32_Word	sh_size;		/* Section size in bytes */
-  Elf32_Word	sh_link;		/* Link to another section */
-  Elf32_Word	sh_info;		/* Additional section information */
-  Elf32_Word	sh_addralign;		/* Section alignment */
-  Elf32_Word	sh_entsize;		/* Entry size if section holds table */
-} Elf32_Shdr;
-
-typedef struct
-{
-  Elf64_Word	sh_name;		/* Section name (string tbl index) */
-  Elf64_Word	sh_type;		/* Section type */
-  Elf64_Xword	sh_flags;		/* Section flags */
-  Elf64_Addr	sh_addr;		/* Section virtual addr at execution */
-  Elf64_Off	sh_offset;		/* Section file offset */
-  Elf64_Xword	sh_size;		/* Section size in bytes */
-  Elf64_Word	sh_link;		/* Link to another section */
-  Elf64_Word	sh_info;		/* Additional section information */
-  Elf64_Xword	sh_addralign;		/* Section alignment */
-  Elf64_Xword	sh_entsize;		/* Entry size if section holds table */
-} Elf64_Shdr;
-
-/* Special section indices.  */
-
-#define SHN_UNDEF	0		/* Undefined section */
-#define SHN_LORESERVE	0xff00		/* Start of reserved indices */
-#define SHN_LOPROC	0xff00		/* Start of processor-specific */
-#define SHN_HIPROC	0xff1f		/* End of processor-specific */
-#define SHN_ABS		0xfff1		/* Associated symbol is absolute */
-#define SHN_COMMON	0xfff2		/* Associated symbol is common */
-#define SHN_HIRESERVE	0xffff		/* End of reserved indices */
-
-/* Legal values for sh_type (section type).  */
-
-#define SHT_NULL	 0		/* Section header table entry unused */
-#define SHT_PROGBITS	 1		/* Program data */
-#define SHT_SYMTAB	 2		/* Symbol table */
-#define SHT_STRTAB	 3		/* String table */
-#define SHT_RELA	 4		/* Relocation entries with addends */
-#define SHT_HASH	 5		/* Symbol hash table */
-#define SHT_DYNAMIC	 6		/* Dynamic linking information */
-#define SHT_NOTE	 7		/* Notes */
-#define SHT_NOBITS	 8		/* Program space with no data (bss) */
-#define SHT_REL		 9		/* Relocation entries, no addends */
-#define SHT_SHLIB	 10		/* Reserved */
-#define SHT_DYNSYM	 11		/* Dynamic linker symbol table */
-#define	SHT_NUM		 12		/* Number of defined types.  */
-#define SHT_LOOS	 0x60000000	/* Start OS-specific */
-#define SHT_LOSUNW	 0x6ffffffb	/* Sun-specific low bound.  */
-#define SHT_SUNW_COMDAT  0x6ffffffb
-#define SHT_SUNW_syminfo 0x6ffffffc
-#define SHT_GNU_verdef	 0x6ffffffd	/* Version definition section.  */
-#define SHT_GNU_verneed	 0x6ffffffe	/* Version needs section.  */
-#define SHT_GNU_versym	 0x6fffffff	/* Version symbol table.  */
-#define SHT_HISUNW	 0x6fffffff	/* Sun-specific high bound.  */
-#define SHT_HIOS	 0x6fffffff	/* End OS-specific type */
-#define SHT_LOPROC	 0x70000000	/* Start of processor-specific */
-#define SHT_HIPROC	 0x7fffffff	/* End of processor-specific */
-#define SHT_LOUSER	 0x80000000	/* Start of application-specific */
-#define SHT_HIUSER	 0x8fffffff	/* End of application-specific */
-
-/* Legal values for sh_flags (section flags).  */
-
-#define SHF_WRITE	(1 << 0)	/* Writable */
-#define SHF_ALLOC	(1 << 1)	/* Occupies memory during execution */
-#define SHF_EXECINSTR	(1 << 2)	/* Executable */
-#define SHF_MASKPROC	0xf0000000	/* Processor-specific */
-
-/* Symbol table entry.  */
-
-typedef struct
-{
-  Elf32_Word	st_name;		/* Symbol name (string tbl index) */
-  Elf32_Addr	st_value;		/* Symbol value */
-  Elf32_Word	st_size;		/* Symbol size */
-  unsigned char	st_info;		/* Symbol type and binding */
-  unsigned char	st_other;		/* No defined meaning, 0 */
-  Elf32_Section	st_shndx;		/* Section index */
-} Elf32_Sym;
-
-typedef struct
-{
-  Elf64_Word	st_name;		/* Symbol name (string tbl index) */
-  unsigned char	st_info;		/* Symbol type and binding */
-  unsigned char st_other;		/* No defined meaning, 0 */
-  Elf64_Section	st_shndx;		/* Section index */
-  Elf64_Addr	st_value;		/* Symbol value */
-  Elf64_Xword	st_size;		/* Symbol size */
-} Elf64_Sym;
-
-/* The syminfo section if available contains additional information about
-   every dynamic symbol.  */
-
-typedef struct
+typedef struct 
 {
-  Elf32_Half si_boundto;		/* Direct bindings, symbol bound to */
-  Elf32_Half si_flags;			/* Per symbol flags */
-} Elf32_Syminfo;
-
-typedef struct
-{
-  Elf64_Half si_boundto;		/* Direct bindings, symbol bound to */
-  Elf64_Half si_flags;			/* Per symbol flags */
-} Elf64_Syminfo;
-
-/* Possible values for si_boundto.  */
-#define SYMINFO_BT_SELF		0xffff	/* Symbol bound to self */
-#define SYMINFO_BT_PARENT	0xfffe	/* Symbol bound to parent */
-#define SYMINFO_BT_LOWRESERVE	0xff00	/* Beginning of reserved entries */
-
-/* Possible bitmasks for si_flags.  */
-#define SYMINFO_FLG_DIRECT	0x0001	/* Direct bound symbol */
-#define SYMINFO_FLG_PASSTHRU	0x0002	/* Pass-thru symbol for translator */
-#define SYMINFO_FLG_COPY	0x0004	/* Symbol is a copy-reloc */
-#define SYMINFO_FLG_LAZYLOAD	0x0008	/* Symbol bound to object to be lazy
-					   loaded */
-/* Syminfo version values.  */
-#define SYMINFO_NONE		0
-#define SYMINFO_CURRENT		1
-#define SYMINFO_NUM		2
-
-
-/* Special section index.  */
-
-#define SHN_UNDEF	0		/* No section, undefined symbol.  */
-
-/* How to extract and insert information held in the st_info field.  */
-
-#define ELF32_ST_BIND(val)		(((unsigned char) (val)) >> 4)
-#define ELF32_ST_TYPE(val)		((val) & 0xf)
-#define ELF32_ST_INFO(bind, type)	(((bind) << 4) + ((type) & 0xf))
-
-/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field.  */
-#define ELF64_ST_BIND(val)		ELF32_ST_BIND (val)
-#define ELF64_ST_TYPE(val)		ELF32_ST_TYPE (val)
-#define ELF64_ST_INFO(bind, type)	ELF32_ST_INFO ((bind), (type))
-
-/* Legal values for ST_BIND subfield of st_info (symbol binding).  */
-
-#define STB_LOCAL	0		/* Local symbol */
-#define STB_GLOBAL	1		/* Global symbol */
-#define STB_WEAK	2		/* Weak symbol */
-#define	STB_NUM		3		/* Number of defined types.  */
-#define STB_LOOS	10		/* Start of OS-specific */
-#define STB_HIOS	12		/* End of OS-specific */
-#define STB_LOPROC	13		/* Start of processor-specific */
-#define STB_HIPROC	15		/* End of processor-specific */
-
-/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
-
-#define STT_NOTYPE	0		/* Symbol type is unspecified */
-#define STT_OBJECT	1		/* Symbol is a data object */
-#define STT_FUNC	2		/* Symbol is a code object */
-#define STT_SECTION	3		/* Symbol associated with a section */
-#define STT_FILE	4		/* Symbol's name is file name */
-#define	STT_NUM		5		/* Number of defined types.  */
-#define STT_LOOS	11		/* Start of OS-specific */
-#define STT_HIOS	12		/* End of OS-specific */
-#define STT_LOPROC	13		/* Start of processor-specific */
-#define STT_HIPROC	15		/* End of processor-specific */
-
-
-/* Symbol table indices are found in the hash buckets and chain table
-   of a symbol hash table section.  This special index value indicates
-   the end of a chain, meaning no further symbols are found in that bucket.  */
-
-#define STN_UNDEF	0		/* End of a chain.  */
-
+  elf64_word_t    name;
+  elf64_word_t    type;
+  elf64_xword_t   flags;
+  elf64_addr_t    addr;
+  elf64_off_t     offset;
+  elf64_xword_t   size;
+  elf64_word_t    link;
+  elf64_word_t    info;
+  elf64_xword_t   align;
+  elf64_xword_t   entry_size;
 
-/* Relocation table entry without addend (in section of type SHT_REL).  */
-
-typedef struct
-{
-  Elf32_Addr	r_offset;		/* Address */
-  Elf32_Word	r_info;			/* Relocation type and symbol index */
-} Elf32_Rel;
-
-/* I have seen two different definitions of the Elf64_Rel and
-   Elf64_Rela structures, so we'll leave them out until Novell (or
-   whoever) gets their act together.  */
-/* The following, at least, is used on Sparc v9, MIPS, and Alpha.  */
-
-typedef struct
-{
-  Elf64_Addr	r_offset;		/* Address */
-  Elf64_Xword	r_info;			/* Relocation type and symbol index */
-} Elf64_Rel;
-
-/* Relocation table entry with addend (in section of type SHT_RELA).  */
-
-typedef struct
-{
-  Elf32_Addr	r_offset;		/* Address */
-  Elf32_Word	r_info;			/* Relocation type and symbol index */
-  Elf32_Sword	r_addend;		/* Addend */
-} Elf32_Rela;
-
-typedef struct
-{
-  Elf64_Addr	r_offset;		/* Address */
-  Elf64_Xword	r_info;			/* Relocation type and symbol index */
-  Elf64_Sxword	r_addend;		/* Addend */
-} Elf64_Rela;
-
-/* How to extract and insert information held in the r_info field.  */
-
-#define ELF32_R_SYM(val)		((val) >> 8)
-#define ELF32_R_TYPE(val)		((val) & 0xff)
-#define ELF32_R_INFO(sym, type)		(((sym) << 8) + ((type) & 0xff))
-
-#define ELF64_R_SYM(i)			((i) >> 32)
-#define ELF64_R_TYPE(i)			((i) & 0xffffffff)
-#define ELF64_R_INFO(sym,type)		(((sym) << 32) + (type))
-
-/* Program segment header.  */
-
-typedef struct
-{
-  Elf32_Word	p_type;			/* Segment type */
-  Elf32_Off	p_offset;		/* Segment file offset */
-  Elf32_Addr	p_vaddr;		/* Segment virtual address */
-  Elf32_Addr	p_paddr;		/* Segment physical address */
-  Elf32_Word	p_filesz;		/* Segment size in file */
-  Elf32_Word	p_memsz;		/* Segment size in memory */
-  Elf32_Word	p_flags;		/* Segment flags */
-  Elf32_Word	p_align;		/* Segment alignment */
-} Elf32_Phdr;
-
-typedef struct
-{
-  Elf64_Word	p_type;			/* Segment type */
-  Elf64_Word	p_flags;		/* Segment flags */
-  Elf64_Off	p_offset;		/* Segment file offset */
-  Elf64_Addr	p_vaddr;		/* Segment virtual address */
-  Elf64_Addr	p_paddr;		/* Segment physical address */
-  Elf64_Xword	p_filesz;		/* Segment size in file */
-  Elf64_Xword	p_memsz;		/* Segment size in memory */
-  Elf64_Xword	p_align;		/* Segment alignment */
-} Elf64_Phdr;
-
-/* Legal values for p_type (segment type).  */
-
-#define	PT_NULL		0		/* Program header table entry unused */
-#define PT_LOAD		1		/* Loadable program segment */
-#define PT_DYNAMIC	2		/* Dynamic linking information */
-#define PT_INTERP	3		/* Program interpreter */
-#define PT_NOTE		4		/* Auxiliary information */
-#define PT_SHLIB	5		/* Reserved */
-#define PT_PHDR		6		/* Entry for header table itself */
-#define	PT_NUM		7		/* Number of defined types.  */
-#define PT_LOOS		0x60000000	/* Start of OS-specific */
-#define PT_HIOS		0x6fffffff	/* End of OS-specific */
-#define PT_LOPROC	0x70000000	/* Start of processor-specific */
-#define PT_HIPROC	0x7fffffff	/* End of processor-specific */
-
-/* Legal values for p_flags (segment flags).  */
-
-#define PF_X		(1 << 0)	/* Segment is executable */
-#define PF_W		(1 << 1)	/* Segment is writable */
-#define PF_R		(1 << 2)	/* Segment is readable */
-#define PF_MASKPROC	0xf0000000	/* Processor-specific */
-
-/* Legal values for note segment descriptor types for core files. */
-
-#define NT_PRSTATUS	1		/* Contains copy of prstatus struct */
-#define NT_FPREGSET	2		/* Contains copy of fpregset struct */
-#define NT_PRPSINFO	3		/* Contains copy of prpsinfo struct */
-#define NT_PRXREG	4		/* Contains copy of prxregset struct */
-#define NT_PLATFORM	5		/* String from sysinfo(SI_PLATFORM) */
-#define NT_AUXV		6		/* Contains copy of auxv array */
-#define NT_GWINDOWS	7		/* Contains copy of gwindows struct */
-#define NT_PSTATUS	10		/* Contains copy of pstatus struct */
-#define NT_PSINFO	13		/* Contains copy of psinfo struct */
-#define NT_PRCRED	14		/* Contains copy of prcred struct */
-#define NT_UTSNAME	15		/* Contains copy of utsname struct */
-#define NT_LWPSTATUS	16		/* Contains copy of lwpstatus struct */
-#define NT_LWPSINFO	17		/* Contains copy of lwpinfo struct */
-
-/* Legal values for the  note segment descriptor types for object files.  */
-
-#define NT_VERSION	1		/* Contains a version string.  */
-
-
-/* Dynamic section entry.  */
-
-typedef struct
-{
-  Elf32_Sword	d_tag;			/* Dynamic entry type */
-  union
-    {
-      Elf32_Word d_val;			/* Integer value */
-      Elf32_Addr d_ptr;			/* Address value */
-    } d_un;
-} Elf32_Dyn;
-
-typedef struct
-{
-  Elf64_Sxword	d_tag;			/* Dynamic entry type */
-  union
-    {
-      Elf64_Xword d_val;		/* Integer value */
-      Elf64_Addr d_ptr;			/* Address value */
-    } d_un;
-} Elf64_Dyn;
-
-/* Legal values for d_tag (dynamic entry type).  */
-
-#define DT_NULL		0		/* Marks end of dynamic section */
-#define DT_NEEDED	1		/* Name of needed library */
-#define DT_PLTRELSZ	2		/* Size in bytes of PLT relocs */
-#define DT_PLTGOT	3		/* Processor defined value */
-#define DT_HASH		4		/* Address of symbol hash table */
-#define DT_STRTAB	5		/* Address of string table */
-#define DT_SYMTAB	6		/* Address of symbol table */
-#define DT_RELA		7		/* Address of Rela relocs */
-#define DT_RELASZ	8		/* Total size of Rela relocs */
-#define DT_RELAENT	9		/* Size of one Rela reloc */
-#define DT_STRSZ	10		/* Size of string table */
-#define DT_SYMENT	11		/* Size of one symbol table entry */
-#define DT_INIT		12		/* Address of init function */
-#define DT_FINI		13		/* Address of termination function */
-#define DT_SONAME	14		/* Name of shared object */
-#define DT_RPATH	15		/* Library search path */
-#define DT_SYMBOLIC	16		/* Start symbol search here */
-#define DT_REL		17		/* Address of Rel relocs */
-#define DT_RELSZ	18		/* Total size of Rel relocs */
-#define DT_RELENT	19		/* Size of one Rel reloc */
-#define DT_PLTREL	20		/* Type of reloc in PLT */
-#define DT_DEBUG	21		/* For debugging; unspecified */
-#define DT_TEXTREL	22		/* Reloc might modify .text */
-#define DT_JMPREL	23		/* Address of PLT relocs */
-#define	DT_BIND_NOW	24		/* Process relocations of object */
-#define	DT_INIT_ARRAY	25		/* Array with addresses of init fct */
-#define	DT_FINI_ARRAY	26		/* Array with addresses of fini fct */
-#define	DT_INIT_ARRAYSZ	27		/* Size in bytes of DT_INIT_ARRAY */
-#define	DT_FINI_ARRAYSZ	28		/* Size in bytes of DT_FINI_ARRAY */
-#define	DT_NUM		29		/* Number used */
-#define DT_LOOS		0x60000000	/* Start of OS-specific */
-#define DT_HIOS		0x6fffffff	/* End of OS-specific */
-#define DT_LOPROC	0x70000000	/* Start of processor-specific */
-#define DT_HIPROC	0x7fffffff	/* End of processor-specific */
-#define	DT_PROCNUM	DT_MIPS_NUM	/* Most used by any processor */
-
-/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
-   Dyn.d_un.d_val field of the Elf*_Dyn structure.  This follows Sun's
-   approach.  */
-#define DT_VALRNGLO	0x6ffffd00
-#define DT_POSFLAG_1	0x6ffffdfd	/* Flags for DT_* entries, effecting
-					   the following DT_* entry.  */
-#define DT_SYMINSZ	0x6ffffdfe	/* Size of syminfo table (in bytes) */
-#define DT_SYMINENT	0x6ffffdff	/* Entry size of syminfo */
-#define DT_VALRNGHI	0x6ffffdff
-
-/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
-   Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
-
-   If any adjustment is made to the ELF object after it has been
-   built these entries will need to be adjusted.  */
-#define DT_ADDRRNGLO	0x6ffffe00
-#define DT_SYMINFO	0x6ffffeff	/* syminfo table */
-#define DT_ADDRRNGHI	0x6ffffeff
-
-/* The versioning entry types.  The next are defined as part of the
-   GNU extension.  */
-#define DT_VERSYM	0x6ffffff0
-
-/* These were chosen by Sun.  */
-#define DT_FLAGS_1	0x6ffffffb	/* State flags, see DF_1_* below.  */
-#define	DT_VERDEF	0x6ffffffc	/* Address of version definition
-					   table */
-#define	DT_VERDEFNUM	0x6ffffffd	/* Number of version definitions */
-#define	DT_VERNEED	0x6ffffffe	/* Address of table with needed
-					   versions */
-#define	DT_VERNEEDNUM	0x6fffffff	/* Number of needed versions */
-#define DT_VERSIONTAGIDX(tag)	(DT_VERNEEDNUM - (tag))	/* Reverse order! */
-#define DT_VERSIONTAGNUM 16
-
-/* Sun added these machine-independent extensions in the "processor-specific"
-   range.  Be compatible.  */
-#define DT_AUXILIARY    0x7ffffffd      /* Shared object to load before self */
-#define DT_FILTER       0x7fffffff      /* Shared object to get values from */
-#define DT_EXTRATAGIDX(tag)	((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
-#define DT_EXTRANUM	3
-
-/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
-   entry in the dynamic section.  */
-#define DF_1_NOW	0x00000001	/* Set RTLD_NOW for this object.  */
-#define DF_1_GLOBAL	0x00000002	/* Set RTLD_GLOBAL for this object.  */
-#define DF_1_GROUP	0x00000004	/* Set RTLD_GROUP for this object.  */
-#define DF_1_NODELETE	0x00000008	/* Set RTLD_NODELETE for this object.*/
-#define DF_1_LOADFLTR	0x00000010	/* Trigger filtee loading at runtime.*/
-#define DF_1_INITFIRST	0x00000020	/* Set RTLD_INITFIRST for this object*/
-#define DF_1_NOOPEN	0x00000040	/* Set RTLD_NOOPEN for this object.  */
-
-/* Version definition sections.  */
-
-typedef struct
-{
-  Elf32_Half	vd_version;		/* Version revision */
-  Elf32_Half	vd_flags;		/* Version information */
-  Elf32_Half	vd_ndx;			/* Version Index */
-  Elf32_Half	vd_cnt;			/* Number of associated aux entries */
-  Elf32_Word	vd_hash;		/* Version name hash value */
-  Elf32_Word	vd_aux;			/* Offset in bytes to verdaux array */
-  Elf32_Word	vd_next;		/* Offset in bytes to next verdef
-					   entry */
-} Elf32_Verdef;
-
-typedef struct
-{
-  Elf64_Half	vd_version;		/* Version revision */
-  Elf64_Half	vd_flags;		/* Version information */
-  Elf64_Half	vd_ndx;			/* Version Index */
-  Elf64_Half	vd_cnt;			/* Number of associated aux entries */
-  Elf64_Word	vd_hash;		/* Version name hash value */
-  Elf64_Word	vd_aux;			/* Offset in bytes to verdaux array */
-  Elf64_Word	vd_next;		/* Offset in bytes to next verdef
-					   entry */
-} Elf64_Verdef;
-
-
-/* Legal values for vd_version (version revision).  */
-#define VER_DEF_NONE	0		/* No version */
-#define VER_DEF_CURRENT	1		/* Current version */
-#define VER_DEF_NUM	2		/* Given version number */
-
-/* Legal values for vd_flags (version information flags).  */
-#define VER_FLG_BASE	0x1		/* Version definition of file itself */
-#define VER_FLG_WEAK	0x2		/* Weak version identifier */
-
-/* Auxialiary version information.  */
-
-typedef struct
-{
-  Elf32_Word	vda_name;		/* Version or dependency names */
-  Elf32_Word	vda_next;		/* Offset in bytes to next verdaux
-					   entry */
-} Elf32_Verdaux;
-
-typedef struct
-{
-  Elf64_Word	vda_name;		/* Version or dependency names */
-  Elf64_Word	vda_next;		/* Offset in bytes to next verdaux
-					   entry */
-} Elf64_Verdaux;
-
-
-/* Version dependency section.  */
-
-typedef struct
-{
-  Elf32_Half	vn_version;		/* Version of structure */
-  Elf32_Half	vn_cnt;			/* Number of associated aux entries */
-  Elf32_Word	vn_file;		/* Offset of filename for this
-					   dependency */
-  Elf32_Word	vn_aux;			/* Offset in bytes to vernaux array */
-  Elf32_Word	vn_next;		/* Offset in bytes to next verneed
-					   entry */
-} Elf32_Verneed;
-
-typedef struct
-{
-  Elf64_Half	vn_version;		/* Version of structure */
-  Elf64_Half	vn_cnt;			/* Number of associated aux entries */
-  Elf64_Word	vn_file;		/* Offset of filename for this
-					   dependency */
-  Elf64_Word	vn_aux;			/* Offset in bytes to vernaux array */
-  Elf64_Word	vn_next;		/* Offset in bytes to next verneed
-					   entry */
-} Elf64_Verneed;
-
-
-/* Legal values for vn_version (version revision).  */
-#define VER_NEED_NONE	 0		/* No version */
-#define VER_NEED_CURRENT 1		/* Current version */
-#define VER_NEED_NUM	 2		/* Given version number */
-
-/* Auxiliary needed version information.  */
-
-typedef struct
-{
-  Elf32_Word	vna_hash;		/* Hash value of dependency name */
-  Elf32_Half	vna_flags;		/* Dependency specific information */
-  Elf32_Half	vna_other;		/* Unused */
-  Elf32_Word	vna_name;		/* Dependency name string offset */
-  Elf32_Word	vna_next;		/* Offset in bytes to next vernaux
-					   entry */
-} Elf32_Vernaux;
-
-typedef struct
-{
-  Elf64_Word	vna_hash;		/* Hash value of dependency name */
-  Elf64_Half	vna_flags;		/* Dependency specific information */
-  Elf64_Half	vna_other;		/* Unused */
-  Elf64_Word	vna_name;		/* Dependency name string offset */
-  Elf64_Word	vna_next;		/* Offset in bytes to next vernaux
-					   entry */
-} Elf64_Vernaux;
-
-
-/* Legal values for vna_flags.  */
-#define VER_FLG_WEAK	0x2		/* Weak version identifier */
-
-
-/* Auxiliary vector.  */
-
-/* This vector is normally only used by the program interpreter.  The
-   usual definition in an ABI supplement uses the name auxv_t.  The
-   vector is not usually defined in a standard <elf.h> file, but it
-   can't hurt.  We rename it to avoid conflicts.  The sizes of these
-   types are an arrangement between the exec server and the program
-   interpreter, so we don't fully specify them here.  */
-
-typedef struct
-{
-  int a_type;			/* Entry type */
-  union
-    {
-      long int a_val;		/* Integer value */
-      void *a_ptr;		/* Pointer value */
-      void (*a_fcn) (void);	/* Function pointer value */
-    } a_un;
-} Elf32_auxv_t;
-
-typedef struct
-{
-  long int a_type;		/* Entry type */
-  union
-    {
-      long int a_val;		/* Integer value */
-      void *a_ptr;		/* Pointer value */
-      void (*a_fcn) (void);	/* Function pointer value */
-    } a_un;
-} Elf64_auxv_t;
-
-/* Legal values for a_type (entry type).  */
-
-#define AT_NULL		0		/* End of vector */
-#define AT_IGNORE	1		/* Entry should be ignored */
-#define AT_EXECFD	2		/* File descriptor of program */
-#define AT_PHDR		3		/* Program headers for program */
-#define AT_PHENT	4		/* Size of program header entry */
-#define AT_PHNUM	5		/* Number of program headers */
-#define AT_PAGESZ	6		/* System page size */
-#define AT_BASE		7		/* Base address of interpreter */
-#define AT_FLAGS	8		/* Flags */
-#define AT_ENTRY	9		/* Entry point of program */
-#define AT_NOTELF	10		/* Program is not ELF */
-#define AT_UID		11		/* Real uid */
-#define AT_EUID		12		/* Effective uid */
-#define AT_GID		13		/* Real gid */
-#define AT_EGID		14		/* Effective gid */
-
-/* Some more special a_type values describing the hardware.  */
-#define AT_PLATFORM	15		/* String identifying platform.  */
-#define AT_HWCAP	16		/* Machine dependent hints about
-					   processor capabilities.  */
-
-/* This entry gives some information about the FPU initialization
-   performed by the kernel.  */
-#define AT_FPUCW	17		/* Used FPU control word.  */
-
-
-/* Note section contents.  Each entry in the note section begins with
-   a header of a fixed form.  */
-
-typedef struct
-{
-  Elf32_Word n_namesz;			/* Length of the note's name.  */
-  Elf32_Word n_descsz;			/* Length of the note's descriptor.  */
-  Elf32_Word n_type;			/* Type of the note.  */
-} Elf32_Nhdr;
-
-typedef struct
-{
-  Elf64_Word n_namesz;			/* Length of the note's name.  */
-  Elf64_Word n_descsz;			/* Length of the note's descriptor.  */
-  Elf64_Word n_type;			/* Type of the note.  */
-} Elf64_Nhdr;
-
-/* Known names of notes.  */
-
-/* Solaris entries in the note section have this name.  */
-#define ELF_NOTE_SOLARIS	"SUNW Solaris"
-
-/* Note entries for GNU systems have this name.  */
-#define ELF_NOTE_GNU		"GNU"
-
-
-/* Defined types of notes for Solaris.  */
-
-/* Value of descriptor (one word) is desired pagesize for the binary.  */
-#define ELF_NOTE_PAGESIZE_HINT	1
-
-
-/* Defined note types for GNU systems.  */
-
-/* ABI information.  The descriptor consists of words:
-   word 0: OS descriptor
-   word 1: major version of the ABI
-   word 2: minor version of the ABI
-   word 3: subminor version of the ABI
-*/
-#define ELF_NOTE_ABI		1
-
-/* Known OSes.  These value can appear in word 0 of an ELF_NOTE_ABI
-   note section entry.  */
-#define ELF_NOTE_OS_LINUX	0
-#define ELF_NOTE_OS_GNU		1
-#define ELF_NOTE_OS_SOLARIS2	2
-
-
-/* Motorola 68k specific definitions.  */
-
-/* m68k relocs.  */
-
-#define R_68K_NONE	0		/* No reloc */
-#define R_68K_32	1		/* Direct 32 bit  */
-#define R_68K_16	2		/* Direct 16 bit  */
-#define R_68K_8		3		/* Direct 8 bit  */
-#define R_68K_PC32	4		/* PC relative 32 bit */
-#define R_68K_PC16	5		/* PC relative 16 bit */
-#define R_68K_PC8	6		/* PC relative 8 bit */
-#define R_68K_GOT32	7		/* 32 bit PC relative GOT entry */
-#define R_68K_GOT16	8		/* 16 bit PC relative GOT entry */
-#define R_68K_GOT8	9		/* 8 bit PC relative GOT entry */
-#define R_68K_GOT32O	10		/* 32 bit GOT offset */
-#define R_68K_GOT16O	11		/* 16 bit GOT offset */
-#define R_68K_GOT8O	12		/* 8 bit GOT offset */
-#define R_68K_PLT32	13		/* 32 bit PC relative PLT address */
-#define R_68K_PLT16	14		/* 16 bit PC relative PLT address */
-#define R_68K_PLT8	15		/* 8 bit PC relative PLT address */
-#define R_68K_PLT32O	16		/* 32 bit PLT offset */
-#define R_68K_PLT16O	17		/* 16 bit PLT offset */
-#define R_68K_PLT8O	18		/* 8 bit PLT offset */
-#define R_68K_COPY	19		/* Copy symbol at runtime */
-#define R_68K_GLOB_DAT	20		/* Create GOT entry */
-#define R_68K_JMP_SLOT	21		/* Create PLT entry */
-#define R_68K_RELATIVE	22		/* Adjust by program base */
-/* Keep this the last entry.  */
-#define R_68K_NUM	23
-
-/* Intel 80386 specific definitions.  */
-
-/* i386 relocs.  */
-
-#define R_386_NONE	0		/* No reloc */
-#define R_386_32	1		/* Direct 32 bit  */
-#define R_386_PC32	2		/* PC relative 32 bit */
-#define R_386_GOT32	3		/* 32 bit GOT entry */
-#define R_386_PLT32	4		/* 32 bit PLT address */
-#define R_386_COPY	5		/* Copy symbol at runtime */
-#define R_386_GLOB_DAT	6		/* Create GOT entry */
-#define R_386_JMP_SLOT	7		/* Create PLT entry */
-#define R_386_RELATIVE	8		/* Adjust by program base */
-#define R_386_GOTOFF	9		/* 32 bit offset to GOT */
-#define R_386_GOTPC	10		/* 32 bit PC relative offset to GOT */
-/* Keep this the last entry.  */
-#define R_386_NUM	11
-
-/* SUN SPARC specific definitions.  */
-
-/* Values for Elf64_Ehdr.e_flags.  */
-
-#define EF_SPARCV9_MM		3
-#define EF_SPARCV9_TSO		0
-#define EF_SPARCV9_PSO		1
-#define EF_SPARCV9_RMO		2
-#define EF_SPARC_EXT_MASK	0xFFFF00
-#define EF_SPARC_SUN_US1	0x000200
-#define EF_SPARC_HAL_R1		0x000400
-
-/* SPARC relocs.  */
-
-#define R_SPARC_NONE	0		/* No reloc */
-#define R_SPARC_8	1		/* Direct 8 bit */
-#define R_SPARC_16	2		/* Direct 16 bit */
-#define R_SPARC_32	3		/* Direct 32 bit */
-#define R_SPARC_DISP8	4		/* PC relative 8 bit */
-#define R_SPARC_DISP16	5		/* PC relative 16 bit */
-#define R_SPARC_DISP32	6		/* PC relative 32 bit */
-#define R_SPARC_WDISP30	7		/* PC relative 30 bit shifted */
-#define R_SPARC_WDISP22	8		/* PC relative 22 bit shifted */
-#define R_SPARC_HI22	9		/* High 22 bit */
-#define R_SPARC_22	10		/* Direct 22 bit */
-#define R_SPARC_13	11		/* Direct 13 bit */
-#define R_SPARC_LO10	12		/* Truncated 10 bit */
-#define R_SPARC_GOT10	13		/* Truncated 10 bit GOT entry */
-#define R_SPARC_GOT13	14		/* 13 bit GOT entry */
-#define R_SPARC_GOT22	15		/* 22 bit GOT entry shifted */
-#define R_SPARC_PC10	16		/* PC relative 10 bit truncated */
-#define R_SPARC_PC22	17		/* PC relative 22 bit shifted */
-#define R_SPARC_WPLT30	18		/* 30 bit PC relative PLT address */
-#define R_SPARC_COPY	19		/* Copy symbol at runtime */
-#define R_SPARC_GLOB_DAT 20		/* Create GOT entry */
-#define R_SPARC_JMP_SLOT 21		/* Create PLT entry */
-#define R_SPARC_RELATIVE 22		/* Adjust by program base */
-#define R_SPARC_UA32	23		/* Direct 32 bit unaligned */
-
-/* Additional Sparc64 relocs.  */
-
-#define R_SPARC_PLT32	24		/* Direct 32 bit ref to PLT entry */
-#define R_SPARC_HIPLT22	25		/* High 22 bit PLT entry */
-#define R_SPARC_LOPLT10	26		/* Truncated 10 bit PLT entry */
-#define R_SPARC_PCPLT32	27		/* PC rel 32 bit ref to PLT entry */
-#define R_SPARC_PCPLT22	28		/* PC rel high 22 bit PLT entry */
-#define R_SPARC_PCPLT10	29		/* PC rel trunc 10 bit PLT entry */
-#define R_SPARC_10	30		/* Direct 10 bit */
-#define R_SPARC_11	31		/* Direct 11 bit */
-#define R_SPARC_64	32		/* Direct 64 bit */
-#define R_SPARC_OLO10	33		/* ?? */
-#define R_SPARC_HH22	34		/* Top 22 bits of direct 64 bit */
-#define R_SPARC_HM10	35		/* High middle 10 bits of ... */
-#define R_SPARC_LM22	36		/* Low middle 22 bits of ... */
-#define R_SPARC_PC_HH22	37		/* Top 22 bits of pc rel 64 bit */
-#define R_SPARC_PC_HM10	38		/* High middle 10 bit of ... */
-#define R_SPARC_PC_LM22	39		/* Low miggle 22 bits of ... */
-#define R_SPARC_WDISP16	40		/* PC relative 16 bit shifted */
-#define R_SPARC_WDISP19	41		/* PC relative 19 bit shifted */
-#define R_SPARC_7	43		/* Direct 7 bit */
-#define R_SPARC_5	44		/* Direct 5 bit */
-#define R_SPARC_6	45		/* Direct 6 bit */
-#define R_SPARC_DISP64	46		/* PC relative 64 bit */
-#define R_SPARC_PLT64	47		/* Direct 64 bit ref to PLT entry */
-#define R_SPARC_HIX22	48		/* High 22 bit complemented */
-#define R_SPARC_LOX10	49		/* Truncated 11 bit complemented */
-#define R_SPARC_H44	50		/* Direct high 12 of 44 bit */
-#define R_SPARC_M44	51		/* Direct mid 22 of 44 bit */
-#define R_SPARC_L44	52		/* Direct low 10 of 44 bit */
-#define R_SPARC_REGISTER 53		/* Global register usage */
-#define R_SPARC_UA64	54		/* Direct 64 bit unaligned */
-#define R_SPARC_UA16	55		/* Direct 16 bit unaligned */
-/* Keep this the last entry.  */
-#define R_SPARC_NUM	56
-
-/* For Sparc64, legal values for d_tag of Elf64_Dyn.  */
-
-#define DT_SPARC_REGISTER 0x70000001
-#define DT_SPARC_NUM	2
-
-/* Bits present in AT_HWCAP, primarily for Sparc32.  */
-
-#define HWCAP_SPARC_FLUSH	1	/* The cpu supports flush insn.  */
-#define HWCAP_SPARC_STBAR	2
-#define HWCAP_SPARC_SWAP	4
-#define HWCAP_SPARC_MULDIV	8
-#define HWCAP_SPARC_V9		16	/* The cpu is v9, so v8plus is ok.  */
-
-/* MIPS R3000 specific definitions.  */
-
-/* Legal values for e_flags field of Elf32_Ehdr.  */
-
-#define EF_MIPS_NOREORDER   1		/* A .noreorder directive was used */
-#define EF_MIPS_PIC	    2		/* Contains PIC code */
-#define EF_MIPS_CPIC	    4		/* Uses PIC calling sequence */
-#define EF_MIPS_XGOT	    8
-#define EF_MIPS_64BIT_WHIRL 16
-#define EF_MIPS_ABI2	    32
-#define EF_MIPS_ABI_ON32    64
-#define EF_MIPS_ARCH	    0xf0000000	/* MIPS architecture level */
-
-/* Legal values for MIPS architecture level.  */
-
-#define EF_MIPS_ARCH_1	    0x00000000	/* -mips1 code.  */
-#define EF_MIPS_ARCH_2	    0x10000000	/* -mips2 code.  */
-#define EF_MIPS_ARCH_3	    0x20000000	/* -mips3 code.  */
-#define EF_MIPS_ARCH_4	    0x30000000	/* -mips4 code.  */
-#define EF_MIPS_ARCH_5	    0x40000000	/* -mips5 code.  */
-
-/* The following are non-official names and should not be used.  */
-
-#define E_MIPS_ARCH_1	  0x00000000	/* -mips1 code.  */
-#define E_MIPS_ARCH_2	  0x10000000	/* -mips2 code.  */
-#define E_MIPS_ARCH_3	  0x20000000	/* -mips3 code.  */
-#define E_MIPS_ARCH_4	  0x30000000	/* -mips4 code.  */
-#define E_MIPS_ARCH_5	  0x40000000	/* -mips5 code.  */
-
-/* Special section indices.  */
-
-#define SHN_MIPS_ACOMMON 0xff00		/* Allocated common symbols */
-#define SHN_MIPS_TEXT	 0xff01		/* Allocated test symbols.  */
-#define SHN_MIPS_DATA	 0xff02		/* Allocated data symbols.  */
-#define SHN_MIPS_SCOMMON 0xff03		/* Small common symbols */
-#define SHN_MIPS_SUNDEFINED 0xff04	/* Small undefined symbols */
-
-/* Legal values for sh_type field of Elf32_Shdr.  */
-
-#define SHT_MIPS_LIBLIST       0x70000000 /* Shared objects used in link */
-#define SHT_MIPS_MSYM	       0x70000001
-#define SHT_MIPS_CONFLICT      0x70000002 /* Conflicting symbols */
-#define SHT_MIPS_GPTAB	       0x70000003 /* Global data area sizes */
-#define SHT_MIPS_UCODE	       0x70000004 /* Reserved for SGI/MIPS compilers */
-#define SHT_MIPS_DEBUG	       0x70000005 /* MIPS ECOFF debugging information*/
-#define SHT_MIPS_REGINFO       0x70000006 /* Register usage information */
-#define SHT_MIPS_PACKAGE       0x70000007
-#define SHT_MIPS_PACKSYM       0x70000008
-#define SHT_MIPS_RELD	       0x70000009
-#define SHT_MIPS_IFACE         0x7000000b
-#define SHT_MIPS_CONTENT       0x7000000c
-#define SHT_MIPS_OPTIONS       0x7000000d /* Miscellaneous options.  */
-#define SHT_MIPS_SHDR	       0x70000010
-#define SHT_MIPS_FDESC	       0x70000011
-#define SHT_MIPS_EXTSYM	       0x70000012
-#define SHT_MIPS_DENSE	       0x70000013
-#define SHT_MIPS_PDESC	       0x70000014
-#define SHT_MIPS_LOCSYM	       0x70000015
-#define SHT_MIPS_AUXSYM	       0x70000016
-#define SHT_MIPS_OPTSYM	       0x70000017
-#define SHT_MIPS_LOCSTR	       0x70000018
-#define SHT_MIPS_LINE	       0x70000019
-#define SHT_MIPS_RFDESC	       0x7000001a
-#define SHT_MIPS_DELTASYM      0x7000001b
-#define SHT_MIPS_DELTAINST     0x7000001c
-#define SHT_MIPS_DELTACLASS    0x7000001d
-#define SHT_MIPS_DWARF         0x7000001e /* DWARF debugging information.  */
-#define SHT_MIPS_DELTADECL     0x7000001f
-#define SHT_MIPS_SYMBOL_LIB    0x70000020
-#define SHT_MIPS_EVENTS	       0x70000021 /* Event section.  */
-#define SHT_MIPS_TRANSLATE     0x70000022
-#define SHT_MIPS_PIXIE	       0x70000023
-#define SHT_MIPS_XLATE	       0x70000024
-#define SHT_MIPS_XLATE_DEBUG   0x70000025
-#define SHT_MIPS_WHIRL	       0x70000026
-#define SHT_MIPS_EH_REGION     0x70000027
-#define SHT_MIPS_XLATE_OLD     0x70000028
-#define SHT_MIPS_PDR_EXCEPTION 0x70000029
-
-/* Legal values for sh_flags field of Elf32_Shdr.  */
-
-#define SHF_MIPS_GPREL	 0x10000000	/* Must be part of global data area */
-#define SHF_MIPS_MERGE	 0x20000000
-#define SHF_MIPS_ADDR	 0x40000000
-#define SHF_MIPS_STRINGS 0x80000000
-#define SHF_MIPS_NOSTRIP 0x08000000
-#define SHF_MIPS_LOCAL	 0x04000000
-#define SHF_MIPS_NAMES	 0x02000000
-#define SHF_MIPS_NODUPE	 0x01000000
-
-
-/* Symbol tables.  */
-
-/* MIPS specific values for `st_other'.  */
-#define STO_MIPS_DEFAULT		0x0
-#define STO_MIPS_INTERNAL		0x1
-#define STO_MIPS_HIDDEN			0x2
-#define STO_MIPS_PROTECTED		0x3
-#define STO_MIPS_SC_ALIGN_UNUSED	0xff
-
-/* MIPS specific values for `st_info'.  */
-#define STB_MIPS_SPLIT_COMMON		13
-
-/* Entries found in sections of type SHT_MIPS_GPTAB.  */
-
-typedef union
-{
-  struct
-    {
-      Elf32_Word gt_current_g_value;	/* -G value used for compilation */
-      Elf32_Word gt_unused;		/* Not used */
-    } gt_header;			/* First entry in section */
-  struct
-    {
-      Elf32_Word gt_g_value;		/* If this value were used for -G */
-      Elf32_Word gt_bytes;		/* This many bytes would be used */
-    } gt_entry;				/* Subsequent entries in section */
-} Elf32_gptab;
-
-/* Entry found in sections of type SHT_MIPS_REGINFO.  */
-
-typedef struct
-{
-  Elf32_Word	ri_gprmask;		/* General registers used */
-  Elf32_Word	ri_cprmask[4];		/* Coprocessor registers used */
-  Elf32_Sword	ri_gp_value;		/* $gp register value */
-} Elf32_RegInfo;
-
-/* Entries found in sections of type SHT_MIPS_OPTIONS.  */
-
-typedef struct
-{
-  unsigned char kind;		/* Determines interpretation of the
-				   variable part of descriptor.  */
-  unsigned char size;		/* Size of descriptor, including header.  */
-  Elf32_Section section;	/* Section header index of section affected,
-				   0 for global options.  */
-  Elf32_Word info;		/* Kind-specific information.  */
-} Elf_Options;
-
-/* Values for `kind' field in Elf_Options.  */
-
-#define ODK_NULL	0	/* Undefined.  */
-#define ODK_REGINFO	1	/* Register usage information.  */
-#define ODK_EXCEPTIONS	2	/* Exception processing options.  */
-#define ODK_PAD		3	/* Section padding options.  */
-#define ODK_HWPATCH	4	/* Hardware workarounds performed */
-#define ODK_FILL	5	/* record the fill value used by the linker. */
-#define ODK_TAGS	6	/* reserve space for desktop tools to write. */
-#define ODK_HWAND	7	/* HW workarounds.  'AND' bits when merging. */
-#define ODK_HWOR	8	/* HW workarounds.  'OR' bits when merging.  */
-
-/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries.  */
-
-#define OEX_FPU_MIN	0x1f	/* FPE's which MUST be enabled.  */
-#define OEX_FPU_MAX	0x1f00	/* FPE's which MAY be enabled.  */
-#define OEX_PAGE0	0x10000	/* page zero must be mapped.  */
-#define OEX_SMM		0x20000	/* Force sequential memory mode?  */
-#define OEX_FPDBUG	0x40000	/* Force floating point debug mode?  */
-#define OEX_PRECISEFP	OEX_FPDBUG
-#define OEX_DISMISS	0x80000	/* Dismiss invalid address faults?  */
-
-#define OEX_FPU_INVAL	0x10
-#define OEX_FPU_DIV0	0x08
-#define OEX_FPU_OFLO	0x04
-#define OEX_FPU_UFLO	0x02
-#define OEX_FPU_INEX	0x01
-
-/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry.  */
-
-#define OHW_R4KEOP	0x1	/* R4000 end-of-page patch.  */
-#define OHW_R8KPFETCH	0x2	/* may need R8000 prefetch patch.  */
-#define OHW_R5KEOP	0x4	/* R5000 end-of-page patch.  */
-#define OHW_R5KCVTL	0x8	/* R5000 cvt.[ds].l bug.  clean=1.  */
-
-#define OPAD_PREFIX	0x1
-#define OPAD_POSTFIX	0x2
-#define OPAD_SYMBOL	0x4
-
-/* Entry found in `.options' section.  */
-
-typedef struct
-{
-  Elf32_Word hwp_flags1;	/* Extra flags.  */
-  Elf32_Word hwp_flags2;	/* Extra flags.  */
-} Elf_Options_Hw;
-
-/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries.  */
-
-#define OHWA0_R4KEOP_CHECKED	0x00000001
-#define OHWA1_R4KEOP_CLEAN	0x00000002
-
-/* MIPS relocs.  */
-
-#define R_MIPS_NONE		0	/* No reloc */
-#define R_MIPS_16		1	/* Direct 16 bit */
-#define R_MIPS_32		2	/* Direct 32 bit */
-#define R_MIPS_REL32		3	/* PC relative 32 bit */
-#define R_MIPS_26		4	/* Direct 26 bit shifted */
-#define R_MIPS_HI16		5	/* High 16 bit */
-#define R_MIPS_LO16		6	/* Low 16 bit */
-#define R_MIPS_GPREL16		7	/* GP relative 16 bit */
-#define R_MIPS_LITERAL		8	/* 16 bit literal entry */
-#define R_MIPS_GOT16		9	/* 16 bit GOT entry */
-#define R_MIPS_PC16		10	/* PC relative 16 bit */
-#define R_MIPS_CALL16		11	/* 16 bit GOT entry for function */
-#define R_MIPS_GPREL32		12	/* GP relative 32 bit */
-
-#define R_MIPS_SHIFT5		16
-#define R_MIPS_SHIFT6		17
-#define R_MIPS_64		18
-#define R_MIPS_GOT_DISP		19
-#define R_MIPS_GOT_PAGE		20
-#define R_MIPS_GOT_OFST		21
-#define R_MIPS_GOT_HI16		22
-#define R_MIPS_GOT_LO16		23
-#define R_MIPS_SUB		24
-#define R_MIPS_INSERT_A		25
-#define R_MIPS_INSERT_B		26
-#define R_MIPS_DELETE		27
-#define R_MIPS_HIGHER		28
-#define R_MIPS_HIGHEST		29
-#define R_MIPS_CALL_HI16	30
-#define R_MIPS_CALL_LO16	31
-#define R_MIPS_SCN_DISP		32
-#define R_MIPS_REL16		33
-#define R_MIPS_ADD_IMMEDIATE	34
-#define R_MIPS_PJUMP		35
-#define R_MIPS_RELGOT		36
-#define R_MIPS_JALR		37
-/* Keep this the last entry.  */
-#define R_MIPS_NUM		38
-
-/* Legal values for p_type field of Elf32_Phdr.  */
-
-#define PT_MIPS_REGINFO	0x70000000	/* Register usage information */
-#define PT_MIPS_RTPROC  0x70000001	/* Runtime procedure table. */
-#define PT_MIPS_OPTIONS 0x70000002
-
-/* Special program header types.  */
-
-#define PF_MIPS_LOCAL	0x10000000
-
-/* Legal values for d_tag field of Elf32_Dyn.  */
-
-#define DT_MIPS_RLD_VERSION  0x70000001	/* Runtime linker interface version */
-#define DT_MIPS_TIME_STAMP   0x70000002	/* Timestamp */
-#define DT_MIPS_ICHECKSUM    0x70000003	/* Checksum */
-#define DT_MIPS_IVERSION     0x70000004	/* Version string (string tbl index) */
-#define DT_MIPS_FLAGS	     0x70000005	/* Flags */
-#define DT_MIPS_BASE_ADDRESS 0x70000006	/* Base address */
-#define DT_MIPS_MSYM	     0x70000007
-#define DT_MIPS_CONFLICT     0x70000008	/* Address of CONFLICT section */
-#define DT_MIPS_LIBLIST	     0x70000009	/* Address of LIBLIST section */
-#define DT_MIPS_LOCAL_GOTNO  0x7000000a	/* Number of local GOT entries */
-#define DT_MIPS_CONFLICTNO   0x7000000b	/* Number of CONFLICT entries */
-#define DT_MIPS_LIBLISTNO    0x70000010	/* Number of LIBLIST entries */
-#define DT_MIPS_SYMTABNO     0x70000011	/* Number of DYNSYM entries */
-#define DT_MIPS_UNREFEXTNO   0x70000012	/* First external DYNSYM */
-#define DT_MIPS_GOTSYM	     0x70000013	/* First GOT entry in DYNSYM */
-#define DT_MIPS_HIPAGENO     0x70000014	/* Number of GOT page table entries */
-#define DT_MIPS_RLD_MAP	     0x70000016	/* Address of run time loader map.  */
-#define DT_MIPS_DELTA_CLASS  0x70000017	/* Delta C++ class definition.  */
-#define DT_MIPS_DELTA_CLASS_NO    0x70000018 /* Number of entries in
-						DT_MIPS_DELTA_CLASS.  */
-#define DT_MIPS_DELTA_INSTANCE    0x70000019 /* Delta C++ class instances.  */
-#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in
-						DT_MIPS_DELTA_INSTANCE.  */
-#define DT_MIPS_DELTA_RELOC  0x7000001b /* Delta relocations.  */
-#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in
-					     DT_MIPS_DELTA_RELOC.  */
-#define DT_MIPS_DELTA_SYM    0x7000001d /* Delta symbols that Delta
-					   relocations refer to.  */
-#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in
-					   DT_MIPS_DELTA_SYM.  */
-#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the
-					     class declaration.  */
-#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in
-						DT_MIPS_DELTA_CLASSSYM.  */
-#define DT_MIPS_CXX_FLAGS    0x70000022 /* Flags indicating for C++ flavor.  */
-#define DT_MIPS_PIXIE_INIT   0x70000023
-#define DT_MIPS_SYMBOL_LIB   0x70000024
-#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025
-#define DT_MIPS_LOCAL_GOTIDX 0x70000026
-#define DT_MIPS_HIDDEN_GOTIDX 0x70000027
-#define DT_MIPS_PROTECTED_GOTIDX 0x70000028
-#define DT_MIPS_OPTIONS	     0x70000029 /* Address of .options.  */
-#define DT_MIPS_INTERFACE    0x7000002a /* Address of .interface.  */
-#define DT_MIPS_DYNSTR_ALIGN 0x7000002b
-#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */
-#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve
-						    function stored in GOT.  */
-#define DT_MIPS_PERF_SUFFIX  0x7000002e /* Default suffix of dso to be added
-					   by rld on dlopen() calls.  */
-#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */
-#define DT_MIPS_GP_VALUE     0x70000030 /* GP value for aux GOTs.  */
-#define DT_MIPS_AUX_DYNAMIC  0x70000031 /* Address of aux .dynamic.  */
-#define DT_MIPS_NUM	     0x32
-
-/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry.  */
-
-#define RHF_NONE		   0		/* No flags */
-#define RHF_QUICKSTART		   (1 << 0)	/* Use quickstart */
-#define RHF_NOTPOT		   (1 << 1)	/* Hash size not power of 2 */
-#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2)	/* Ignore LD_LIBRARY_PATH */
-#define RHF_NO_MOVE		   (1 << 3)
-#define RHF_SGI_ONLY		   (1 << 4)
-#define RHF_GUARANTEE_INIT	   (1 << 5)
-#define RHF_DELTA_C_PLUS_PLUS	   (1 << 6)
-#define RHF_GUARANTEE_START_INIT   (1 << 7)
-#define RHF_PIXIE		   (1 << 8)
-#define RHF_DEFAULT_DELAY_LOAD	   (1 << 9)
-#define RHF_REQUICKSTART	   (1 << 10)
-#define RHF_REQUICKSTARTED	   (1 << 11)
-#define RHF_CORD		   (1 << 12)
-#define RHF_NO_UNRES_UNDEF	   (1 << 13)
-#define RHF_RLD_ORDER_SAFE	   (1 << 14)
-
-/* Entries found in sections of type SHT_MIPS_LIBLIST.  */
-
-typedef struct
-{
-  Elf32_Word l_name;		/* Name (string table index) */
-  Elf32_Word l_time_stamp;	/* Timestamp */
-  Elf32_Word l_checksum;	/* Checksum */
-  Elf32_Word l_version;		/* Interface version */
-  Elf32_Word l_flags;		/* Flags */
-} Elf32_Lib;
-
-typedef struct
-{
-  Elf64_Word l_name;		/* Name (string table index) */
-  Elf64_Word l_time_stamp;	/* Timestamp */
-  Elf64_Word l_checksum;	/* Checksum */
-  Elf64_Word l_version;		/* Interface version */
-  Elf64_Word l_flags;		/* Flags */
-} Elf64_Lib;
-
-
-/* Legal values for l_flags.  */
-
-#define LL_NONE		  0
-#define LL_EXACT_MATCH	  (1 << 0)	/* Require exact match */
-#define LL_IGNORE_INT_VER (1 << 1)	/* Ignore interface version */
-#define LL_REQUIRE_MINOR  (1 << 2)
-#define LL_EXPORTS	  (1 << 3)
-#define LL_DELAY_LOAD	  (1 << 4)
-#define LL_DELTA	  (1 << 5)
-
-/* Entries found in sections of type SHT_MIPS_CONFLICT.  */
-
-typedef Elf32_Addr Elf32_Conflict;
-
-
-/* HPPA specific definitions.  */
-
-/* Legal values for e_flags field of Elf32_Ehdr.  */
-
-#define EF_PARISC_TRAPNL	1	/* Trap nil pointer dereference.  */
-#define EF_PARISC_EXT		2	/* Program uses arch. extensions.  */
-#define EF_PARISC_ARCH		0xffff0000 /* Architecture version.  */
-/* Defined values are:
-				0x020b	PA-RISC 1.0 big-endian
-				0x0210	PA-RISC 1.1 big-endian
-				0x028b	PA-RISC 1.0 little-endian
-				0x0290	PA-RISC 1.1 little-endian
-*/
-
-/* Legal values for sh_type field of Elf32_Shdr.  */
-
-#define SHT_PARISC_GOT		0x70000000 /* GOT for external data.  */
-#define SHT_PARISC_ARCH		0x70000001 /* Architecture extensions.  */
-#define SHT_PARISC_GLOBAL	0x70000002 /* Definition of $global$.  */
-#define SHT_PARISC_MILLI	0x70000003 /* Millicode routines.  */
-#define SHT_PARISC_UNWIND	0x70000004 /* Unwind information.  */
-#define SHT_PARISC_PLT		0x70000005 /* Procedure linkage table.  */
-#define SHT_PARISC_SDATA	0x70000006 /* Short initialized data.  */
-#define SHT_PARISC_SBSS		0x70000007 /* Short uninitialized data.  */
-#define SHT_PARISC_SYMEXTN	0x70000008 /* Argument/relocation info.  */
-#define SHT_PARISC_STUBS	0x70000009 /* Linker stubs.  */
-
-/* Legal values for sh_flags field of Elf32_Shdr.  */
-
-#define SHF_PARISC_GLOBAL	0x10000000 /* Section defines dp.  */
-#define SHF_PARISC_SHORT	0x20000000 /* Section with short addressing. */
-
-/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
-
-#define STT_PARISC_MILLICODE	13	/* Millicode function entry point.  */
-
-/* HPPA relocs.  */
-
-#define R_PARISC_NONE		0	/* No reloc.  */
-#define R_PARISC_DIR32		1	/* Direct 32-bit reference.  */
-#define R_PARISC_DIR21L		2	/* Left 21 bits of eff. address.  */
-#define R_PARISC_DIR17R		3	/* Right 17 bits of eff. address.  */
-#define R_PARISC_DIR14R		4	/* Right 14 bits of eff. address.  */
-#define R_PARISC_PCREL21L	5	/* PC-relative, left 21 bits.  */
-#define R_PARISC_PCREL14R	6	/* PC-relative, right 14 bits.  */
-#define R_PARISC_PCREL17C	7	/* Conditional PC-relative, ignore
-					   if displacement > 17bits.  */
-#define R_PARISC_PCREL17F	8	/* Conditional PC-relative, must
-					   fit in 17bits.  */
-#define R_PARISC_DPREL21L	9	/* DP-relative, left 21 bits.  */
-#define R_PARISC_DPREL14R	10	/* DP-relative, right 14 bits.  */
-#define R_PARISC_DPREL14F	11	/* DP-relative, must bit in 14 bits. */
-#define R_PARISC_DLTREL21L	12	/* DLT-relative, left 21 bits.  */
-#define R_PARISC_DLTREL14R	13	/* DLT-relative, right 14 bits.  */
-#define R_PARISC_DLTREL14F	14	/* DLT-relative, must fit in 14 bits.*/
-#define R_PARISC_DLTIND21L	15	/* DLT-relative indirect, left
-					   21 bits.  */
-#define R_PARISC_DLTIND14R	16	/* DLT-relative indirect, right
-					   14 bits.  */
-#define R_PARISC_DLTIND14F	17	/* DLT-relative indirect, must fit
-					   int 14 bits.  */
-#define R_PARISC_PLABEL32	18	/* Direct 32-bit reference to proc.  */
-
-/* Alpha specific definitions.  */
-
-/* Legal values for e_flags field of Elf64_Ehdr.  */
-
-#define EF_ALPHA_32BIT		1	/* All addresses must be < 2GB.  */
-#define EF_ALPHA_CANRELAX	2	/* Relocations for relaxing exist.  */
-
-/* Legal values for sh_type field of Elf64_Shdr.  */
-
-/* These two are primerily concerned with ECOFF debugging info.  */
-#define SHT_ALPHA_DEBUG		0x70000001
-#define SHT_ALPHA_REGINFO	0x70000002
-
-/* Legal values for sh_flags field of Elf64_Shdr.  */
-
-#define SHF_ALPHA_GPREL		0x10000000
-
-/* Legal values for st_other field of Elf64_Sym.  */
-#define STO_ALPHA_NOPV		0x80	/* No PV required.  */
-#define STO_ALPHA_STD_GPLOAD	0x88	/* PV only used for initial ldgp.  */
-
-/* Alpha relocs.  */
-
-#define R_ALPHA_NONE		0	/* No reloc */
-#define R_ALPHA_REFLONG		1	/* Direct 32 bit */
-#define R_ALPHA_REFQUAD		2	/* Direct 64 bit */
-#define R_ALPHA_GPREL32		3	/* GP relative 32 bit */
-#define R_ALPHA_LITERAL		4	/* GP relative 16 bit w/optimization */
-#define R_ALPHA_LITUSE		5	/* Optimization hint for LITERAL */
-#define R_ALPHA_GPDISP		6	/* Add displacement to GP */
-#define R_ALPHA_BRADDR		7	/* PC+4 relative 23 bit shifted */
-#define R_ALPHA_HINT		8	/* PC+4 relative 16 bit shifted */
-#define R_ALPHA_SREL16		9	/* PC relative 16 bit */
-#define R_ALPHA_SREL32		10	/* PC relative 32 bit */
-#define R_ALPHA_SREL64		11	/* PC relative 64 bit */
-#define R_ALPHA_OP_PUSH		12	/* OP stack push */
-#define R_ALPHA_OP_STORE	13	/* OP stack pop and store */
-#define R_ALPHA_OP_PSUB		14	/* OP stack subtract */
-#define R_ALPHA_OP_PRSHIFT	15	/* OP stack right shift */
-#define R_ALPHA_GPVALUE		16
-#define R_ALPHA_GPRELHIGH	17
-#define R_ALPHA_GPRELLOW	18
-#define R_ALPHA_IMMED_GP_16	19
-#define R_ALPHA_IMMED_GP_HI32	20
-#define R_ALPHA_IMMED_SCN_HI32	21
-#define R_ALPHA_IMMED_BR_HI32	22
-#define R_ALPHA_IMMED_LO32	23
-#define R_ALPHA_COPY		24	/* Copy symbol at runtime */
-#define R_ALPHA_GLOB_DAT	25	/* Create GOT entry */
-#define R_ALPHA_JMP_SLOT	26	/* Create PLT entry */
-#define R_ALPHA_RELATIVE	27	/* Adjust by program base */
-/* Keep this the last entry.  */
-#define R_ALPHA_NUM		28
-
-
-/* PowerPC specific declarations */
-
-/* PowerPC relocations defined by the ABIs */
-#define R_PPC_NONE		0
-#define R_PPC_ADDR32		1	/* 32bit absolute address */
-#define R_PPC_ADDR24		2	/* 26bit address, 2 bits ignored.  */
-#define R_PPC_ADDR16		3	/* 16bit absolute address */
-#define R_PPC_ADDR16_LO		4	/* lower 16bit of absolute address */
-#define R_PPC_ADDR16_HI		5	/* high 16bit of absolute address */
-#define R_PPC_ADDR16_HA		6	/* adjusted high 16bit */
-#define R_PPC_ADDR14		7	/* 16bit address, 2 bits ignored */
-#define R_PPC_ADDR14_BRTAKEN	8
-#define R_PPC_ADDR14_BRNTAKEN	9
-#define R_PPC_REL24		10	/* PC relative 26 bit */
-#define R_PPC_REL14		11	/* PC relative 16 bit */
-#define R_PPC_REL14_BRTAKEN	12
-#define R_PPC_REL14_BRNTAKEN	13
-#define R_PPC_GOT16		14
-#define R_PPC_GOT16_LO		15
-#define R_PPC_GOT16_HI		16
-#define R_PPC_GOT16_HA		17
-#define R_PPC_PLTREL24		18
-#define R_PPC_COPY		19
-#define R_PPC_GLOB_DAT		20
-#define R_PPC_JMP_SLOT		21
-#define R_PPC_RELATIVE		22
-#define R_PPC_LOCAL24PC		23
-#define R_PPC_UADDR32		24
-#define R_PPC_UADDR16		25
-#define R_PPC_REL32		26
-#define R_PPC_PLT32		27
-#define R_PPC_PLTREL32		28
-#define R_PPC_PLT16_LO		29
-#define R_PPC_PLT16_HI		30
-#define R_PPC_PLT16_HA		31
-#define R_PPC_SDAREL16		32
-#define R_PPC_SECTOFF		33
-#define R_PPC_SECTOFF_LO	34
-#define R_PPC_SECTOFF_HI	35
-#define R_PPC_SECTOFF_HA	36
-/* Keep this the last entry.  */
-#define R_PPC_NUM		37
-
-/* The remaining relocs are from the Embedded ELF ABI, and are not
-   in the SVR4 ELF ABI.  */
-#define R_PPC_EMB_NADDR32	101
-#define R_PPC_EMB_NADDR16	102
-#define R_PPC_EMB_NADDR16_LO	103
-#define R_PPC_EMB_NADDR16_HI	104
-#define R_PPC_EMB_NADDR16_HA	105
-#define R_PPC_EMB_SDAI16	106
-#define R_PPC_EMB_SDA2I16	107
-#define R_PPC_EMB_SDA2REL	108
-#define R_PPC_EMB_SDA21		109	/* 16 bit offset in SDA */
-#define R_PPC_EMB_MRKREF	110
-#define R_PPC_EMB_RELSEC16	111
-#define R_PPC_EMB_RELST_LO	112
-#define R_PPC_EMB_RELST_HI	113
-#define R_PPC_EMB_RELST_HA	114
-#define R_PPC_EMB_BIT_FLD	115
-#define R_PPC_EMB_RELSDA	116	/* 16 bit relative offset in SDA */
-
-/* Diab tool relocations.  */
-#define R_PPC_DIAB_SDA21_LO	180	/* like EMB_SDA21, but lower 16 bit */
-#define R_PPC_DIAB_SDA21_HI	181	/* like EMB_SDA21, but high 16 bit */
-#define R_PPC_DIAB_SDA21_HA	182	/* like EMB_SDA21, adjusted high 16 */
-#define R_PPC_DIAB_RELSDA_LO	183	/* like EMB_RELSDA, but lower 16 bit */
-#define R_PPC_DIAB_RELSDA_HI	184	/* like EMB_RELSDA, but high 16 bit */
-#define R_PPC_DIAB_RELSDA_HA	185	/* like EMB_RELSDA, adjusted high 16 */
-
-/* This is a phony reloc to handle any old fashioned TOC16 references
-   that may still be in object files.  */
-#define R_PPC_TOC16		255
-
-
-/* ARM specific declarations */
-
-/* Processor specific flags for the ELF header e_flags field.  */
-#define EF_ARM_RELEXEC     0x01
-#define EF_ARM_HASENTRY    0x02
-#define EF_ARM_INTERWORK   0x04
-#define EF_ARM_APCS_26     0x08
-#define EF_ARM_APCS_FLOAT  0x10
-#define EF_ARM_PIC         0x20
-#define EF_ALIGN8          0x40		/* 8-bit structure alignment is in use */
-#define EF_NEW_ABI         0x80
-#define EF_OLD_ABI         0x100
-
-/* Additional symbol types for Thumb */
-#define STT_ARM_TFUNC      0xd
-
-/* ARM-specific values for sh_flags */
-#define SHF_ARM_ENTRYSECT  0x10000000   /* Section contains an entry point */
-#define SHF_ARM_COMDEF     0x80000000   /* Section may be multiply defined
-					   in the input to a link step */
-
-/* ARM-specific program header flags */
-#define PF_ARM_SB          0x10000000   /* Segment contains the location
-					   addressed by the static base */
-
-/* ARM relocs.  */
-#define R_ARM_NONE		0	/* No reloc */
-#define R_ARM_PC24		1	/* PC relative 26 bit branch */
-#define R_ARM_ABS32		2	/* Direct 32 bit  */
-#define R_ARM_REL32		3	/* PC relative 32 bit */
-#define R_ARM_PC13		4
-#define R_ARM_ABS16		5	/* Direct 16 bit */
-#define R_ARM_ABS12		6	/* Direct 12 bit */
-#define R_ARM_THM_ABS5		7
-#define R_ARM_ABS8		8	/* Direct 8 bit */
-#define R_ARM_SBREL32		9
-#define R_ARM_THM_PC22		10
-#define R_ARM_THM_PC8		11
-#define R_ARM_AMP_VCALL9	12
-#define R_ARM_SWI24		13
-#define R_ARM_THM_SWI8		14
-#define R_ARM_XPC25		15
-#define R_ARM_THM_XPC22		16
-#define R_ARM_COPY		20	/* Copy symbol at runtime */
-#define R_ARM_GLOB_DAT		21	/* Create GOT entry */
-#define R_ARM_JUMP_SLOT		22	/* Create PLT entry */
-#define R_ARM_RELATIVE		23	/* Adjust by program base */
-#define R_ARM_GOTOFF		24	/* 32 bit offset to GOT */
-#define R_ARM_GOTPC		25	/* 32 bit PC relative offset to GOT */
-#define R_ARM_GOT32		26	/* 32 bit GOT entry */
-#define R_ARM_PLT32		27	/* 32 bit PLT address */
-#define R_ARM_GNU_VTENTRY	100
-#define R_ARM_GNU_VTINHERIT	101
-#define R_ARM_THM_PC11		102	/* thumb unconditional branch */
-#define R_ARM_THM_PC9		103	/* thumb conditional branch */
-#define R_ARM_RXPC25		249
-#define R_ARM_RSBREL32		250
-#define R_ARM_THM_RPC22		251
-#define R_ARM_RREL32		252
-#define R_ARM_RABS22		253
-#define R_ARM_RPC24		254
-#define R_ARM_RBASE		255
-/* Keep this the last entry.  */
-#define R_ARM_NUM		256
+} elf64_section_header_t;
 
+#endif
 
-#endif	/* elf.h */
diff --git a/libyara/exefiles.c b/libyara/exefiles.c
index 86d1614..1a13275 100644
--- a/libyara/exefiles.c
+++ b/libyara/exefiles.c
@@ -117,19 +117,16 @@ int yr_get_elf_type(
     uint8_t* buffer,
     size_t buffer_length)
 {
-  Elf32_Ehdr* elf_header;
+  elf_ident_t* elf_ident;
 
-  if (buffer_length < sizeof(Elf32_Ehdr))
-  return 0;
+  if (buffer_length < sizeof(elf_ident_t))
+    return 0;
 
-  elf_header = (Elf32_Ehdr*) buffer;
+  elf_ident = (elf_ident_t*) buffer;
 
-  if (elf_header->e_ident[0] == ELFMAG0 &&
-      elf_header->e_ident[1] == ELFMAG1 &&
-      elf_header->e_ident[2] == ELFMAG2 &&
-      elf_header->e_ident[3] == ELFMAG3)
+  if (elf_ident->magic == ELF_MAGIC)
   {
-    return elf_header->e_ident[4];
+    return elf_ident->_class;
   }
   else
   {
@@ -139,38 +136,41 @@ int yr_get_elf_type(
 
 
 uint64_t yr_elf_rva_to_offset_32(
-    Elf32_Ehdr* elf_header,
+    elf32_header_t* elf_header,
     uint64_t rva,
     size_t buffer_length)
 {
   int i;
-  Elf32_Shdr* section;
+  elf32_section_header_t* section;
 
-  if (elf_header->e_shoff == 0 || elf_header->e_shnum == 0)
+  if (elf_header->sh_offset == 0 || elf_header->sh_entry_count == 0)
     return 0;
 
   // check to prevent integer wraps
-  if(ULONG_MAX - elf_header->e_shoff < sizeof(Elf32_Shdr) * elf_header->e_shnum)
+  if(ULONG_MAX - elf_header->sh_entry_count < 
+     sizeof(elf32_section_header_t) * elf_header->sh_entry_count)
     return 0;
 
-  if (elf_header->e_shoff + \
-      sizeof(Elf32_Shdr) * elf_header->e_shnum > buffer_length)
+  if (elf_header->sh_offset + \
+      sizeof(elf32_section_header_t) * \
+      elf_header->sh_entry_count > buffer_length)
     return 0;
 
-  section = (Elf32_Shdr*) ((unsigned char*) elf_header + elf_header->e_shoff);
+  section = (elf32_section_header_t*) \
+      ((unsigned char*) elf_header + elf_header->sh_offset);
 
-  for (i = 0; i < elf_header->e_shnum; i++)
+  for (i = 0; i < elf_header->sh_entry_count; i++)
   {
-    if (section->sh_type != SHT_NULL &&
-        section->sh_type != SHT_NOBITS &&
-        rva >= section->sh_addr &&
-        rva <  section->sh_addr + section->sh_size)
+    if (section->type != ELF_SHT_NULL &&
+        section->type != ELF_SHT_NOBITS &&
+        rva >= section->addr &&
+        rva <  section->addr + section->size)
     {
       // prevent integer wrapping with the return value
-      if (ULONG_MAX - section->sh_offset < (rva - section->sh_addr))
+      if (ULONG_MAX - section->offset < (rva - section->addr))
         return 0;
       else
-        return section->sh_offset + (rva - section->sh_addr);
+        return section->offset + (rva - section->addr);
     }
 
     section++;
@@ -182,30 +182,32 @@ uint64_t yr_elf_rva_to_offset_32(
 
 
 uint64_t yr_elf_rva_to_offset_64(
-    Elf64_Ehdr* elf_header,
+    elf64_header_t* elf_header,
     uint64_t rva,
     size_t buffer_length)
 {
   int i;
-  Elf64_Shdr* section;
+  elf64_section_header_t* section;
 
-  if (elf_header->e_shoff == 0 || elf_header->e_shnum == 0)
+  if (elf_header->sh_offset == 0 || elf_header->sh_entry_count == 0)
     return 0;
 
-  if (elf_header->e_shoff + sizeof(Elf64_Shdr) * elf_header->e_shnum > \
-      buffer_length)
+  if (elf_header->sh_offset + \
+      sizeof(elf64_section_header_t) * \
+      elf_header->sh_entry_count > buffer_length)
     return 0;
 
-  section = (Elf64_Shdr*) ((uint8_t*) elf_header + elf_header->e_shoff);
+  section = (elf64_section_header_t*) \
+      ((uint8_t*) elf_header + elf_header->sh_offset);
 
-  for (i = 0; i < elf_header->e_shnum; i++)
+  for (i = 0; i < elf_header->sh_entry_count; i++)
   {
-    if (section->sh_type != SHT_NULL &&
-        section->sh_type != SHT_NOBITS &&
-        rva >= section->sh_addr &&
-        rva <  section->sh_addr + section->sh_size)
+    if (section->type != ELF_SHT_NULL &&
+        section->type != ELF_SHT_NOBITS &&
+        rva >= section->addr &&
+        rva <  section->addr + section->size)
     {
-      return section->sh_offset + (rva - section->sh_addr);
+      return section->offset + (rva - section->addr);
     }
 
     section++;
@@ -220,8 +222,8 @@ uint64_t yr_get_entry_point_offset(
     size_t buffer_length)
 {
   PIMAGE_NT_HEADERS pe_header;
-  Elf32_Ehdr* elf_header32;
-  Elf64_Ehdr* elf_header64;
+  elf32_header_t* elf_header32;
+  elf64_header_t* elf_header64;
 
   pe_header = yr_get_pe_header(buffer, buffer_length);
 
@@ -235,18 +237,18 @@ uint64_t yr_get_entry_point_offset(
 
   switch(yr_get_elf_type(buffer, buffer_length))
   {
-    case ELFCLASS32:
-      elf_header32 = (Elf32_Ehdr*) buffer;
+    case ELF_CLASS_32:
+      elf_header32 = (elf32_header_t*) buffer;
       return yr_elf_rva_to_offset_32(
           elf_header32,
-          elf_header32->e_entry,
+          elf_header32->entry,
           buffer_length);
 
-    case ELFCLASS64:
-      elf_header64 = (Elf64_Ehdr*) buffer;
+    case ELF_CLASS_64:
+      elf_header64 = (elf64_header_t*) buffer;
       return yr_elf_rva_to_offset_64(
           elf_header64,
-          elf_header64->e_entry,
+          elf_header64->entry,
           buffer_length);
   }
 
@@ -261,8 +263,8 @@ uint64_t yr_get_entry_point_address(
 {
   PIMAGE_NT_HEADERS pe_header;
 
-  Elf32_Ehdr* elf_header32;
-  Elf64_Ehdr* elf_header64;
+  elf32_header_t* elf_header32;
+  elf64_header_t* elf_header64;
 
   pe_header = yr_get_pe_header(buffer, buffer_length);
 
@@ -276,19 +278,19 @@ uint64_t yr_get_entry_point_address(
 
   switch(yr_get_elf_type(buffer, buffer_length))
   {
-    case ELFCLASS32:
-      elf_header32 = (Elf32_Ehdr*) buffer;
+    case ELF_CLASS_32:
+      elf_header32 = (elf32_header_t*) buffer;
 
-      if (elf_header32->e_type == ET_EXEC)
-        return elf_header32->e_entry;
+      if (elf_header32->type == ELF_ET_EXEC)
+        return elf_header32->entry;
 
       break;
 
-    case ELFCLASS64:
-      elf_header64 = (Elf64_Ehdr*) buffer;
+    case ELF_CLASS_64:
+      elf_header64 = (elf64_header_t*) buffer;
 
-      if (elf_header64->e_type == ET_EXEC)
-        return elf_header64->e_entry;
+      if (elf_header64->type == ELF_ET_EXEC)
+        return elf_header64->entry;
 
       break;
   }
@@ -311,7 +313,7 @@ int yr_file_is_elf(
 {
   int type = yr_get_elf_type(buffer, buffer_length);
 
-  return (type == ELFCLASS32 || type == ELFCLASS64);
+  return (type == ELF_CLASS_32 || type == ELF_CLASS_64);
 }
 
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/forensics/yara.git



More information about the forensics-changes mailing list