Changeset bdca26a in mainline for uspace/lib/c/generic/elf/elf_mod.c
- Timestamp:
- 2019-05-26T13:21:50Z (5 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8aea932
- Parents:
- 967e7a1
- git-author:
- Matthieu Riolo <matthieu.riolo@…> (2019-05-17 14:27:34)
- git-committer:
- Jakub Jermář <jakub@…> (2019-05-26 13:21:50)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/elf/elf_mod.c
r967e7a1 rbdca26a 64 64 #define DPRINTF(...) 65 65 66 static const char *error_codes[] = { 67 "no error", 68 "invalid image", 69 "address space error", 70 "incompatible image", 71 "unsupported image type", 72 "irrecoverable error", 73 "file io error" 74 }; 75 76 static unsigned int elf_load_module(elf_ld_t *elf); 77 static int segment_header(elf_ld_t *elf, elf_segment_header_t *entry); 78 static int load_segment(elf_ld_t *elf, elf_segment_header_t *entry); 66 static errno_t elf_load_module(elf_ld_t *elf); 67 static errno_t segment_header(elf_ld_t *elf, elf_segment_header_t *entry); 68 static errno_t load_segment(elf_ld_t *elf, elf_segment_header_t *entry); 79 69 80 70 /** Load ELF binary from a file. … … 90 80 * extracted from the binary. 91 81 * 92 * @return E E_OK on success or EE_xxerror code.93 * 94 */ 95 int elf_load_file(int file, eld_flags_t flags, elf_finfo_t *info)82 * @return EOK on success or an error code. 83 * 84 */ 85 errno_t elf_load_file(int file, eld_flags_t flags, elf_finfo_t *info) 96 86 { 97 87 elf_ld_t elf; … … 103 93 } 104 94 if (rc != EOK) { 105 return EE_IO;95 return rc; 106 96 } 107 97 … … 110 100 elf.flags = flags; 111 101 112 int ret= elf_load_module(&elf);102 rc = elf_load_module(&elf); 113 103 114 104 vfs_put(ofile); 115 return r et;116 } 117 118 int elf_load_file_name(const char *path, eld_flags_t flags, elf_finfo_t *info)105 return rc; 106 } 107 108 errno_t elf_load_file_name(const char *path, eld_flags_t flags, elf_finfo_t *info) 119 109 { 120 110 int file; 121 111 errno_t rc = vfs_lookup(path, 0, &file); 122 112 if (rc == EOK) { 123 int ret= elf_load_file(file, flags, info);113 rc = elf_load_file(file, flags, info); 124 114 vfs_put(file); 125 return r et;115 return rc; 126 116 } else { 127 return E E_IO;117 return EIO; 128 118 } 129 119 } … … 136 126 * 137 127 * @param elf Pointer to loader state buffer. 138 * @return E E_OK on success or EE_xxerror code.139 */ 140 static unsigned int elf_load_module(elf_ld_t *elf)128 * @return EOK on success or an error code. 129 */ 130 static errno_t elf_load_module(elf_ld_t *elf) 141 131 { 142 132 elf_header_t header_buf; … … 144 134 aoff64_t pos = 0; 145 135 size_t nr; 146 int i , ret;136 int i; 147 137 errno_t rc; 148 138 … … 150 140 if (rc != EOK || nr != sizeof(elf_header_t)) { 151 141 DPRINTF("Read error.\n"); 152 return E E_IO;142 return EIO; 153 143 } 154 144 … … 159 149 header->e_ident[EI_MAG3] != ELFMAG3) { 160 150 DPRINTF("Invalid header.\n"); 161 return E E_INVALID;151 return EINVAL; 162 152 } 163 153 … … 169 159 header->e_ident[EI_CLASS] != ELF_CLASS) { 170 160 DPRINTF("Incompatible data/version/class.\n"); 171 return E E_INCOMPATIBLE;161 return EINVAL; 172 162 } 173 163 … … 175 165 DPRINTF("e_phentsize: %u != %zu\n", header->e_phentsize, 176 166 sizeof(elf_segment_header_t)); 177 return E E_INCOMPATIBLE;167 return EINVAL; 178 168 } 179 169 … … 181 171 if (header->e_type != ET_EXEC && header->e_type != ET_DYN) { 182 172 DPRINTF("Object type %d is not supported\n", header->e_type); 183 return E E_UNSUPPORTED;173 return ENOTSUP; 184 174 } 185 175 186 176 if (header->e_phoff == 0) { 187 177 DPRINTF("Program header table is not present!\n"); 188 return E E_UNSUPPORTED;178 return ENOTSUP; 189 179 } 190 180 … … 203 193 if (phdr_len > sizeof(phdr)) { 204 194 DPRINTF("more than %d program headers\n", phdr_cap); 205 return E E_UNSUPPORTED;195 return ENOTSUP; 206 196 } 207 197 … … 210 200 if (rc != EOK || nr != phdr_len) { 211 201 DPRINTF("Read error.\n"); 212 return E E_IO;202 return EIO; 213 203 } 214 204 … … 231 221 if (base_offset != 0) { 232 222 DPRINTF("ELF headers not present in the text segment.\n"); 233 return E E_INVALID;223 return EINVAL; 234 224 } 235 225 … … 240 230 if (module_base != 0) { 241 231 DPRINTF("Unexpected shared object format.\n"); 242 return E E_INVALID;232 return EINVAL; 243 233 } 244 234 … … 258 248 if (area == AS_MAP_FAILED) { 259 249 DPRINTF("Can't find suitable memory area.\n"); 260 return E E_MEMORY;250 return ENOMEM; 261 251 } 262 252 … … 270 260 continue; 271 261 272 r et= load_segment(elf, &phdr[i]);273 if (r et != EE_OK)274 return r et;262 rc = load_segment(elf, &phdr[i]); 263 if (rc != EOK) 264 return rc; 275 265 } 276 266 … … 292 282 continue; 293 283 294 r et= segment_header(elf, &phdr[i]);295 if (r et != EE_OK)296 return r et;284 rc = segment_header(elf, &phdr[i]); 285 if (rc != EOK) 286 return rc; 297 287 } 298 288 … … 302 292 DPRINTF("Done.\n"); 303 293 304 return EE_OK; 305 } 306 307 /** Print error message according to error code. 308 * 309 * @param rc Return code returned by elf_load(). 310 * 311 * @return NULL terminated description of error. 312 */ 313 const char *elf_error(unsigned int rc) 314 { 315 assert(rc < sizeof(error_codes) / sizeof(char *)); 316 317 return error_codes[rc]; 294 return EOK; 318 295 } 319 296 … … 338 315 * @param entry Segment header. 339 316 * 340 * @return E E_OK on success, error code otherwise.341 */ 342 static int segment_header(elf_ld_t *elf, elf_segment_header_t *entry)317 * @return EOK on success, error code otherwise. 318 */ 319 static errno_t segment_header(elf_ld_t *elf, elf_segment_header_t *entry) 343 320 { 344 321 switch (entry->p_type) { … … 358 335 if (entry->p_filesz == 0) { 359 336 DPRINTF("Zero-sized ELF interp string.\n"); 360 return E E_INVALID;337 return EINVAL; 361 338 } 362 339 if (elf->info->interp[entry->p_filesz - 1] != '\0') { 363 340 DPRINTF("Unterminated ELF interp string.\n"); 364 return E E_INVALID;341 return EINVAL; 365 342 } 366 343 DPRINTF("interpreter: \"%s\"\n", elf->info->interp); … … 389 366 default: 390 367 DPRINTF("Segment p_type %d unknown.\n", entry->p_type); 391 return E E_UNSUPPORTED;392 break; 393 } 394 return E E_OK;368 return ENOTSUP; 369 break; 370 } 371 return EOK; 395 372 } 396 373 … … 400 377 * @param entry Program header entry describing segment to be loaded. 401 378 * 402 * @return E E_OK on success, error code otherwise.403 */ 404 int load_segment(elf_ld_t *elf, elf_segment_header_t *entry)379 * @return EOK on success, error code otherwise. 380 */ 381 errno_t load_segment(elf_ld_t *elf, elf_segment_header_t *entry) 405 382 { 406 383 void *a; … … 435 412 entry->p_offset % entry->p_align, 436 413 seg_addr % entry->p_align, entry->p_align); 437 return E E_INVALID;414 return EINVAL; 438 415 } 439 416 } … … 466 443 DPRINTF("memory mapping failed (%p, %zu)\n", 467 444 (void *) (base + bias), mem_sz); 468 return E E_MEMORY;445 return ENOMEM; 469 446 } 470 447 … … 479 456 if (rc != EOK || nr != entry->p_filesz) { 480 457 DPRINTF("read error\n"); 481 return E E_IO;458 return EIO; 482 459 } 483 460 … … 487 464 */ 488 465 if ((elf->flags & ELDF_RW) != 0) 489 return E E_OK;466 return EOK; 490 467 491 468 DPRINTF("as_area_change_flags(%p, %x)\n", … … 494 471 if (rc != EOK) { 495 472 DPRINTF("Failed to set memory area flags.\n"); 496 return E E_MEMORY;473 return ENOMEM; 497 474 } 498 475 … … 500 477 /* Enforce SMC coherence for the segment */ 501 478 if (smc_coherence(seg_ptr, entry->p_filesz)) 502 return E E_MEMORY;503 } 504 505 return E E_OK;479 return ENOMEM; 480 } 481 482 return EOK; 506 483 } 507 484
Note:
See TracChangeset
for help on using the changeset viewer.