Lines Matching refs:elf

30 #define __elf_table(name)	(elf->name##_hash)
31 #define __elf_bits(name) (elf->name##_bits)
130 struct section *find_section_by_name(const struct elf *elf, const char *name) in find_section_by_name() argument
142 static struct section *find_section_by_index(struct elf *elf, in find_section_by_index() argument
155 static struct symbol *find_symbol_by_index(struct elf *elf, unsigned int idx) in find_symbol_by_index() argument
259 struct symbol *find_symbol_by_name(const struct elf *elf, const char *name) in find_symbol_by_name() argument
271 struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *sec, in find_reloc_by_dest_range() argument
301 struct reloc *find_reloc_by_dest(const struct elf *elf, struct section *sec, unsigned long offset) in find_reloc_by_dest() argument
303 return find_reloc_by_dest_range(elf, sec, offset, 1); in find_reloc_by_dest()
311 static int read_sections(struct elf *elf) in read_sections() argument
318 if (elf_getshdrnum(elf->elf, &sections_nr)) { in read_sections()
323 if (elf_getshdrstrndx(elf->elf, &shstrndx)) { in read_sections()
332 elf->section_data = calloc(sections_nr, sizeof(*sec)); in read_sections()
333 if (!elf->section_data) { in read_sections()
338 sec = &elf->section_data[i]; in read_sections()
342 s = elf_getscn(elf->elf, i); in read_sections()
355 sec->name = elf_strptr(elf->elf, shstrndx, sec->sh.sh_name); in read_sections()
374 list_add_tail(&sec->list, &elf->sections); in read_sections()
379 elf->num_relocs += sec_num_entries(sec); in read_sections()
384 printf("section_bits: %d\n", elf->section_bits); in read_sections()
388 if (elf_nextscn(elf->elf, s)) { in read_sections()
396 static void elf_add_symbol(struct elf *elf, struct symbol *sym) in elf_add_symbol() argument
409 elf->num_files++; in elf_add_symbol()
437 static int read_symbols(struct elf *elf) in read_symbols() argument
446 symtab = find_section_by_name(elf, ".symtab"); in read_symbols()
448 symtab_shndx = find_section_by_name(elf, ".symtab_shndx"); in read_symbols()
467 elf->symbol_data = calloc(symbols_nr, sizeof(*sym)); in read_symbols()
468 if (!elf->symbol_data) { in read_symbols()
473 sym = &elf->symbol_data[i]; in read_symbols()
483 sym->name = elf_strptr(elf->elf, symtab->sh.sh_link, in read_symbols()
496 sym->sec = find_section_by_index(elf, shndx); in read_symbols()
506 sym->sec = find_section_by_index(elf, 0); in read_symbols()
508 elf_add_symbol(elf, sym); in read_symbols()
513 printf("symbol_bits: %d\n", elf->symbol_bits); in read_symbols()
517 list_for_each_entry(sec, &elf->sections, list) { in read_symbols()
541 pfunc = find_symbol_by_name(elf, pname); in read_symbols()
575 static int mark_group_syms(struct elf *elf) in mark_group_syms() argument
580 symtab = find_section_by_name(elf, ".symtab"); in mark_group_syms()
586 list_for_each_entry(sec, &elf->sections, list) { in mark_group_syms()
589 sym = find_symbol_by_index(elf, sec->sh.sh_info); in mark_group_syms()
606 static int elf_update_sym_relocs(struct elf *elf, struct symbol *sym) in elf_update_sym_relocs() argument
611 set_reloc_sym(elf, reloc, reloc->sym->idx); in elf_update_sym_relocs()
624 static int elf_update_symbol(struct elf *elf, struct section *symtab, in elf_update_symbol() argument
638 s = elf_getscn(elf->elf, symtab->idx); in elf_update_symbol()
645 t = elf_getscn(elf->elf, symtab_shndx->idx); in elf_update_symbol()
690 mark_sec_changed(elf, symtab, true); in elf_update_symbol()
705 mark_sec_changed(elf, symtab_shndx, true); in elf_update_symbol()
755 __elf_create_symbol(struct elf *elf, struct symbol *sym) in __elf_create_symbol() argument
761 symtab = find_section_by_name(elf, ".symtab"); in __elf_create_symbol()
763 symtab_shndx = find_section_by_name(elf, ".symtab_shndx"); in __elf_create_symbol()
779 old = find_symbol_by_index(elf, first_non_local); in __elf_create_symbol()
786 if (elf_update_symbol(elf, symtab, symtab_shndx, old)) { in __elf_create_symbol()
791 if (elf_update_sym_relocs(elf, old)) in __elf_create_symbol()
796 mark_sec_changed(elf, old->group_sec, true); in __elf_create_symbol()
809 if (elf_update_symbol(elf, symtab, symtab_shndx, sym)) { in __elf_create_symbol()
815 mark_sec_changed(elf, symtab, true); in __elf_create_symbol()
819 mark_sec_changed(elf, symtab_shndx, true); in __elf_create_symbol()
826 elf_create_section_symbol(struct elf *elf, struct section *sec) in elf_create_section_symbol() argument
844 sym = __elf_create_symbol(elf, sym); in elf_create_section_symbol()
846 elf_add_symbol(elf, sym); in elf_create_section_symbol()
851 static int elf_add_string(struct elf *elf, struct section *strtab, char *str);
854 elf_create_prefix_symbol(struct elf *elf, struct symbol *orig, long size) in elf_create_prefix_symbol() argument
870 sym->sym.st_name = elf_add_string(elf, NULL, name); in elf_create_prefix_symbol()
875 sym = __elf_create_symbol(elf, sym); in elf_create_prefix_symbol()
877 elf_add_symbol(elf, sym); in elf_create_prefix_symbol()
882 static struct reloc *elf_init_reloc(struct elf *elf, struct section *rsec, in elf_init_reloc() argument
906 set_reloc_offset(elf, reloc, offset); in elf_init_reloc()
907 set_reloc_sym(elf, reloc, sym->idx); in elf_init_reloc()
908 set_reloc_type(elf, reloc, type); in elf_init_reloc()
909 set_reloc_addend(elf, reloc, addend); in elf_init_reloc()
918 struct reloc *elf_init_reloc_text_sym(struct elf *elf, struct section *sec, in elf_init_reloc_text_sym() argument
939 sym = elf_create_section_symbol(elf, insn_sec); in elf_init_reloc_text_sym()
946 return elf_init_reloc(elf, sec->rsec, reloc_idx, offset, sym, addend, in elf_init_reloc_text_sym()
947 elf_text_rela_type(elf)); in elf_init_reloc_text_sym()
950 struct reloc *elf_init_reloc_data_sym(struct elf *elf, struct section *sec, in elf_init_reloc_data_sym() argument
961 return elf_init_reloc(elf, sec->rsec, reloc_idx, offset, sym, addend, in elf_init_reloc_data_sym()
962 elf_data_rela_type(elf)); in elf_init_reloc_data_sym()
965 static int read_relocs(struct elf *elf) in read_relocs() argument
974 if (!elf_alloc_hash(reloc, elf->num_relocs)) in read_relocs()
977 list_for_each_entry(rsec, &elf->sections, list) { in read_relocs()
981 rsec->base = find_section_by_index(elf, rsec->sh.sh_info); in read_relocs()
1000 reloc->sym = sym = find_symbol_by_index(elf, symndx); in read_relocs()
1017 printf("num_relocs: %lu\n", elf->num_relocs); in read_relocs()
1018 printf("reloc_bits: %d\n", elf->reloc_bits); in read_relocs()
1024 struct elf *elf_open_read(const char *name, int flags) in elf_open_read()
1026 struct elf *elf; in elf_open_read() local
1031 elf = malloc(sizeof(*elf)); in elf_open_read()
1032 if (!elf) { in elf_open_read()
1036 memset(elf, 0, sizeof(*elf)); in elf_open_read()
1038 INIT_LIST_HEAD(&elf->sections); in elf_open_read()
1040 elf->fd = open(name, flags); in elf_open_read()
1041 if (elf->fd == -1) { in elf_open_read()
1054 elf->elf = elf_begin(elf->fd, cmd, NULL); in elf_open_read()
1055 if (!elf->elf) { in elf_open_read()
1060 if (!gelf_getehdr(elf->elf, &elf->ehdr)) { in elf_open_read()
1065 if (read_sections(elf)) in elf_open_read()
1068 if (read_symbols(elf)) in elf_open_read()
1071 if (mark_group_syms(elf)) in elf_open_read()
1074 if (read_relocs(elf)) in elf_open_read()
1077 return elf; in elf_open_read()
1080 elf_close(elf); in elf_open_read()
1084 static int elf_add_string(struct elf *elf, struct section *strtab, char *str) in elf_add_string() argument
1091 strtab = find_section_by_name(elf, ".strtab"); in elf_add_string()
1097 s = elf_getscn(elf->elf, strtab->idx); in elf_add_string()
1116 mark_sec_changed(elf, strtab, true); in elf_add_string()
1121 struct section *elf_create_section(struct elf *elf, const char *name, in elf_create_section() argument
1137 s = elf_newscn(elf->elf); in elf_create_section()
1181 shstrtab = find_section_by_name(elf, ".shstrtab"); in elf_create_section()
1183 shstrtab = find_section_by_name(elf, ".strtab"); in elf_create_section()
1188 sec->sh.sh_name = elf_add_string(elf, shstrtab, sec->name); in elf_create_section()
1192 list_add_tail(&sec->list, &elf->sections); in elf_create_section()
1196 mark_sec_changed(elf, sec, true); in elf_create_section()
1201 static struct section *elf_create_rela_section(struct elf *elf, in elf_create_rela_section() argument
1216 rsec = elf_create_section(elf, rsec_name, elf_rela_size(elf), reloc_nr); in elf_create_rela_section()
1223 rsec->sh.sh_addralign = elf_addr_size(elf); in elf_create_rela_section()
1224 rsec->sh.sh_link = find_section_by_name(elf, ".symtab")->idx; in elf_create_rela_section()
1240 struct section *elf_create_section_pair(struct elf *elf, const char *name, in elf_create_section_pair() argument
1246 sec = elf_create_section(elf, name, entsize, nr); in elf_create_section_pair()
1250 if (!elf_create_rela_section(elf, sec, reloc_nr)) in elf_create_section_pair()
1256 int elf_write_insn(struct elf *elf, struct section *sec, in elf_write_insn() argument
1269 mark_sec_changed(elf, sec, true); in elf_write_insn()
1283 static int elf_truncate_section(struct elf *elf, struct section *sec) in elf_truncate_section() argument
1290 s = elf_getscn(elf->elf, sec->idx); in elf_truncate_section()
1328 int elf_write(struct elf *elf) in elf_write() argument
1334 list_for_each_entry(sec, &elf->sections, list) { in elf_write()
1336 elf_truncate_section(elf, sec); in elf_write()
1339 s = elf_getscn(elf->elf, sec->idx); in elf_write()
1351 mark_sec_changed(elf, sec, false); in elf_write()
1356 elf_flagelf(elf->elf, ELF_C_SET, ELF_F_DIRTY); in elf_write()
1359 if (elf_update(elf->elf, ELF_C_WRITE) < 0) { in elf_write()
1364 elf->changed = false; in elf_write()
1369 void elf_close(struct elf *elf) in elf_close() argument
1371 if (elf->elf) in elf_close()
1372 elf_end(elf->elf); in elf_close()
1374 if (elf->fd > 0) in elf_close()
1375 close(elf->fd); in elf_close()