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()
515 struct reloc *reloc; in elf_add_reloc() local
517 if (!sec->reloc && !elf_create_reloc_section(elf, sec, SHT_RELA)) in elf_add_reloc()
520 reloc = malloc(sizeof(*reloc)); in elf_add_reloc()
521 if (!reloc) { in elf_add_reloc()
525 memset(reloc, 0, sizeof(*reloc)); in elf_add_reloc()
527 reloc->sec = sec->reloc; in elf_add_reloc()
528 reloc->offset = offset; in elf_add_reloc()
529 reloc->type = type; in elf_add_reloc()
530 reloc->sym = sym; in elf_add_reloc()
531 reloc->addend = addend; in elf_add_reloc()
533 list_add_tail(&reloc->list, &sec->reloc->reloc_list); in elf_add_reloc()
534 elf_hash_add(elf->reloc_hash, &reloc->hash, reloc_hash(reloc)); in elf_add_reloc()
536 sec->reloc->changed = true; in elf_add_reloc()
551 struct reloc *reloc; in elf_dirty_reloc_sym() local
556 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_dirty_reloc_sym()
557 if (reloc->sym == sym) { in elf_dirty_reloc_sym()
784 static int read_rel_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rel_reloc() argument
786 if (!gelf_getrel(sec->data, i, &reloc->rel)) { in read_rel_reloc()
790 reloc->type = GELF_R_TYPE(reloc->rel.r_info); in read_rel_reloc()
791 reloc->addend = 0; in read_rel_reloc()
792 reloc->offset = reloc->rel.r_offset; in read_rel_reloc()
793 *symndx = GELF_R_SYM(reloc->rel.r_info); in read_rel_reloc()
797 static int read_rela_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rela_reloc() argument
799 if (!gelf_getrela(sec->data, i, &reloc->rela)) { in read_rela_reloc()
803 reloc->type = GELF_R_TYPE(reloc->rela.r_info); in read_rela_reloc()
804 reloc->addend = reloc->rela.r_addend; in read_rela_reloc()
805 reloc->offset = reloc->rela.r_offset; in read_rela_reloc()
806 *symndx = GELF_R_SYM(reloc->rela.r_info); in read_rela_reloc()
813 struct reloc *reloc; in read_relocs() local
830 sec->base->reloc = sec; in read_relocs()
834 reloc = malloc(sizeof(*reloc)); in read_relocs()
835 if (!reloc) { in read_relocs()
839 memset(reloc, 0, sizeof(*reloc)); in read_relocs()
842 if (read_rel_reloc(sec, i, reloc, &symndx)) in read_relocs()
846 if (read_rela_reloc(sec, i, reloc, &symndx)) in read_relocs()
852 reloc->sec = sec; in read_relocs()
853 reloc->idx = i; in read_relocs()
854 reloc->sym = find_symbol_by_index(elf, symndx); in read_relocs()
855 if (!reloc->sym) { in read_relocs()
861 list_add_tail(&reloc->list, &sec->reloc_list); in read_relocs()
862 elf_hash_add(elf->reloc_hash, &reloc->hash, reloc_hash(reloc)); in read_relocs()
1079 base->reloc = sec; in elf_create_rel_reloc_section()
1109 base->reloc = sec; in elf_create_rela_reloc_section()
1134 struct reloc *reloc; in elf_rebuild_rel_reloc_section() local
1152 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rel_reloc_section()
1153 relocs[idx].r_offset = reloc->offset; in elf_rebuild_rel_reloc_section()
1154 relocs[idx].r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rel_reloc_section()
1163 struct reloc *reloc; in elf_rebuild_rela_reloc_section() local
1181 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rela_reloc_section()
1182 relocs[idx].r_offset = reloc->offset; in elf_rebuild_rela_reloc_section()
1183 relocs[idx].r_addend = reloc->addend; in elf_rebuild_rela_reloc_section()
1184 relocs[idx].r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rela_reloc_section()
1193 struct reloc *reloc; in elf_rebuild_reloc_section() local
1197 list_for_each_entry(reloc, &sec->reloc_list, list) in elf_rebuild_reloc_section()
1226 int elf_write_reloc(struct elf *elf, struct reloc *reloc) in elf_write_reloc() argument
1228 struct section *sec = reloc->sec; in elf_write_reloc()
1231 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
1232 reloc->rel.r_offset = reloc->offset; in elf_write_reloc()
1234 if (!gelf_update_rel(sec->data, reloc->idx, &reloc->rel)) { in elf_write_reloc()
1239 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
1240 reloc->rela.r_addend = reloc->addend; in elf_write_reloc()
1241 reloc->rela.r_offset = reloc->offset; in elf_write_reloc()
1243 if (!gelf_update_rela(sec->data, reloc->idx, &reloc->rela)) { in elf_write_reloc()
1301 struct reloc *reloc, *tmpreloc; in elf_close() local
1315 list_for_each_entry_safe(reloc, tmpreloc, &sec->reloc_list, list) { in elf_close()
1316 list_del(&reloc->list); in elf_close()
1317 hash_del(&reloc->hash); in elf_close()
1318 free(reloc); in elf_close()