diff options
Diffstat (limited to 'src/local-elf.h')
-rw-r--r-- | src/local-elf.h | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/local-elf.h b/src/local-elf.h new file mode 100644 index 0000000..1ac0fc8 --- /dev/null +++ b/src/local-elf.h @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2009 Guillem Jover + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LIBBSD_LOCAL_ELF_H +#define LIBBSD_LOCAL_ELF_H + +#include <elf.h> + +#define IS_ELF(ehdr) \ + ((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \ + (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \ + (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \ + (ehdr).e_ident[EI_MAG3] == ELFMAG3) + +#define ELF_TARG_VER EV_CURRENT + +#if defined(__alpha__) + +#define ELF_TARG_MACH EM_ALPHA +#define ELF_TARG_CLASS ELFCLASS64 +#define ELF_TARG_DATA ELFDATA2LSB + +#elif defined(__amd64__) + +#define ELF_TARG_MACH EM_X86_64 +#define ELF_TARG_CLASS ELFCLASS64 +#define ELF_TARG_DATA ELFDATA2LSB + +#elif defined(__arm__) + +#define ELF_TARG_MACH EM_ARM +#define ELF_TARG_CLASS ELFCLASS32 +#if defined(__ARMEB__) +#define ELF_TARG_DATA ELFDATA2MSB +#else +#define ELF_TARG_DATA ELFDATA2LSB +#endif + +#elif defined(__avr32__) + +#ifndef EM_AVR32 +#define EM_AVR32 0x18ad +#endif +#define ELF_TARG_MACH EM_AVR32 +#define ELF_TARG_CLASS ELFCLASS32 +#if define(__LITTLE_ENDIAN__) +#define ELF_TARG_DATA ELFDATA2LSB +#elif defined(__BIG_ENDIAN__) +#define ELF_TARG_DATA ELFDATA2LMSB +#else +#error Unknown AVR32 endianness +#endif + +#elif defined(__hppa__) + +#define ELF_TARG_MACH EM_PARISC +#define ELF_TARG_CLASS ELFCLASS32 +#define ELF_TARG_DATA ELFDATA2MSB + +#elif defined(__i386__) + +#define ELF_TARG_MACH EM_386 +#define ELF_TARG_CLASS ELFCLASS32 +#define ELF_TARG_DATA ELFDATA2LSB + +#elif defined(__ia64__) + +#define ELF_TARG_MACH EM_IA_64 +#define ELF_TARG_CLASS ELFCLASS64 +#define ELF_TARG_DATA ELFDATA2LSB + +#elif defined(__m32r__) + +#define ELF_TARG_MACH EM_M32R +#define ELF_TARG_CLASS ELFCLASS32 +#if defined(__LITTLE_ENDIAN__) +#define ELF_DATA ELFDATA2LSB +#elif defined(__BIG_ENDIAN__) +#define ELF_DATA ELFDATA2MSB +#else +#error Unknown M32R endianness +#endif + +#elif defined(__m68k__) + +#define ELF_TARG_MACH EM_68K +#define ELF_TARG_CLASS ELFCLASS32 +#define ELF_TARG_DATA ELFDATA2MSB + +#elif defined(__mips__) + +#define ELF_TARG_MACH EM_MIPS +#define ELF_TARG_CLASS ELFCLASS32 +#if defined(__MIPSEB__) +#define ELF_TARG_DATA ELFDATA2MSB +#else +#define ELF_TARG_DATA ELFDATA2LSB +#endif + +#elif defined(__powerpc__) + +#define ELF_TARG_MACH EM_PPC +#define ELF_TARG_CLASS ELFCLASS32 +#define ELF_TARG_DATA ELFDATA2MSG + +#elif defined(__powerpc64__) + +#define ELF_TARG_MACH EM_PPC64 +#define ELF_TARG_CLASS ELFCLASS64 +#define ELF_TARG_DATA ELFDATA2MSG + +#elif defined(__sparc__) + +#if defined(__arch64__) +#define ELF_TARG_MACH EM_SPARCV9 +#define ELF_TARG_CLASS ELFCLASS64 +#else +#define ELF_TARG_MACH EM_SPARC +#define ELF_TARG_CLASS ELFCLASS32 +#endif +#define ELF_TARG_DATA ELFDATA2MSB + +#elif defined(__sh__) + +#define ELF_TARG_MACH EM_SH +#define ELF_TARG_CLASS ELFCLASS32 +#if define(__LITTLE_ENDIAN__) +#define ELF_TARG_DATA ELFDATA2LSB +#elif defined(__BIG_ENDIAN__) +#define ELF_TARG_DATA ELFDATA2LMSB +#else +#error Unknown SH endianness +#endif + +#elif defined(__s390__) + +#define ELF_TARG_MACH EM_S390 +#if defined(__s390x__) +#define ELF_TARG_CLASS ELFCLASS64 +#else +#define ELF_TARG_CLASS ELFCLASS32 +#endif +#define ELF_TARG_DATA ELFDATA2MSG + +#else + +#error Unknown ELF machine type + +#endif + +#if ELF_TARG_CLASS == ELFCLASS32 +#define ELF_ST_BIND ELF32_ST_BIND +#define ELF_ST_TYPE ELF32_ST_TYPE +#define Elf_Word Elf32_Word +#define Elf_Sword Elf32_Sword +#define Elf_Sym Elf32_Sym +#define Elf_Off Elf32_Off +#define Elf_Shdr Elf32_Shdr +#define Elf_Ehdr Elf32_Ehdr +#elif ELF_TARG_CLASS == ELFCLASS64 +#define ELF_ST_BIND ELF64_ST_BIND +#define ELF_ST_TYPE ELF64_ST_TYPE +#define Elf_Word Elf64_Word +#define Elf_Sword Elf64_Sword +#define Elf_Sym Elf64_Sym +#define Elf_Off Elf64_Off +#define Elf_Shdr Elf64_Shdr +#define Elf_Ehdr Elf64_Ehdr +#else +#error Unknown ELF class +#endif + +#endif + |