Lines Matching defs:elf
15 #include <elf.h>
348 static enum export export_from_secname(struct elf_info *elf, unsigned int sec)
350 const char *secname = sec_name(elf, sec);
366 static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
368 if (sec == elf->export_sec)
370 else if (sec == elf->export_unused_sec)
372 else if (sec == elf->export_gpl_sec)
374 else if (sec == elf->export_unused_gpl_sec)
376 else if (sec == elf->export_gpl_future_sec)
821 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
824 return elf->strtab + sym->st_name;
901 static void check_section(const char *modname, struct elf_info *elf,
904 const char *sec = sech_name(elf, sechdr);
1030 void (*handler)(const char *modname, struct elf_info *elf,
1036 static void extable_mismatch_handler(const char *modname, struct elf_info *elf,
1280 static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1282 const char *name = elf->strtab + sym->st_name;
1296 static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
1312 relsym_secindex = get_secindex(elf, relsym);
1313 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1314 if (get_secindex(elf, sym) != relsym_secindex)
1318 if (!is_valid_name(elf, sym))
1344 static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1351 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1356 symsec = sec_name(elf, get_secindex(elf, sym));
1359 if (!is_valid_name(elf, sym))
1584 static void default_mismatch_handler(const char *modname, struct elf_info *elf,
1594 from = find_elf_symbol2(elf, r->r_offset, fromsec);
1595 fromsym = sym_name(elf, from);
1600 tosec = sec_name(elf, get_secindex(elf, sym));
1601 to = find_elf_symbol(elf, r->r_addend, sym);
1602 tosym = sym_name(elf, to);
1614 static int is_executable_section(struct elf_info* elf, unsigned int section_index)
1616 if (section_index >= elf->num_sections)
1617 fatal("section_index is outside elf->num_sections!\n");
1619 return ((elf->sechdrs[section_index].sh_flags & SHF_EXECINSTR) == SHF_EXECINSTR);
1659 static void report_extable_warnings(const char* modname, struct elf_info* elf,
1664 Elf_Sym* fromsym = find_elf_symbol2(elf, r->r_offset, fromsec);
1665 const char* fromsym_name = sym_name(elf, fromsym);
1666 Elf_Sym* tosym = find_elf_symbol(elf, r->r_addend, sym);
1667 const char* tosym_name = sym_name(elf, tosym);
1685 is_executable_section(elf, get_secindex(elf, sym)))
1697 static void extable_mismatch_handler(const char* modname, struct elf_info *elf,
1702 const char* tosec = sec_name(elf, get_secindex(elf, sym));
1706 report_extable_warnings(modname, elf, mismatch, r, sym, fromsec, tosec);
1715 else if (!is_executable_section(elf, get_secindex(elf, sym))) {
1733 static void check_section_mismatch(const char *modname, struct elf_info *elf,
1736 const char *tosec = sec_name(elf, get_secindex(elf, sym));
1741 mismatch->handler(modname, elf, mismatch,
1744 default_mismatch_handler(modname, elf, mismatch,
1749 static unsigned int *reloc_location(struct elf_info *elf,
1752 return sym_get_data_by_offset(elf, sechdr->sh_info, r->r_offset);
1755 static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1758 unsigned int *location = reloc_location(elf, sechdr, r);
1767 if (elf->hdr->e_type == ET_EXEC)
1798 static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1801 Elf_Sym *sym = elf->symtab_start + ELF_R_SYM(r->r_info);
1802 void *loc = reloc_location(elf, sechdr, r);
1822 r->r_addend = (int)(long)(elf->hdr +
1832 static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1835 unsigned int *location = reloc_location(elf, sechdr, r);
1863 static void section_rela(const char *modname, struct elf_info *elf,
1872 Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1875 fromsec = sech_name(elf, sechdr);
1884 if (elf->hdr->e_machine == EM_MIPS) {
1899 switch (elf->hdr->e_machine) {
1906 sym = elf->symtab_start + r_sym;
1912 check_section_mismatch(modname, elf, &r, sym, fromsec);
1916 static void section_rel(const char *modname, struct elf_info *elf,
1925 Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1928 fromsec = sech_name(elf, sechdr);
1937 if (elf->hdr->e_machine == EM_MIPS) {
1952 switch (elf->hdr->e_machine) {
1954 if (addend_386_rel(elf, sechdr, &r))
1958 if (addend_arm_rel(elf, sechdr, &r))
1962 if (addend_mips_rel(elf, sechdr, &r))
1966 sym = elf->symtab_start + r_sym;
1972 check_section_mismatch(modname, elf, &r, sym, fromsec);
1989 struct elf_info *elf)
1992 Elf_Shdr *sechdrs = elf->sechdrs;
1995 for (i = 0; i < elf->num_sections; i++) {
1996 check_section(modname, elf, &elf->sechdrs[i]);
1999 section_rela(modname, elf, &elf->sechdrs[i]);
2001 section_rel(modname, elf, &elf->sechdrs[i]);