Lines Matching refs:ef

104 static int	ef_obj_get_type(elf_file_t ef);
105 static int ef_obj_close(elf_file_t ef);
106 static int ef_obj_read(elf_file_t ef, Elf_Off offset, size_t len,
108 static int ef_obj_read_entry(elf_file_t ef, Elf_Off offset, size_t len,
110 static int ef_obj_seg_read(elf_file_t ef, Elf_Off offset, size_t len,
112 static int ef_obj_seg_read_rel(elf_file_t ef, Elf_Off offset, size_t len,
114 static int ef_obj_seg_read_string(elf_file_t ef, Elf_Off offset,
116 static int ef_obj_seg_read_entry(elf_file_t ef, Elf_Off offset, size_t len,
118 static int ef_obj_seg_read_entry_rel(elf_file_t ef, Elf_Off offset,
120 static Elf_Addr ef_obj_symaddr(elf_file_t ef, Elf_Size symidx);
121 static int ef_obj_lookup_set(elf_file_t ef, const char *name, long *startp,
123 static int ef_obj_lookup_symbol(elf_file_t ef, const char* name,
142 ef_obj_get_type(elf_file_t __unused ef) in ef_obj_get_type() argument
149 ef_obj_lookup_symbol(elf_file_t ef, const char* name, Elf_Sym** sym) in ef_obj_lookup_symbol() argument
155 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) { in ef_obj_lookup_symbol()
156 strp = ef->ddbstrtab + symp->st_name; in ef_obj_lookup_symbol()
166 ef_obj_lookup_set(elf_file_t ef, const char *name, long *startp, long *stopp, in ef_obj_lookup_set() argument
171 for (i = 0; i < ef->nprogtab; i++) { in ef_obj_lookup_set()
172 if ((strncmp(ef->progtab[i].name, "set_", 4) == 0) && in ef_obj_lookup_set()
173 strcmp(ef->progtab[i].name + 4, name) == 0) { in ef_obj_lookup_set()
174 *startp = (char *)ef->progtab[i].addr - ef->address; in ef_obj_lookup_set()
175 *stopp = (char *)ef->progtab[i].addr + in ef_obj_lookup_set()
176 ef->progtab[i].size - ef->address; in ef_obj_lookup_set()
185 ef_obj_symaddr(elf_file_t ef, Elf_Size symidx) in ef_obj_symaddr() argument
189 if (symidx >= (size_t) ef->ddbsymcnt) in ef_obj_symaddr()
191 sym = ef->ddbsymtab + symidx; in ef_obj_symaddr()
194 return (sym->st_value - (Elf_Addr)ef->address); in ef_obj_symaddr()
199 ef_obj_read(elf_file_t ef, Elf_Off offset, size_t len, void *dest) in ef_obj_read() argument
204 if (lseek(ef->ef_fd, offset, SEEK_SET) == -1) in ef_obj_read()
208 r = read(ef->ef_fd, dest, len); in ef_obj_read()
216 ef_obj_read_entry(elf_file_t ef, Elf_Off offset, size_t len, void **ptr) in ef_obj_read_entry() argument
223 error = ef_obj_read(ef, offset, len, *ptr); in ef_obj_read_entry()
230 ef_obj_seg_read(elf_file_t ef, Elf_Off offset, size_t len, void *dest) in ef_obj_seg_read() argument
233 if (offset + len > ef->size) { in ef_obj_seg_read()
234 if (ef->ef_verbose) in ef_obj_seg_read()
236 ef->ef_name, (long)offset, (long)len); in ef_obj_seg_read()
239 bcopy(ef->address + offset, dest, len); in ef_obj_seg_read()
244 ef_obj_seg_read_rel(elf_file_t ef, Elf_Off offset, size_t len, void *dest) in ef_obj_seg_read_rel() argument
252 if (offset + len > ef->size) { in ef_obj_seg_read_rel()
253 if (ef->ef_verbose) in ef_obj_seg_read_rel()
255 ef->ef_name, (long)offset, (long)len); in ef_obj_seg_read_rel()
258 bcopy(ef->address + offset, dest, len); in ef_obj_seg_read_rel()
261 memaddr = ef->address + offset; in ef_obj_seg_read_rel()
264 for (i = 0; i < ef->nprogtab; i++) { in ef_obj_seg_read_rel()
265 if (ef->progtab[i].addr == NULL) in ef_obj_seg_read_rel()
267 if (memaddr < (char *)ef->progtab[i].addr || memaddr + len > in ef_obj_seg_read_rel()
268 (char *)ef->progtab[i].addr + ef->progtab[i].size) in ef_obj_seg_read_rel()
270 sec = ef->progtab[i].sec; in ef_obj_seg_read_rel()
272 secbase = (char *)ef->progtab[i].addr - ef->address; in ef_obj_seg_read_rel()
273 dataoff = memaddr - ef->address; in ef_obj_seg_read_rel()
281 for (i = 0; i < ef->nrel; i++) { in ef_obj_seg_read_rel()
282 if (ef->reltab[i].sec != sec) in ef_obj_seg_read_rel()
284 for (r = ef->reltab[i].rel; in ef_obj_seg_read_rel()
285 r < &ef->reltab[i].rel[ef->reltab[i].nrel]; r++) { in ef_obj_seg_read_rel()
286 error = ef_reloc(ef->ef_efile, r, EF_RELOC_REL, secbase, in ef_obj_seg_read_rel()
292 for (i = 0; i < ef->nrela; i++) { in ef_obj_seg_read_rel()
293 if (ef->relatab[i].sec != sec) in ef_obj_seg_read_rel()
295 for (a = ef->relatab[i].rela; in ef_obj_seg_read_rel()
296 a < &ef->relatab[i].rela[ef->relatab[i].nrela]; a++) { in ef_obj_seg_read_rel()
297 error = ef_reloc(ef->ef_efile, a, EF_RELOC_RELA, in ef_obj_seg_read_rel()
307 ef_obj_seg_read_string(elf_file_t ef, Elf_Off offset, size_t len, char *dest) in ef_obj_seg_read_string() argument
310 if (offset >= ef->size) { in ef_obj_seg_read_string()
311 if (ef->ef_verbose) in ef_obj_seg_read_string()
313 ef->ef_name, (long)offset); in ef_obj_seg_read_string()
317 if (ef->size - offset < len) in ef_obj_seg_read_string()
318 len = ef->size - offset; in ef_obj_seg_read_string()
320 if (strnlen(ef->address + offset, len) == len) in ef_obj_seg_read_string()
323 memcpy(dest, ef->address + offset, len); in ef_obj_seg_read_string()
328 ef_obj_seg_read_entry(elf_file_t ef, Elf_Off offset, size_t len, void **ptr) in ef_obj_seg_read_entry() argument
335 error = ef_obj_seg_read(ef, offset, len, *ptr); in ef_obj_seg_read_entry()
342 ef_obj_seg_read_entry_rel(elf_file_t ef, Elf_Off offset, size_t len, in ef_obj_seg_read_entry_rel() argument
350 error = ef_obj_seg_read_rel(ef, offset, len, *ptr); in ef_obj_seg_read_entry_rel()
359 elf_file_t ef; in ef_obj_open() local
374 ef = calloc(1, sizeof(*ef)); in ef_obj_open()
375 if (ef == NULL) { in ef_obj_open()
380 efile->ef_ef = ef; in ef_obj_open()
383 ef->ef_verbose = verbose; in ef_obj_open()
384 ef->ef_fd = fd; in ef_obj_open()
385 ef->ef_name = strdup(filename); in ef_obj_open()
386 ef->ef_efile = efile; in ef_obj_open()
387 hdr = (Elf_Ehdr *)&ef->ef_hdr; in ef_obj_open()
407 if (ef_obj_read_entry(ef, hdr->e_shoff, nbytes, &vtmp) != 0) { in ef_obj_open()
411 ef->e_shdr = shdr = vtmp; in ef_obj_open()
421 ef->nprogtab++; in ef_obj_open()
429 ef->nrel++; in ef_obj_open()
432 ef->nrela++; in ef_obj_open()
439 if (ef->nprogtab == 0) { in ef_obj_open()
454 if (ef->nprogtab != 0) in ef_obj_open()
455 ef->progtab = calloc(ef->nprogtab, sizeof(*ef->progtab)); in ef_obj_open()
456 if (ef->nrel != 0) in ef_obj_open()
457 ef->reltab = calloc(ef->nrel, sizeof(*ef->reltab)); in ef_obj_open()
458 if (ef->nrela != 0) in ef_obj_open()
459 ef->relatab = calloc(ef->nrela, sizeof(*ef->relatab)); in ef_obj_open()
460 if ((ef->nprogtab != 0 && ef->progtab == NULL) || in ef_obj_open()
461 (ef->nrel != 0 && ef->reltab == NULL) || in ef_obj_open()
462 (ef->nrela != 0 && ef->relatab == NULL)) { in ef_obj_open()
468 ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym); in ef_obj_open()
469 if (ef_obj_read_entry(ef, shdr[symtabindex].sh_offset, in ef_obj_open()
470 shdr[symtabindex].sh_size, (void**)&ef->ddbsymtab) != 0) { in ef_obj_open()
475 ef->ddbstrcnt = shdr[symstrindex].sh_size; in ef_obj_open()
476 if (ef_obj_read_entry(ef, shdr[symstrindex].sh_offset, in ef_obj_open()
477 shdr[symstrindex].sh_size, (void**)&ef->ddbstrtab) != 0) { in ef_obj_open()
487 ef->shstrcnt = shdr[shstrindex].sh_size; in ef_obj_open()
488 if (ef_obj_read_entry(ef, shdr[shstrindex].sh_offset, in ef_obj_open()
489 shdr[shstrindex].sh_size, (void**)&ef->shstrtab) != 0) { in ef_obj_open()
514 ef->size = mapsize; in ef_obj_open()
515 if (posix_memalign((void **)&ef->address, max_addralign, mapsize)) { in ef_obj_open()
519 mapbase = ef->address; in ef_obj_open()
536 ef->progtab[pb].addr = (void *)(uintptr_t)mapbase; in ef_obj_open()
538 ef->progtab[pb].name = "<<PROGBITS>>"; in ef_obj_open()
539 if (ef_obj_read(ef, shdr[i].sh_offset, in ef_obj_open()
541 ef->progtab[pb].addr) != 0) { in ef_obj_open()
546 ef->progtab[pb].name = "<<NOBITS>>"; in ef_obj_open()
547 bzero(ef->progtab[pb].addr, shdr[i].sh_size); in ef_obj_open()
549 ef->progtab[pb].size = shdr[i].sh_size; in ef_obj_open()
550 ef->progtab[pb].sec = i; in ef_obj_open()
551 if (ef->shstrtab && shdr[i].sh_name != 0) in ef_obj_open()
552 ef->progtab[pb].name = in ef_obj_open()
553 ef->shstrtab + shdr[i].sh_name; in ef_obj_open()
556 for (j = 0; j < ef->ddbsymcnt; j++) { in ef_obj_open()
557 es = &ef->ddbsymtab[j]; in ef_obj_open()
560 es->st_value += (Elf_Addr)ef->progtab[pb].addr; in ef_obj_open()
566 ef->reltab[rl].nrel = shdr[i].sh_size / sizeof(Elf_Rel); in ef_obj_open()
567 ef->reltab[rl].sec = shdr[i].sh_info; in ef_obj_open()
568 if (ef_obj_read_entry(ef, shdr[i].sh_offset, in ef_obj_open()
569 shdr[i].sh_size, (void**)&ef->reltab[rl].rel) != in ef_obj_open()
577 ef->relatab[ra].nrela = in ef_obj_open()
579 ef->relatab[ra].sec = shdr[i].sh_info; in ef_obj_open()
580 if (ef_obj_read_entry(ef, shdr[i].sh_offset, in ef_obj_open()
581 shdr[i].sh_size, (void**)&ef->relatab[ra].rela) != in ef_obj_open()
593 ef_obj_close(ef); in ef_obj_open()
598 ef_obj_close(elf_file_t ef) in ef_obj_close() argument
602 close(ef->ef_fd); in ef_obj_close()
603 if (ef->ef_name) in ef_obj_close()
604 free(ef->ef_name); in ef_obj_close()
605 if (ef->e_shdr != NULL) in ef_obj_close()
606 free(ef->e_shdr); in ef_obj_close()
607 if (ef->size != 0) in ef_obj_close()
608 free(ef->address); in ef_obj_close()
609 if (ef->nprogtab != 0) in ef_obj_close()
610 free(ef->progtab); in ef_obj_close()
611 if (ef->nrel != 0) { in ef_obj_close()
612 for (i = 0; i < ef->nrel; i++) in ef_obj_close()
613 if (ef->reltab[i].rel != NULL) in ef_obj_close()
614 free(ef->reltab[i].rel); in ef_obj_close()
615 free(ef->reltab); in ef_obj_close()
617 if (ef->nrela != 0) { in ef_obj_close()
618 for (i = 0; i < ef->nrela; i++) in ef_obj_close()
619 if (ef->relatab[i].rela != NULL) in ef_obj_close()
620 free(ef->relatab[i].rela); in ef_obj_close()
621 free(ef->relatab); in ef_obj_close()
623 if (ef->ddbsymtab != NULL) in ef_obj_close()
624 free(ef->ddbsymtab); in ef_obj_close()
625 if (ef->ddbstrtab != NULL) in ef_obj_close()
626 free(ef->ddbstrtab); in ef_obj_close()
627 if (ef->shstrtab != NULL) in ef_obj_close()
628 free(ef->shstrtab); in ef_obj_close()
629 ef->ef_efile->ef_ops = NULL; in ef_obj_close()
630 ef->ef_efile->ef_ef = NULL; in ef_obj_close()
631 free(ef); in ef_obj_close()