Changeset 75dd55d in mainline for kernel/generic/src/lib/elf.c
- Timestamp:
- 2007-10-26T19:34:27Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a228687
- Parents:
- c4e75ea
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/lib/elf.c
rc4e75ea r75dd55d 57 57 }; 58 58 59 static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, as_t *as); 60 static int section_header(elf_section_header_t *entry, elf_header_t *elf, as_t *as); 61 static int load_segment(elf_segment_header_t *entry, elf_header_t *elf, as_t *as); 59 static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, 60 as_t *as); 61 static int section_header(elf_section_header_t *entry, elf_header_t *elf, 62 as_t *as); 63 static int load_segment(elf_segment_header_t *entry, elf_header_t *elf, 64 as_t *as); 62 65 63 66 /** ELF loader … … 72 75 73 76 /* Identify ELF */ 74 if (header->e_ident[EI_MAG0] != ELFMAG0 || header->e_ident[EI_MAG1] != ELFMAG1 || 75 header->e_ident[EI_MAG2] != ELFMAG2 || header->e_ident[EI_MAG3] != ELFMAG3) { 77 if (header->e_ident[EI_MAG0] != ELFMAG0 || 78 header->e_ident[EI_MAG1] != ELFMAG1 || 79 header->e_ident[EI_MAG2] != ELFMAG2 || 80 header->e_ident[EI_MAG3] != ELFMAG3) { 76 81 return EE_INVALID; 77 82 } 78 83 79 84 /* Identify ELF compatibility */ 80 if (header->e_ident[EI_DATA] != ELF_DATA_ENCODING || header->e_machine != ELF_MACHINE || 81 header->e_ident[EI_VERSION] != EV_CURRENT || header->e_version != EV_CURRENT || 85 if (header->e_ident[EI_DATA] != ELF_DATA_ENCODING || 86 header->e_machine != ELF_MACHINE || 87 header->e_ident[EI_VERSION] != EV_CURRENT || 88 header->e_version != EV_CURRENT || 82 89 header->e_ident[EI_CLASS] != ELF_CLASS) { 83 90 return EE_INCOMPATIBLE; … … 96 103 /* Walk through all segment headers and process them. */ 97 104 for (i = 0; i < header->e_phnum; i++) { 98 rc = segment_header(&((elf_segment_header_t *)(((uint8_t *) header) + header->e_phoff))[i], header, as); 105 elf_segment_header_t *seghdr; 106 107 seghdr = &((elf_segment_header_t *)(((uint8_t *) header) + 108 header->e_phoff))[i]; 109 rc = segment_header(seghdr, header, as); 99 110 if (rc != EE_OK) 100 111 return rc; … … 103 114 /* Inspect all section headers and proccess them. */ 104 115 for (i = 0; i < header->e_shnum; i++) { 105 rc = section_header(&((elf_section_header_t *)(((uint8_t *) header) + header->e_shoff))[i], header, as); 116 elf_section_header_t *sechdr; 117 118 sechdr = &((elf_section_header_t *)(((uint8_t *) header) + 119 header->e_shoff))[i]; 120 rc = section_header(sechdr, header, as); 106 121 if (rc != EE_OK) 107 122 return rc; … … 119 134 char *elf_error(int rc) 120 135 { 121 ASSERT(rc < sizeof(error_codes) /sizeof(char *));136 ASSERT(rc < sizeof(error_codes) / sizeof(char *)); 122 137 123 138 return error_codes[rc]; … … 132 147 * @return EE_OK on success, error code otherwise. 133 148 */ 134 static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, as_t *as) 149 static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, 150 as_t *as) 135 151 { 136 152 switch (entry->p_type) { … … 172 188 173 189 if (entry->p_align > 1) { 174 if ((entry->p_offset % entry->p_align) != (entry->p_vaddr % entry->p_align)) { 190 if ((entry->p_offset % entry->p_align) != 191 (entry->p_vaddr % entry->p_align)) { 175 192 return EE_INVALID; 176 193 } … … 191 208 return EE_UNSUPPORTED; 192 209 193 a = as_area_create(as, flags, entry->p_memsz, entry->p_vaddr, AS_AREA_ATTR_NONE,194 210 a = as_area_create(as, flags, entry->p_memsz, entry->p_vaddr, 211 AS_AREA_ATTR_NONE, &elf_backend, &backend_data); 195 212 if (!a) 196 213 return EE_MEMORY; … … 211 228 * @return EE_OK on success, error code otherwise. 212 229 */ 213 static int section_header(elf_section_header_t *entry, elf_header_t *elf, as_t *as) 230 static int section_header(elf_section_header_t *entry, elf_header_t *elf, 231 as_t *as) 214 232 { 215 233 switch (entry->sh_type) { 234 case SHT_PROGBITS: 235 if (entry->sh_flags & SHF_TLS) { 236 /* .tdata */ 237 } 238 break; 239 case SHT_NOBITS: 240 if (entry->sh_flags & SHF_TLS) { 241 /* .tbss */ 242 } 243 break; 216 244 default: 217 245 break;
Note:
See TracChangeset
for help on using the changeset viewer.