Subversion Repositories HelenOS

Rev

Rev 3022 | Go to most recent revision | Blame | Compare with Previous | 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. /** @addtogroup generic
  30.  * @{
  31.  */
  32. /** @file
  33.  */
  34.  
  35. #ifndef KERN_ELF_H_
  36. #define KERN_ELF_H_
  37.  
  38. #include <arch/elf.h>
  39. #include <arch/types.h>
  40.  
  41. /**
  42.  * current ELF version
  43.  */
  44. #define EV_CURRENT  1
  45.  
  46. /**
  47.  * ELF types
  48.  */
  49. #define ET_NONE     0   /* No type */
  50. #define ET_REL      1   /* Relocatable file */
  51. #define ET_EXEC     2   /* Executable */
  52. #define ET_DYN      3   /* Shared object */
  53. #define ET_CORE     4   /* Core */
  54. #define ET_LOPROC   0xff00  /* Processor specific */
  55. #define ET_HIPROC   0xffff  /* Processor specific */
  56.  
  57. /**
  58.  * ELF machine types
  59.  */
  60. #define EM_NO       0   /* No machine */
  61. #define EM_SPARC    2   /* SPARC */
  62. #define EM_386      3   /* i386 */
  63. #define EM_MIPS     8   /* MIPS RS3000 */
  64. #define EM_MIPS_RS3_LE  10  /* MIPS RS3000 LE */
  65. #define EM_PPC      20  /* PPC32 */
  66. #define EM_PPC64    21  /* PPC64 */
  67. #define EM_ARM      40  /* ARM */
  68. #define EM_SPARCV9  43  /* SPARC64 */
  69. #define EM_IA_64    50  /* IA-64 */
  70. #define EM_X86_64   62  /* AMD64/EMT64 */
  71.  
  72. /**
  73.  * ELF identification indexes
  74.  */
  75. #define EI_MAG0     0
  76. #define EI_MAG1     1
  77. #define EI_MAG2     2
  78. #define EI_MAG3     3
  79. #define EI_CLASS    4       /* File class */
  80. #define EI_DATA     5       /* Data encoding */
  81. #define EI_VERSION  6       /* File version */
  82. #define EI_OSABI    7
  83. #define EI_ABIVERSION   8
  84. #define EI_PAD      9       /* Start of padding bytes */
  85. #define EI_NIDENT   16      /* ELF identification table size */
  86.  
  87. /**
  88.  * ELF magic number
  89.  */
  90. #define ELFMAG0     0x7f
  91. #define ELFMAG1     'E'
  92. #define ELFMAG2     'L'
  93. #define ELFMAG3     'F'
  94.  
  95. /**
  96.  * ELF file classes
  97.  */
  98. #define ELFCLASSNONE    0
  99. #define ELFCLASS32  1
  100. #define ELFCLASS64  2
  101.  
  102. /**
  103.  * ELF data encoding types
  104.  */
  105. #define ELFDATANONE 0
  106. #define ELFDATA2LSB 1       /* Least significant byte first (little endian) */
  107. #define ELFDATA2MSB 2       /* Most signigicant byte first (big endian) */
  108.  
  109. /**
  110.  * ELF error return codes
  111.  */
  112. #define EE_OK           0   /* No error */
  113. #define EE_INVALID      1   /* Invalid ELF image */
  114. #define EE_MEMORY       2   /* Cannot allocate address space */
  115. #define EE_INCOMPATIBLE     3   /* ELF image is not compatible with current architecture */
  116. #define EE_UNSUPPORTED      4   /* Non-supported ELF (e.g. dynamic ELFs) */
  117. #define EE_LOADER       5   /* The image is actually a program loader */
  118. #define EE_IRRECOVERABLE    6
  119.  
  120. /**
  121.  * ELF section types
  122.  */
  123. #define SHT_NULL        0
  124. #define SHT_PROGBITS        1
  125. #define SHT_SYMTAB      2
  126. #define SHT_STRTAB      3
  127. #define SHT_RELA        4
  128. #define SHT_HASH        5
  129. #define SHT_DYNAMIC     6
  130. #define SHT_NOTE        7
  131. #define SHT_NOBITS      8
  132. #define SHT_REL         9
  133. #define SHT_SHLIB       10
  134. #define SHT_DYNSYM      11
  135. #define SHT_LOOS        0x60000000
  136. #define SHT_HIOS        0x6fffffff
  137. #define SHT_LOPROC      0x70000000
  138. #define SHT_HIPROC      0x7fffffff
  139. #define SHT_LOUSER      0x80000000
  140. #define SHT_HIUSER      0xffffffff
  141.  
  142. /**
  143.  * ELF section flags
  144.  */
  145. #define SHF_WRITE       0x1
  146. #define SHF_ALLOC       0x2
  147. #define SHF_EXECINSTR       0x4
  148. #define SHF_TLS         0x400
  149. #define SHF_MASKPROC        0xf0000000
  150.  
  151. /**
  152.  * Symbol binding
  153.  */
  154. #define STB_LOCAL       0
  155. #define STB_GLOBAL      1
  156. #define STB_WEAK        2
  157. #define STB_LOPROC      13
  158. #define STB_HIPROC      15
  159.  
  160. /**
  161.  * Symbol types
  162.  */
  163. #define STT_NOTYPE      0
  164. #define STT_OBJECT      1
  165. #define STT_FUNC        2
  166. #define STT_SECTION     3
  167. #define STT_FILE        4
  168. #define STT_LOPROC      13
  169. #define STT_HIPROC      15
  170.  
  171. /**
  172.  * Program segment types
  173.  */
  174. #define PT_NULL         0
  175. #define PT_LOAD         1
  176. #define PT_DYNAMIC      2
  177. #define PT_INTERP       3
  178. #define PT_NOTE         4
  179. #define PT_SHLIB        5
  180. #define PT_PHDR         6
  181. #define PT_LOPROC       0x70000000
  182. #define PT_HIPROC       0x7fffffff
  183.  
  184. /**
  185.  * Program segment attributes.
  186.  */
  187. #define PF_X    1
  188. #define PF_W    2
  189. #define PF_R    4
  190.  
  191. /**
  192.  * ELF data types
  193.  *
  194.  * These types are found to be identical in both 32-bit and 64-bit
  195.  * ELF object file specifications. They are the only types used
  196.  * in ELF header.
  197.  */
  198. typedef uint64_t elf_xword;
  199. typedef int64_t elf_sxword;
  200. typedef uint32_t elf_word;
  201. typedef int32_t elf_sword;
  202. typedef uint16_t elf_half;
  203.  
  204. /**
  205.  * 32-bit ELF data types.
  206.  *
  207.  * These types are specific for 32-bit format.
  208.  */
  209. typedef uint32_t elf32_addr;
  210. typedef uint32_t elf32_off;
  211.  
  212. /**
  213.  * 64-bit ELF data types.
  214.  *
  215.  * These types are specific for 64-bit format.
  216.  */
  217. typedef uint64_t elf64_addr;
  218. typedef uint64_t elf64_off;
  219.  
  220. /** ELF header */
  221. struct elf32_header {
  222.     uint8_t e_ident[EI_NIDENT];
  223.     elf_half e_type;
  224.     elf_half e_machine;
  225.     elf_word e_version;
  226.     elf32_addr e_entry;
  227.     elf32_off e_phoff;
  228.     elf32_off e_shoff;
  229.     elf_word e_flags;
  230.     elf_half e_ehsize;
  231.     elf_half e_phentsize;
  232.     elf_half e_phnum;
  233.     elf_half e_shentsize;
  234.     elf_half e_shnum;
  235.     elf_half e_shstrndx;
  236. };
  237. struct elf64_header {
  238.     uint8_t e_ident[EI_NIDENT];
  239.     elf_half e_type;
  240.     elf_half e_machine;
  241.     elf_word e_version;
  242.     elf64_addr e_entry;
  243.     elf64_off e_phoff;
  244.     elf64_off e_shoff;
  245.     elf_word e_flags;
  246.     elf_half e_ehsize;
  247.     elf_half e_phentsize;
  248.     elf_half e_phnum;
  249.     elf_half e_shentsize;
  250.     elf_half e_shnum;
  251.     elf_half e_shstrndx;
  252. };
  253.  
  254. /*
  255.  * ELF segment header.
  256.  * Segments headers are also known as program headers.
  257.  */
  258. struct elf32_segment_header {
  259.     elf_word p_type;
  260.     elf32_off p_offset;
  261.     elf32_addr p_vaddr;
  262.     elf32_addr p_paddr;
  263.     elf_word p_filesz;
  264.     elf_word p_memsz;
  265.     elf_word p_flags;
  266.     elf_word p_align;
  267. };
  268. struct elf64_segment_header {
  269.     elf_word p_type;
  270.     elf_word p_flags;
  271.     elf64_off p_offset;
  272.     elf64_addr p_vaddr;
  273.     elf64_addr p_paddr;
  274.     elf_xword p_filesz;
  275.     elf_xword p_memsz;
  276.     elf_xword p_align;
  277. };
  278.  
  279. /*
  280.  * ELF section header
  281.  */
  282. struct elf32_section_header {
  283.     elf_word sh_name;
  284.     elf_word sh_type;
  285.     elf_word sh_flags;
  286.     elf32_addr sh_addr;
  287.     elf32_off sh_offset;
  288.     elf_word sh_size;
  289.     elf_word sh_link;
  290.     elf_word sh_info;
  291.     elf_word sh_addralign;
  292.     elf_word sh_entsize;
  293. };
  294. struct elf64_section_header {
  295.     elf_word sh_name;
  296.     elf_word sh_type;
  297.     elf_xword sh_flags;
  298.     elf64_addr sh_addr;
  299.     elf64_off sh_offset;
  300.     elf_xword sh_size;
  301.     elf_word sh_link;
  302.     elf_word sh_info;
  303.     elf_xword sh_addralign;
  304.     elf_xword sh_entsize;
  305. };
  306.  
  307. /*
  308.  * ELF symbol table entry
  309.  */
  310. struct elf32_symbol {
  311.     elf_word st_name;
  312.     elf32_addr st_value;
  313.     elf_word st_size;
  314.     uint8_t st_info;
  315.     uint8_t st_other;
  316.     elf_half st_shndx;
  317. };
  318. struct elf64_symbol {
  319.     elf_word st_name;
  320.     uint8_t st_info;
  321.     uint8_t st_other;
  322.     elf_half st_shndx;
  323.     elf64_addr st_value;
  324.     elf_xword st_size;
  325. };
  326.  
  327. #ifdef __32_BITS__
  328. typedef struct elf32_header elf_header_t;
  329. typedef struct elf32_segment_header elf_segment_header_t;
  330. typedef struct elf32_section_header elf_section_header_t;
  331. typedef struct elf32_symbol elf_symbol_t;
  332. #endif
  333. #ifdef __64_BITS__
  334. typedef struct elf64_header elf_header_t;
  335. typedef struct elf64_segment_header elf_segment_header_t;
  336. typedef struct elf64_section_header elf_section_header_t;
  337. typedef struct elf64_symbol elf_symbol_t;
  338. #endif
  339.  
  340. extern char *elf_error(unsigned int rc);
  341.  
  342. /* Interpreter string used to recognize the program loader */
  343. #define ELF_INTERP_ZSTR "kernel"
  344. #define ELF_INTERP_ZLEN  sizeof(ELF_INTERP_ZSTR)
  345.  
  346. #endif
  347.  
  348. /** @}
  349.  */
  350.