Lines Matching refs:reloc

191 struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *sec,  in find_reloc_by_dest_range()
194 struct reloc *reloc, *r = NULL; in find_reloc_by_dest_range() local
197 if (!sec->reloc) in find_reloc_by_dest_range()
200 sec = sec->reloc; in find_reloc_by_dest_range()
203 elf_hash_for_each_possible(reloc, reloc, hash, in find_reloc_by_dest_range()
205 if (reloc->sec != sec) in find_reloc_by_dest_range()
208 if (reloc->offset >= offset && reloc->offset < offset + len) { in find_reloc_by_dest_range()
209 if (!r || reloc->offset < r->offset) in find_reloc_by_dest_range()
210 r = reloc; in find_reloc_by_dest_range()
220 struct reloc *find_reloc_by_dest(const struct elf *elf, struct section *sec, unsigned long offset) in find_reloc_by_dest()
490 struct reloc *reloc; in elf_add_reloc() local
492 if (!sec->reloc && !elf_create_reloc_section(elf, sec, SHT_RELA)) in elf_add_reloc()
495 reloc = malloc(sizeof(*reloc)); in elf_add_reloc()
496 if (!reloc) { in elf_add_reloc()
500 memset(reloc, 0, sizeof(*reloc)); in elf_add_reloc()
502 reloc->sec = sec->reloc; in elf_add_reloc()
503 reloc->offset = offset; in elf_add_reloc()
504 reloc->type = type; in elf_add_reloc()
505 reloc->sym = sym; in elf_add_reloc()
506 reloc->addend = addend; in elf_add_reloc()
508 list_add_tail(&reloc->list, &sec->reloc->reloc_list); in elf_add_reloc()
509 elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc)); in elf_add_reloc()
511 sec->reloc->sh.sh_size += sec->reloc->sh.sh_entsize; in elf_add_reloc()
512 sec->reloc->changed = true; in elf_add_reloc()
553 static int read_rel_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rel_reloc() argument
555 if (!gelf_getrel(sec->data, i, &reloc->rel)) { in read_rel_reloc()
559 reloc->type = GELF_R_TYPE(reloc->rel.r_info); in read_rel_reloc()
560 reloc->addend = 0; in read_rel_reloc()
561 reloc->offset = reloc->rel.r_offset; in read_rel_reloc()
562 *symndx = GELF_R_SYM(reloc->rel.r_info); in read_rel_reloc()
566 static int read_rela_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rela_reloc() argument
568 if (!gelf_getrela(sec->data, i, &reloc->rela)) { in read_rela_reloc()
572 reloc->type = GELF_R_TYPE(reloc->rela.r_info); in read_rela_reloc()
573 reloc->addend = reloc->rela.r_addend; in read_rela_reloc()
574 reloc->offset = reloc->rela.r_offset; in read_rela_reloc()
575 *symndx = GELF_R_SYM(reloc->rela.r_info); in read_rela_reloc()
582 struct reloc *reloc; in read_relocs() local
587 if (!elf_alloc_hash(reloc, elf->text_size / 16)) in read_relocs()
602 sec->base->reloc = sec; in read_relocs()
606 reloc = malloc(sizeof(*reloc)); in read_relocs()
607 if (!reloc) { in read_relocs()
611 memset(reloc, 0, sizeof(*reloc)); in read_relocs()
614 if (read_rel_reloc(sec, i, reloc, &symndx)) in read_relocs()
618 if (read_rela_reloc(sec, i, reloc, &symndx)) in read_relocs()
624 reloc->sec = sec; in read_relocs()
625 reloc->idx = i; in read_relocs()
626 reloc->sym = find_symbol_by_index(elf, symndx); in read_relocs()
627 if (!reloc->sym) { in read_relocs()
633 list_add_tail(&reloc->list, &sec->reloc_list); in read_relocs()
634 elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc)); in read_relocs()
928 base->reloc = sec; in elf_create_rel_reloc_section()
958 base->reloc = sec; in elf_create_rela_reloc_section()
983 struct reloc *reloc; in elf_rebuild_rel_reloc_section() local
999 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rel_reloc_section()
1000 reloc->rel.r_offset = reloc->offset; in elf_rebuild_rel_reloc_section()
1001 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rel_reloc_section()
1002 if (!gelf_update_rel(sec->data, idx, &reloc->rel)) { in elf_rebuild_rel_reloc_section()
1014 struct reloc *reloc; in elf_rebuild_rela_reloc_section() local
1030 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rela_reloc_section()
1031 reloc->rela.r_offset = reloc->offset; in elf_rebuild_rela_reloc_section()
1032 reloc->rela.r_addend = reloc->addend; in elf_rebuild_rela_reloc_section()
1033 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rela_reloc_section()
1034 if (!gelf_update_rela(sec->data, idx, &reloc->rela)) { in elf_rebuild_rela_reloc_section()
1072 int elf_write_reloc(struct elf *elf, struct reloc *reloc) in elf_write_reloc() argument
1074 struct section *sec = reloc->sec; in elf_write_reloc()
1077 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
1078 reloc->rel.r_offset = reloc->offset; in elf_write_reloc()
1080 if (!gelf_update_rel(sec->data, reloc->idx, &reloc->rel)) { in elf_write_reloc()
1085 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
1086 reloc->rela.r_addend = reloc->addend; in elf_write_reloc()
1087 reloc->rela.r_offset = reloc->offset; in elf_write_reloc()
1089 if (!gelf_update_rela(sec->data, reloc->idx, &reloc->rela)) { in elf_write_reloc()
1147 struct reloc *reloc, *tmpreloc; in elf_close() local
1161 list_for_each_entry_safe(reloc, tmpreloc, &sec->reloc_list, list) { in elf_close()
1162 list_del(&reloc->list); in elf_close()
1163 hash_del(&reloc->hash); in elf_close()
1164 free(reloc); in elf_close()