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()
491 struct reloc *reloc; in elf_add_reloc() local
493 if (!sec->reloc && !elf_create_reloc_section(elf, sec, SHT_RELA)) in elf_add_reloc()
496 reloc = malloc(sizeof(*reloc)); in elf_add_reloc()
497 if (!reloc) { in elf_add_reloc()
501 memset(reloc, 0, sizeof(*reloc)); in elf_add_reloc()
503 reloc->sec = sec->reloc; in elf_add_reloc()
504 reloc->offset = offset; in elf_add_reloc()
505 reloc->type = type; in elf_add_reloc()
506 reloc->sym = sym; in elf_add_reloc()
507 reloc->addend = addend; in elf_add_reloc()
509 list_add_tail(&reloc->list, &sec->reloc->reloc_list); in elf_add_reloc()
510 elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc)); in elf_add_reloc()
512 sec->reloc->sh.sh_size += sec->reloc->sh.sh_entsize; in elf_add_reloc()
513 sec->reloc->changed = true; in elf_add_reloc()
554 static int read_rel_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rel_reloc() argument
556 if (!gelf_getrel(sec->data, i, &reloc->rel)) { in read_rel_reloc()
560 reloc->type = GELF_R_TYPE(reloc->rel.r_info); in read_rel_reloc()
561 reloc->addend = 0; in read_rel_reloc()
562 reloc->offset = reloc->rel.r_offset; in read_rel_reloc()
563 *symndx = GELF_R_SYM(reloc->rel.r_info); in read_rel_reloc()
567 static int read_rela_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rela_reloc() argument
569 if (!gelf_getrela(sec->data, i, &reloc->rela)) { in read_rela_reloc()
573 reloc->type = GELF_R_TYPE(reloc->rela.r_info); in read_rela_reloc()
574 reloc->addend = reloc->rela.r_addend; in read_rela_reloc()
575 reloc->offset = reloc->rela.r_offset; in read_rela_reloc()
576 *symndx = GELF_R_SYM(reloc->rela.r_info); in read_rela_reloc()
583 struct reloc *reloc; in read_relocs() local
588 if (!elf_alloc_hash(reloc, elf->text_size / 16)) in read_relocs()
603 sec->base->reloc = sec; in read_relocs()
607 reloc = malloc(sizeof(*reloc)); in read_relocs()
608 if (!reloc) { in read_relocs()
612 memset(reloc, 0, sizeof(*reloc)); in read_relocs()
615 if (read_rel_reloc(sec, i, reloc, &symndx)) in read_relocs()
619 if (read_rela_reloc(sec, i, reloc, &symndx)) in read_relocs()
625 reloc->sec = sec; in read_relocs()
626 reloc->idx = i; in read_relocs()
627 reloc->sym = find_symbol_by_index(elf, symndx); in read_relocs()
628 if (!reloc->sym) { in read_relocs()
634 list_add_tail(&reloc->list, &sec->reloc_list); in read_relocs()
635 elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc)); in read_relocs()
845 base->reloc = sec; in elf_create_rel_reloc_section()
875 base->reloc = sec; in elf_create_rela_reloc_section()
900 struct reloc *reloc; in elf_rebuild_rel_reloc_section() local
916 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rel_reloc_section()
917 reloc->rel.r_offset = reloc->offset; in elf_rebuild_rel_reloc_section()
918 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rel_reloc_section()
919 if (!gelf_update_rel(sec->data, idx, &reloc->rel)) { in elf_rebuild_rel_reloc_section()
931 struct reloc *reloc; in elf_rebuild_rela_reloc_section() local
947 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rela_reloc_section()
948 reloc->rela.r_offset = reloc->offset; in elf_rebuild_rela_reloc_section()
949 reloc->rela.r_addend = reloc->addend; in elf_rebuild_rela_reloc_section()
950 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rela_reloc_section()
951 if (!gelf_update_rela(sec->data, idx, &reloc->rela)) { in elf_rebuild_rela_reloc_section()
989 int elf_write_reloc(struct elf *elf, struct reloc *reloc) in elf_write_reloc() argument
991 struct section *sec = reloc->sec; in elf_write_reloc()
994 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
995 reloc->rel.r_offset = reloc->offset; in elf_write_reloc()
997 if (!gelf_update_rel(sec->data, reloc->idx, &reloc->rel)) { in elf_write_reloc()
1002 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
1003 reloc->rela.r_addend = reloc->addend; in elf_write_reloc()
1004 reloc->rela.r_offset = reloc->offset; in elf_write_reloc()
1006 if (!gelf_update_rela(sec->data, reloc->idx, &reloc->rela)) { in elf_write_reloc()
1064 struct reloc *reloc, *tmpreloc; in elf_close() local
1078 list_for_each_entry_safe(reloc, tmpreloc, &sec->reloc_list, list) { in elf_close()
1079 list_del(&reloc->list); in elf_close()
1080 hash_del(&reloc->hash); in elf_close()
1081 free(reloc); in elf_close()