Subversion Repositories HelenOS-historic

Rev

Rev 909 | Go to most recent revision | 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_SPARC    2   // SPARC
  56. #define EM_386      3   // i386
  57. #define EM_MIPS     8   // MIPS RS3000
  58. #define EM_MIPS_RS3_LE  10  // MIPS RS3000 LE
  59. #define EM_PPC      20  // PPC32
  60. #define EM_PPC64    21  // PPC64
  61. #define EM_SPARCV9  43  // SPARC64
  62. #define EM_IA_64    50  // IA-64
  63. #define EM_X86_64   62  // AMD64/EMT64
  64.  
  65. /**
  66.  * ELF identification indexes
  67.  */
  68. #define EI_MAG0     0
  69. #define EI_MAG1     1
  70. #define EI_MAG2     2
  71. #define EI_MAG3     3
  72. #define EI_CLASS    4   // File class
  73. #define EI_DATA     5   // Data encoding
  74. #define EI_VERSION  6   // File version
  75. #define EI_PAD      7   // Start of padding bytes
  76. #define EI_NIDENT   16  // ELF identification table size
  77.  
  78. /**
  79.  * ELF magic number
  80.  */
  81. #define ELFMAG0     0x7f
  82. #define ELFMAG1     'E'
  83. #define ELFMAG2     'L'
  84. #define ELFMAG3     'F'
  85.  
  86. /**
  87.  * ELF file classes
  88.  */
  89. #define ELFCLASSNONE    0
  90. #define ELFCLASS32  1
  91. #define ELFCLASS64  2
  92.  
  93. /**
  94.  * ELF data encoding types
  95.  */
  96. #define ELFDATANONE 0
  97. #define ELFDATA2LSB 1   // Least significant byte first (little endian)
  98. #define ELFDATA2MSB 2   // Most signigicant byte first (Big endian)
  99.  
  100. /**
  101.  * ELF error return codes
  102.  */
  103. #define EE_OK           0   // No error
  104. #define EE_INVALID      1   // invalid ELF image
  105. #define EE_MEMORY       2   // cannot allocate address space
  106. #define EE_INCOMPATIBLE     3   // ELF image is not compatible with current architecture
  107. #define EE_UNSUPPORTED      4   // Non-supported ELF (e.g. dynamic ELFs)
  108.  
  109.  
  110. /**
  111.  * ELF section types
  112.  */
  113. #define SHT_NULL        0
  114. #define SHT_PROGBITS        1
  115. #define SHT_SYMTAB      2
  116. #define SHT_STRTAB      3
  117. #define SHT_RELA        4
  118. #define SHT_HASH        5
  119. #define SHT_DYNAMIC     6
  120. #define SHT_NOTE        7
  121. #define SHT_NOBITS      8
  122. #define SHT_REL         9
  123. #define SHT_SHLIB       10
  124. #define SHT_DYNSYM      11
  125. #define SHT_LOPROC      0x70000000
  126. #define SHT_HIPROC      0x7fffffff
  127. #define SHT_LOUSER      0x80000000
  128. #define SHT_HIUSER      0xffffffff
  129.  
  130. /**
  131.  * ELF section flags
  132.  */
  133. #define SHF_WRITE       0x1
  134. #define SHF_ALLOC       0x2
  135. #define SHF_EXECINSTR       0x4
  136. #define SHF_MASKPROC        0xf0000000
  137.  
  138.  
  139. /**
  140.  * Symbol binding
  141.  */
  142. #define STB_LOCAL       0
  143. #define STB_GLOBAL      1
  144. #define STB_WEAK        2
  145. #define STB_LOPROC      13
  146. #define STB_HIPROC      15
  147.  
  148. /**
  149.  * Symbol types
  150.  */
  151. #define STT_NOTYPE      0
  152. #define STT_OBJECT      1
  153. #define STT_FUNC        2
  154. #define STT_SECTION     3
  155. #define STT_FILE        4
  156. #define STT_LOPROC      13
  157. #define STT_HIPROC      15
  158.  
  159.  
  160. /**
  161.  * Program segment types
  162.  */
  163. #define PT_NULL         0
  164. #define PT_LOAD         1
  165. #define PT_DYNAMIC      2
  166. #define PT_INTERP       3
  167. #define PT_NOTE         4
  168. #define PT_SHLIB        5
  169. #define PT_PHDR         6
  170. #define PT_LOPROC       0x70000000
  171. #define PT_HIPROC       0x7fffffff
  172.  
  173. /**
  174.  * 32-bit ELF data types
  175.  */
  176. typedef __u32 elf32_addr;
  177. typedef __u16 elf32_half;
  178. typedef __u32 elf32_off;
  179. typedef int elf32_sword;
  180. typedef __u32 elf32_word;
  181.  
  182. /**
  183.  * 32-bit ELF header
  184.  */
  185. struct elf32_header {
  186.     __u8 e_ident[EI_NIDENT];
  187.     elf32_half e_type;
  188.     elf32_half e_machine;
  189.     elf32_word e_version;
  190.     elf32_addr e_entry;
  191.     elf32_off e_phoff;
  192.     elf32_off e_shoff;
  193.     elf32_word e_flags;
  194.     elf32_half e_ehsize;
  195.     elf32_half e_phentsize;
  196.     elf32_half e_phnum;
  197.     elf32_half e_shentsize;
  198.     elf32_half e_shnum;
  199.     elf32_half e_shstrndx;
  200. };
  201.  
  202.  
  203. /*
  204.  * 32-bit ELF section header
  205.  */
  206. struct elf32_section_header {
  207.     elf32_word sh_name;
  208.     elf32_word sh_type;
  209.     elf32_word sh_flags;
  210.     elf32_addr sh_addr;
  211.     elf32_off sh_offset;
  212.     elf32_word sh_size;
  213.     elf32_word sh_link;
  214.     elf32_word sh_info;
  215.     elf32_word sh_addralign;
  216.     elf32_word sh_entsize;
  217. };
  218.  
  219.  
  220. /*
  221.  * 32-bit ELF symbol table entry
  222.  */
  223. struct elf32_symbol {
  224.     elf32_word st_name;
  225.     elf32_addr st_value;
  226.     elf32_word st_size;
  227.     __u8 st_info;
  228.     __u8 st_other;
  229.     elf32_half st_shndx;
  230. };
  231.  
  232.  
  233. /*
  234.  * 32-bit ELF program header
  235.  */
  236. struct elf32_program_header {
  237.     elf32_word p_type;
  238.     elf32_off p_offset;
  239.     elf32_addr pv_addr;
  240.     elf32_addr pp_addr;
  241.     elf32_word p_filesz;
  242.     elf32_word p_memsz;
  243.     elf32_word p_flags;
  244.     elf32_word p_align;
  245. };
  246.  
  247. typedef struct elf32_header elf32_header_t;
  248. typedef struct elf32_section_header elf32_section_header_t;
  249. typedef struct elf32_symbol elf32_symbol_t;
  250. typedef struct elf32_program_header elf32_program_header_t;
  251.  
  252.  
  253.  
  254. extern int elf32_load(__address header, as_t * as);
  255.  
  256. #endif
  257.