Lines Matching refs:reloc
231 struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *sec, in find_reloc_by_dest_range()
234 struct reloc *reloc, *r = NULL; in find_reloc_by_dest_range() local
237 if (!sec->reloc) in find_reloc_by_dest_range()
240 sec = sec->reloc; in find_reloc_by_dest_range()
243 elf_hash_for_each_possible(elf->reloc_hash, reloc, hash, in find_reloc_by_dest_range()
245 if (reloc->sec != sec) in find_reloc_by_dest_range()
248 if (reloc->offset >= offset && reloc->offset < offset + len) { in find_reloc_by_dest_range()
249 if (!r || reloc->offset < r->offset) in find_reloc_by_dest_range()
250 r = reloc; in find_reloc_by_dest_range()
260 struct reloc *find_reloc_by_dest(const struct elf *elf, struct section *sec, unsigned long offset) in find_reloc_by_dest()
491 void elf_add_reloc(struct elf *elf, struct reloc *reloc) in elf_add_reloc() argument
493 struct section *sec = reloc->sec; in elf_add_reloc()
495 list_add_tail(&reloc->list, &sec->reloc_list); in elf_add_reloc()
496 elf_hash_add(elf->reloc_hash, &reloc->hash, reloc_hash(reloc)); in elf_add_reloc()
499 static int read_rel_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rel_reloc() argument
501 if (!gelf_getrel(sec->data, i, &reloc->rel)) { in read_rel_reloc()
505 reloc->type = GELF_R_TYPE(reloc->rel.r_info); in read_rel_reloc()
506 reloc->addend = 0; in read_rel_reloc()
507 reloc->offset = reloc->rel.r_offset; in read_rel_reloc()
508 *symndx = GELF_R_SYM(reloc->rel.r_info); in read_rel_reloc()
512 static int read_rela_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rela_reloc() argument
514 if (!gelf_getrela(sec->data, i, &reloc->rela)) { in read_rela_reloc()
518 reloc->type = GELF_R_TYPE(reloc->rela.r_info); in read_rela_reloc()
519 reloc->addend = reloc->rela.r_addend; in read_rela_reloc()
520 reloc->offset = reloc->rela.r_offset; in read_rela_reloc()
521 *symndx = GELF_R_SYM(reloc->rela.r_info); in read_rela_reloc()
528 struct reloc *reloc; in read_relocs() local
545 sec->base->reloc = sec; in read_relocs()
549 reloc = malloc(sizeof(*reloc)); in read_relocs()
550 if (!reloc) { in read_relocs()
554 memset(reloc, 0, sizeof(*reloc)); in read_relocs()
557 if (read_rel_reloc(sec, i, reloc, &symndx)) in read_relocs()
561 if (read_rela_reloc(sec, i, reloc, &symndx)) in read_relocs()
567 reloc->sec = sec; in read_relocs()
568 reloc->idx = i; in read_relocs()
569 reloc->sym = find_symbol_by_index(elf, symndx); in read_relocs()
570 if (!reloc->sym) { in read_relocs()
576 elf_add_reloc(elf, reloc); in read_relocs()
775 base->reloc = sec; in elf_create_rel_reloc_section()
805 base->reloc = sec; in elf_create_rela_reloc_section()
830 struct reloc *reloc; in elf_rebuild_rel_reloc_section() local
848 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rel_reloc_section()
849 relocs[idx].r_offset = reloc->offset; in elf_rebuild_rel_reloc_section()
850 relocs[idx].r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rel_reloc_section()
859 struct reloc *reloc; in elf_rebuild_rela_reloc_section() local
877 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rela_reloc_section()
878 relocs[idx].r_offset = reloc->offset; in elf_rebuild_rela_reloc_section()
879 relocs[idx].r_addend = reloc->addend; in elf_rebuild_rela_reloc_section()
880 relocs[idx].r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rela_reloc_section()
889 struct reloc *reloc; in elf_rebuild_reloc_section() local
896 list_for_each_entry(reloc, &sec->reloc_list, list) in elf_rebuild_reloc_section()
925 int elf_write_reloc(struct elf *elf, struct reloc *reloc) in elf_write_reloc() argument
927 struct section *sec = reloc->sec; in elf_write_reloc()
930 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
931 reloc->rel.r_offset = reloc->offset; in elf_write_reloc()
933 if (!gelf_update_rel(sec->data, reloc->idx, &reloc->rel)) { in elf_write_reloc()
938 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
939 reloc->rela.r_addend = reloc->addend; in elf_write_reloc()
940 reloc->rela.r_offset = reloc->offset; in elf_write_reloc()
942 if (!gelf_update_rela(sec->data, reloc->idx, &reloc->rela)) { in elf_write_reloc()
993 struct reloc *reloc, *tmpreloc; in elf_close() local
1007 list_for_each_entry_safe(reloc, tmpreloc, &sec->reloc_list, list) { in elf_close()
1008 list_del(&reloc->list); in elf_close()
1009 hash_del(&reloc->hash); in elf_close()
1010 free(reloc); in elf_close()