Subversion Repositories HelenOS-historic

Rev

Rev 856 | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2006 Sergey Bondari
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. #ifndef __ELF32_H__
  30. #define __ELF32_H__
  31.  
  32. #include <arch/types.h>
  33. #include <mm/as.h>
  34.  
  35. /**
  36.  * current ELF version
  37.  */
  38. #define EV_CURRENT  1
  39.  
  40. /**
  41.  * ELF types
  42.  */
  43. #define ET_NONE     0   // No type
  44. #define ET_REL      1   // Relocatable file
  45. #define ET_EXEC     2   // Executable
  46. #define ET_DYN      3   // Shared object
  47. #define ET_CORE     4   // Core
  48. #define ET_LOPROC   0xff00  // Processor specific
  49. #define ET_HIPROC   0xffff  // Processor specific
  50.  
  51. /**
  52.  * ELF machine types
  53.  */
  54. #define EM_NO       0   // No machine
  55. #define EM_M32      1   // AT&T WE 32100
  56. #define EM_SPARC    2   // SPARC
  57. #define EM_386      3   // i386
  58. #define EM_68K      4   // Motorola 68000
  59. #define EM_88K      5   // Motorola 88000
  60. #define EM_860      7   // i80860
  61. #define EM_MIPS     8   // MIPS RS3000
  62.  
  63. /**
  64.  * ELF identification indexes
  65.  */
  66. #define EI_MAG0     0
  67. #define EI_MAG1     1
  68. #define EI_MAG2     2
  69. #define EI_MAG3     3
  70. #define EI_CLASS    4   // File class
  71. #define EI_DATA     5   // Data encoding
  72. #define EI_VERSION  6   // File version
  73. #define EI_PAD      7   // Start of padding bytes
  74. #define EI_NIDENT   16  // ELF identification table size
  75.  
  76. /**
  77.  * ELF magic number
  78.  */
  79. #define ELFMAG0     0x7f
  80. #define ELFMAG1     'E'
  81. #define ELFMAG2     'L'
  82. #define ELFMAG3     'F'
  83.  
  84. /**
  85.  * ELF file classes
  86.  */
  87. #define ELFCLASSNONE    0
  88. #define ELFCLASS32  1
  89. #define ELFCLASS64  2
  90.  
  91. /**
  92.  * ELF data encoding types
  93.  */
  94. #define ELFDATANONE 0
  95. #define ELFDATA2LSB 1   // Least significant byte first (little endian)
  96. #define ELFDATA2MSB 2   // Most signigicant byte first (Big endian)
  97.  
  98. /**
  99.  * ELF error return codes
  100.  */
  101. #define EE_OK           0   // No error
  102. #define EE_INVALID      1   // invalid ELF image
  103. #define EE_MEMORY       2   // cannot allocate address space
  104. #define EE_INCOMPATIBLE     3   // ELF image is not compatible with current architecture
  105. #define EE_UNSUPPORTED      4   // Non-supported ELF (e.g. dynamic ELFs)
  106.  
  107.  
  108. /**
  109.  * ELF section types
  110.  */
  111. #define SHT_NULL        0
  112. #define SHT_PROGBITS        1
  113. #define SHT_SYMTAB      2
  114. #define SHT_STRTAB      3
  115. #define SHT_RELA        4
  116. #define SHT_HASH        5
  117. #define SHT_DYNAMIC     6
  118. #define SHT_NOTE        7
  119. #define SHT_NOBITS      8
  120. #define SHT_REL         9
  121. #define SHT_SHLIB       10
  122. #define SHT_DYNSYM      11
  123. #define SHT_LOPROC      0x70000000
  124. #define SHT_HIPROC      0x7fffffff
  125. #define SHT_LOUSER      0x80000000
  126. #define SHT_HIUSER      0xffffffff
  127.  
  128. /**
  129.  * ELF section flags
  130.  */
  131. #define SHF_WRITE       0x1
  132. #define SHF_ALLOC       0x2
  133. #define SHF_EXECINSTR       0x4
  134. #define SHF_MASKPROC        0xf0000000
  135.  
  136.  
  137. /**
  138.  * Symbol binding
  139.  */
  140. #define STB_LOCAL       0
  141. #define STB_GLOBAL      1
  142. #define STB_WEAK        2
  143. #define STB_LOPROC      13
  144. #define STB_HIPROC      15
  145.  
  146. /**
  147.  * Symbol types
  148.  */
  149. #define STT_NOTYPE      0
  150. #define STT_OBJECT      1
  151. #define STT_FUNC        2
  152. #define STT_SECTION     3
  153. #define STT_FILE        4
  154. #define STT_LOPROC      13
  155. #define STT_HIPROC      15
  156.  
  157.  
  158. /**
  159.  * Program segment types
  160.  */
  161. #define PT_NULL         0
  162. #define PT_LOAD         1
  163. #define PT_DYNAMIC      2
  164. #define PT_INTERP       3
  165. #define PT_NOTE         4
  166. #define PT_SHLIB        5
  167. #define PT_PHDR         6
  168. #define PT_LOPROC       0x70000000
  169. #define PT_HIPROC       0x7fffffff
  170.  
  171. /**
  172.  * 32-bit ELF data types
  173.  */
  174. typedef __u32 elf32_addr;
  175. typedef __u16 elf32_half;
  176. typedef __u32 elf32_off;
  177. typedef int elf32_sword;
  178. typedef __u32 elf32_word;
  179.  
  180. /**
  181.  * 32-bit ELF header
  182.  */
  183. struct elf32_header {
  184.     __u8 e_ident[EI_NIDENT];
  185.     elf32_half e_type;
  186.     elf32_half e_machine;
  187.     elf32_word e_version;
  188.     elf32_addr e_entry;
  189.     elf32_off e_phoff;
  190.     elf32_off e_shoff;
  191.     elf32_word e_flags;
  192.     elf32_half e_ehsize;
  193.     elf32_half e_phentsize;
  194.     elf32_half e_phnum;
  195.     elf32_half e_shentsize;
  196.     elf32_half e_shnum;
  197.     elf32_half e_shstrndx;
  198. };
  199.  
  200.  
  201. /*
  202.  * 32-bit ELF section header
  203.  */
  204. struct elf32_section_header {
  205.     elf32_word sh_name;
  206.     elf32_word sh_type;
  207.     elf32_word sh_flags;
  208.     elf32_addr sh_addr;
  209.     elf32_off sh_offset;
  210.     elf32_word sh_size;
  211.     elf32_word sh_link;
  212.     elf32_word sh_info;
  213.     elf32_word sh_addralign;
  214.     elf32_word sh_entsize;
  215. };
  216.  
  217.  
  218. /*
  219.  * 32-bit ELF symbol table entry
  220.  */
  221. struct elf32_symbol {
  222.     elf32_word st_name;
  223.     elf32_addr st_value;
  224.     elf32_word st_size;
  225.     __u8 st_info;
  226.     __u8 st_other;
  227.     elf32_half st_shndx;
  228. };
  229.  
  230.  
  231. /*
  232.  * 32-bit ELF program header
  233.  */
  234. struct elf32_program_header {
  235.     elf32_word p_type;
  236.     elf32_off p_offset;
  237.     elf32_addr pv_addr;
  238.     elf32_addr pp_addr;
  239.     elf32_word p_filesz;
  240.     elf32_word p_memsz;
  241.     elf32_word p_flags;
  242.     elf32_word p_align;
  243. };
  244.  
  245. typedef struct elf32_header elf32_header_t;
  246. typedef struct elf32_section_header elf32_section_header_t;
  247. typedef struct elf32_symbol elf32_symbol_t;
  248. typedef struct elf32_program_header elf32_program_header_t;
  249.  
  250.  
  251.  
  252. extern int elf32_load(__address header, as_t * as);
  253.  
  254. #endif
  255.