Lines Matching defs:reloc
231 struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *sec,
234 struct reloc *reloc, *r = NULL;
237 if (!sec->reloc)
240 sec = sec->reloc;
243 elf_hash_for_each_possible(elf->reloc_hash, reloc, hash,
245 if (reloc->sec != sec)
248 if (reloc->offset >= offset && reloc->offset < offset + len) {
249 if (!r || reloc->offset < r->offset)
250 r = reloc;
260 struct reloc *find_reloc_by_dest(const struct elf *elf, struct section *sec, unsigned long offset)
515 struct reloc *reloc;
517 if (!sec->reloc && !elf_create_reloc_section(elf, sec, SHT_RELA))
520 reloc = malloc(sizeof(*reloc));
521 if (!reloc) {
525 memset(reloc, 0, sizeof(*reloc));
527 reloc->sec = sec->reloc;
528 reloc->offset = offset;
529 reloc->type = type;
530 reloc->sym = sym;
531 reloc->addend = addend;
533 list_add_tail(&reloc->list, &sec->reloc->reloc_list);
534 elf_hash_add(elf->reloc_hash, &reloc->hash, reloc_hash(reloc));
536 sec->reloc->changed = true;
542 * Ensure that any reloc section containing references to @sym is marked
551 struct reloc *reloc;
556 list_for_each_entry(reloc, &sec->reloc_list, list) {
557 if (reloc->sym == sym) {
784 static int read_rel_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx)
786 if (!gelf_getrel(sec->data, i, &reloc->rel)) {
790 reloc->type = GELF_R_TYPE(reloc->rel.r_info);
791 reloc->addend = 0;
792 reloc->offset = reloc->rel.r_offset;
793 *symndx = GELF_R_SYM(reloc->rel.r_info);
797 static int read_rela_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx)
799 if (!gelf_getrela(sec->data, i, &reloc->rela)) {
803 reloc->type = GELF_R_TYPE(reloc->rela.r_info);
804 reloc->addend = reloc->rela.r_addend;
805 reloc->offset = reloc->rela.r_offset;
806 *symndx = GELF_R_SYM(reloc->rela.r_info);
813 struct reloc *reloc;
825 WARN("can't find base section for reloc section %s",
830 sec->base->reloc = sec;
834 reloc = malloc(sizeof(*reloc));
835 if (!reloc) {
839 memset(reloc, 0, sizeof(*reloc));
842 if (read_rel_reloc(sec, i, reloc, &symndx))
846 if (read_rela_reloc(sec, i, reloc, &symndx))
852 reloc->sec = sec;
853 reloc->idx = i;
854 reloc->sym = find_symbol_by_index(elf, symndx);
855 if (!reloc->sym) {
856 WARN("can't find reloc entry symbol %d for %s",
861 list_add_tail(&reloc->list, &sec->reloc_list);
862 elf_hash_add(elf->reloc_hash, &reloc->hash, reloc_hash(reloc));
1079 base->reloc = sec;
1109 base->reloc = sec;
1134 struct reloc *reloc;
1152 list_for_each_entry(reloc, &sec->reloc_list, list) {
1153 relocs[idx].r_offset = reloc->offset;
1154 relocs[idx].r_info = GELF_R_INFO(reloc->sym->idx, reloc->type);
1163 struct reloc *reloc;
1181 list_for_each_entry(reloc, &sec->reloc_list, list) {
1182 relocs[idx].r_offset = reloc->offset;
1183 relocs[idx].r_addend = reloc->addend;
1184 relocs[idx].r_info = GELF_R_INFO(reloc->sym->idx, reloc->type);
1193 struct reloc *reloc;
1197 list_for_each_entry(reloc, &sec->reloc_list, list)
1226 int elf_write_reloc(struct elf *elf, struct reloc *reloc)
1228 struct section *sec = reloc->sec;
1231 reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type);
1232 reloc->rel.r_offset = reloc->offset;
1234 if (!gelf_update_rel(sec->data, reloc->idx, &reloc->rel)) {
1239 reloc->rela.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type);
1240 reloc->rela.r_addend = reloc->addend;
1241 reloc->rela.r_offset = reloc->offset;
1243 if (!gelf_update_rela(sec->data, reloc->idx, &reloc->rela)) {
1301 struct reloc *reloc, *tmpreloc;
1315 list_for_each_entry_safe(reloc, tmpreloc, &sec->reloc_list, list) {
1316 list_del(&reloc->list);
1317 hash_del(&reloc->hash);
1318 free(reloc);