Lines Matching refs:reloc
251 struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *sec, in find_reloc_by_dest_range()
254 struct reloc *reloc, *r = NULL; in find_reloc_by_dest_range() local
257 if (!sec->reloc) in find_reloc_by_dest_range()
260 sec = sec->reloc; in find_reloc_by_dest_range()
263 elf_hash_for_each_possible(reloc, reloc, hash, in find_reloc_by_dest_range()
265 if (reloc->sec != sec) in find_reloc_by_dest_range()
268 if (reloc->offset >= offset && reloc->offset < offset + len) { in find_reloc_by_dest_range()
269 if (!r || reloc->offset < r->offset) in find_reloc_by_dest_range()
270 r = reloc; in find_reloc_by_dest_range()
280 struct reloc *find_reloc_by_dest(const struct elf *elf, struct section *sec, unsigned long offset) in find_reloc_by_dest()
555 struct reloc *reloc; in elf_add_reloc() local
557 if (!sec->reloc && !elf_create_reloc_section(elf, sec, SHT_RELA)) in elf_add_reloc()
560 reloc = malloc(sizeof(*reloc)); in elf_add_reloc()
561 if (!reloc) { in elf_add_reloc()
565 memset(reloc, 0, sizeof(*reloc)); in elf_add_reloc()
567 reloc->sec = sec->reloc; in elf_add_reloc()
568 reloc->offset = offset; in elf_add_reloc()
569 reloc->type = type; in elf_add_reloc()
570 reloc->sym = sym; in elf_add_reloc()
571 reloc->addend = addend; in elf_add_reloc()
573 list_add_tail(&reloc->list, &sec->reloc->reloc_list); in elf_add_reloc()
574 elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc)); in elf_add_reloc()
576 sec->reloc->sh.sh_size += sec->reloc->sh.sh_entsize; in elf_add_reloc()
577 sec->reloc->changed = true; in elf_add_reloc()
592 struct reloc *reloc; in elf_dirty_reloc_sym() local
597 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_dirty_reloc_sym()
598 if (reloc->sym == sym) { in elf_dirty_reloc_sym()
825 static int read_rel_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rel_reloc() argument
827 if (!gelf_getrel(sec->data, i, &reloc->rel)) { in read_rel_reloc()
831 reloc->type = GELF_R_TYPE(reloc->rel.r_info); in read_rel_reloc()
832 reloc->addend = 0; in read_rel_reloc()
833 reloc->offset = reloc->rel.r_offset; in read_rel_reloc()
834 *symndx = GELF_R_SYM(reloc->rel.r_info); in read_rel_reloc()
838 static int read_rela_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx) in read_rela_reloc() argument
840 if (!gelf_getrela(sec->data, i, &reloc->rela)) { in read_rela_reloc()
844 reloc->type = GELF_R_TYPE(reloc->rela.r_info); in read_rela_reloc()
845 reloc->addend = reloc->rela.r_addend; in read_rela_reloc()
846 reloc->offset = reloc->rela.r_offset; in read_rela_reloc()
847 *symndx = GELF_R_SYM(reloc->rela.r_info); in read_rela_reloc()
854 struct reloc *reloc; in read_relocs() local
859 if (!elf_alloc_hash(reloc, elf->text_size / 16)) in read_relocs()
874 sec->base->reloc = sec; in read_relocs()
878 reloc = malloc(sizeof(*reloc)); in read_relocs()
879 if (!reloc) { in read_relocs()
883 memset(reloc, 0, sizeof(*reloc)); in read_relocs()
886 if (read_rel_reloc(sec, i, reloc, &symndx)) in read_relocs()
890 if (read_rela_reloc(sec, i, reloc, &symndx)) in read_relocs()
896 reloc->sec = sec; in read_relocs()
897 reloc->idx = i; in read_relocs()
898 reloc->sym = find_symbol_by_index(elf, symndx); in read_relocs()
899 if (!reloc->sym) { in read_relocs()
905 list_add_tail(&reloc->list, &sec->reloc_list); in read_relocs()
906 elf_hash_add(reloc, &reloc->hash, reloc_hash(reloc)); in read_relocs()
1116 base->reloc = sec; in elf_create_rel_reloc_section()
1146 base->reloc = sec; in elf_create_rela_reloc_section()
1171 struct reloc *reloc; in elf_rebuild_rel_reloc_section() local
1187 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rel_reloc_section()
1188 reloc->rel.r_offset = reloc->offset; in elf_rebuild_rel_reloc_section()
1189 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rel_reloc_section()
1190 if (!gelf_update_rel(sec->data, idx, &reloc->rel)) { in elf_rebuild_rel_reloc_section()
1202 struct reloc *reloc; in elf_rebuild_rela_reloc_section() local
1218 list_for_each_entry(reloc, &sec->reloc_list, list) { in elf_rebuild_rela_reloc_section()
1219 reloc->rela.r_offset = reloc->offset; in elf_rebuild_rela_reloc_section()
1220 reloc->rela.r_addend = reloc->addend; in elf_rebuild_rela_reloc_section()
1221 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_rebuild_rela_reloc_section()
1222 if (!gelf_update_rela(sec->data, idx, &reloc->rela)) { in elf_rebuild_rela_reloc_section()
1260 int elf_write_reloc(struct elf *elf, struct reloc *reloc) in elf_write_reloc() argument
1262 struct section *sec = reloc->sec; in elf_write_reloc()
1265 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
1266 reloc->rel.r_offset = reloc->offset; in elf_write_reloc()
1268 if (!gelf_update_rel(sec->data, reloc->idx, &reloc->rel)) { in elf_write_reloc()
1273 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type); in elf_write_reloc()
1274 reloc->rela.r_addend = reloc->addend; in elf_write_reloc()
1275 reloc->rela.r_offset = reloc->offset; in elf_write_reloc()
1277 if (!gelf_update_rela(sec->data, reloc->idx, &reloc->rela)) { in elf_write_reloc()
1338 struct reloc *reloc, *tmpreloc; in elf_close() local
1352 list_for_each_entry_safe(reloc, tmpreloc, &sec->reloc_list, list) { in elf_close()
1353 list_del(&reloc->list); in elf_close()
1354 hash_del(&reloc->hash); in elf_close()
1355 free(reloc); in elf_close()