Lines Matching refs:reloc
232 struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *sec, in find_reloc_by_dest_range()
235 struct reloc *reloc, *r = NULL; in find_reloc_by_dest_range() local
238 if (!sec->reloc) in find_reloc_by_dest_range()
241 sec = sec->reloc; in find_reloc_by_dest_range()
244 elf_hash_for_each_possible(reloc, reloc, hash, in find_reloc_by_dest_range()
246 if (reloc->sec != sec) in find_reloc_by_dest_range()
249 if (reloc->offset >= offset && reloc->offset < offset + len) { in find_reloc_by_dest_range()
250 if (!r || reloc->offset < r->offset) in find_reloc_by_dest_range()
251 r = reloc; in find_reloc_by_dest_range()
261 struct reloc *find_reloc_by_dest(const struct elf *elf, struct section *sec, unsigned long offset) in find_reloc_by_dest()
543 struct reloc *reloc; in elf_add_reloc() local
545 if (!sec->reloc && !elf_create_reloc_section(elf, sec, SHT_RELA)) in elf_add_reloc()
548 reloc = malloc(sizeof(*reloc)); in elf_add_reloc()
549 if (!reloc) { in elf_add_reloc()
553 memset(reloc, 0, sizeof(*reloc)); in elf_add_reloc()
555 reloc->sec = sec->reloc; in elf_add_reloc()
556 reloc->offset = offset; in elf_add_reloc()
557 reloc->type = type; in elf_add_reloc()
558 reloc->sym = sym; in elf_add_reloc()
559 reloc->addend = addend; in elf_add_reloc()
561 list_add_tail(&reloc->sym_reloc_entry, &sym->reloc_list); in elf_add_reloc()
562 list_add_tail(&reloc->list, &sec->reloc->reloc_list); in elf_add_reloc()
563 elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc)); in elf_add_reloc()
565 sec->reloc->sh.sh_size += sec->reloc->sh.sh_entsize; in elf_add_reloc()
566 sec->reloc->changed = true; in elf_add_reloc()
578 struct reloc *reloc; in elf_dirty_reloc_sym() local
580 list_for_each_entry(reloc, &sym->reloc_list, sym_reloc_entry) in elf_dirty_reloc_sym()
581 reloc->sec->changed = true; in elf_dirty_reloc_sym()
868 static int read_rel_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rel_reloc() argument
870 if (!gelf_getrel(sec->data, i, &reloc->rel)) { in read_rel_reloc()
874 reloc->type = GELF_R_TYPE(reloc->rel.r_info); in read_rel_reloc()
875 reloc->addend = 0; in read_rel_reloc()
876 reloc->offset = reloc->rel.r_offset; in read_rel_reloc()
877 *symndx = GELF_R_SYM(reloc->rel.r_info); in read_rel_reloc()
881 static int read_rela_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rela_reloc() argument
883 if (!gelf_getrela(sec->data, i, &reloc->rela)) { in read_rela_reloc()
887 reloc->type = GELF_R_TYPE(reloc->rela.r_info); in read_rela_reloc()
888 reloc->addend = reloc->rela.r_addend; in read_rela_reloc()
889 reloc->offset = reloc->rela.r_offset; in read_rela_reloc()
890 *symndx = GELF_R_SYM(reloc->rela.r_info); in read_rela_reloc()
898 struct reloc *reloc; in read_relocs() local
903 if (!elf_alloc_hash(reloc, elf->text_size / 16)) in read_relocs()
918 sec->base->reloc = sec; in read_relocs()
921 sec->reloc_data = calloc(sec->sh.sh_size / sec->sh.sh_entsize, sizeof(*reloc)); in read_relocs()
927 reloc = &sec->reloc_data[i]; in read_relocs()
930 if (read_rel_reloc(sec, i, reloc, &symndx)) in read_relocs()
934 if (read_rela_reloc(sec, i, reloc, &symndx)) in read_relocs()
940 reloc->sec = sec; in read_relocs()
941 reloc->idx = i; in read_relocs()
942 reloc->sym = sym = find_symbol_by_index(elf, symndx); in read_relocs()
943 if (!reloc->sym) { in read_relocs()
949 list_add_tail(&reloc->sym_reloc_entry, &sym->reloc_list); in read_relocs()
950 list_add_tail(&reloc->list, &sec->reloc_list); in read_relocs()
951 elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc)); in read_relocs()
1161 base->reloc = sec; in elf_create_rel_reloc_section()
1195 base->reloc = sec; in elf_create_rela_reloc_section()
1220 struct reloc *reloc; in elf_rebuild_rel_reloc_section() local
1236 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rel_reloc_section()
1237 reloc->rel.r_offset = reloc->offset; in elf_rebuild_rel_reloc_section()
1238 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rel_reloc_section()
1239 if (!gelf_update_rel(sec->data, idx, &reloc->rel)) { in elf_rebuild_rel_reloc_section()
1251 struct reloc *reloc; in elf_rebuild_rela_reloc_section() local
1267 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rela_reloc_section()
1268 reloc->rela.r_offset = reloc->offset; in elf_rebuild_rela_reloc_section()
1269 reloc->rela.r_addend = reloc->addend; in elf_rebuild_rela_reloc_section()
1270 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rela_reloc_section()
1271 if (!gelf_update_rela(sec->data, idx, &reloc->rela)) { in elf_rebuild_rela_reloc_section()
1309 int elf_write_reloc(struct elf *elf, struct reloc *reloc) in elf_write_reloc() argument
1311 struct section *sec = reloc->sec; in elf_write_reloc()
1314 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
1315 reloc->rel.r_offset = reloc->offset; in elf_write_reloc()
1317 if (!gelf_update_rel(sec->data, reloc->idx, &reloc->rel)) { in elf_write_reloc()
1322 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
1323 reloc->rela.r_addend = reloc->addend; in elf_write_reloc()
1324 reloc->rela.r_offset = reloc->offset; in elf_write_reloc()
1326 if (!gelf_update_rela(sec->data, reloc->idx, &reloc->rela)) { in elf_write_reloc()
1444 struct reloc *reloc, *tmpreloc; in elf_close() local
1457 list_for_each_entry_safe(reloc, tmpreloc, &sec->reloc_list, list) { in elf_close()
1458 list_del(&reloc->list); in elf_close()
1459 hash_del(&reloc->hash); in elf_close()