aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/mod/modpost.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/mod/modpost.c')
-rw-r--r--scripts/mod/modpost.c88
1 files changed, 69 insertions, 19 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 6d04504b2fc1..d0f86ed43f7a 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -697,29 +697,79 @@ static void check_sec_ref(struct module *mod, const char *modname,
697 697
698 /* Walk through all sections */ 698 /* Walk through all sections */
699 for (i = 0; i < hdr->e_shnum; i++) { 699 for (i = 0; i < hdr->e_shnum; i++) {
700 Elf_Rela *rela; 700 const char *name = secstrings + sechdrs[i].sh_name;
701 Elf_Rela *start = (void *)hdr + sechdrs[i].sh_offset; 701 const char *secname;
702 Elf_Rela *stop = (void*)start + sechdrs[i].sh_size; 702 Elf_Rela r;
703 const char *name = secstrings + sechdrs[i].sh_name + 703 unsigned int r_sym;
704 strlen(".rela");
705 /* We want to process only relocation sections and not .init */ 704 /* We want to process only relocation sections and not .init */
706 if (section_ref_ok(name) || (sechdrs[i].sh_type != SHT_RELA)) 705 if (sechdrs[i].sh_type == SHT_RELA) {
707 continue; 706 Elf_Rela *rela;
707 Elf_Rela *start = (void *)hdr + sechdrs[i].sh_offset;
708 Elf_Rela *stop = (void*)start + sechdrs[i].sh_size;
709 name += strlen(".rela");
710 if (section_ref_ok(name))
711 continue;
708 712
709 for (rela = start; rela < stop; rela++) { 713 for (rela = start; rela < stop; rela++) {
710 Elf_Rela r; 714 r.r_offset = TO_NATIVE(rela->r_offset);
711 const char *secname; 715#if KERNEL_ELFCLASS == ELFCLASS64
712 r.r_offset = TO_NATIVE(rela->r_offset); 716 if (hdr->e_machine == EM_MIPS) {
713 r.r_info = TO_NATIVE(rela->r_info); 717 r_sym = ELF64_MIPS_R_SYM(rela->r_info);
714 r.r_addend = TO_NATIVE(rela->r_addend); 718 r_sym = TO_NATIVE(r_sym);
715 sym = elf->symtab_start + ELF_R_SYM(r.r_info); 719 } else {
716 /* Skip special sections */ 720 r.r_info = TO_NATIVE(rela->r_info);
717 if (sym->st_shndx >= SHN_LORESERVE) 721 r_sym = ELF_R_SYM(r.r_info);
722 }
723#else
724 r.r_info = TO_NATIVE(rela->r_info);
725 r_sym = ELF_R_SYM(r.r_info);
726#endif
727 r.r_addend = TO_NATIVE(rela->r_addend);
728 sym = elf->symtab_start + r_sym;
729 /* Skip special sections */
730 if (sym->st_shndx >= SHN_LORESERVE)
731 continue;
732
733 secname = secstrings +
734 sechdrs[sym->st_shndx].sh_name;
735 if (section(secname))
736 warn_sec_mismatch(modname, name,
737 elf, sym, r);
738 }
739 } else if (sechdrs[i].sh_type == SHT_REL) {
740 Elf_Rel *rel;
741 Elf_Rel *start = (void *)hdr + sechdrs[i].sh_offset;
742 Elf_Rel *stop = (void*)start + sechdrs[i].sh_size;
743 name += strlen(".rel");
744 if (section_ref_ok(name))
718 continue; 745 continue;
719 746
720 secname = secstrings + sechdrs[sym->st_shndx].sh_name; 747 for (rel = start; rel < stop; rel++) {
721 if (section(secname)) 748 r.r_offset = TO_NATIVE(rel->r_offset);
722 warn_sec_mismatch(modname, name, elf, sym, r); 749#if KERNEL_ELFCLASS == ELFCLASS64
750 if (hdr->e_machine == EM_MIPS) {
751 r_sym = ELF64_MIPS_R_SYM(rel->r_info);
752 r_sym = TO_NATIVE(r_sym);
753 } else {
754 r.r_info = TO_NATIVE(rel->r_info);
755 r_sym = ELF_R_SYM(r.r_info);
756 }
757#else
758 r.r_info = TO_NATIVE(rel->r_info);
759 r_sym = ELF_R_SYM(r.r_info);
760#endif
761 r.r_addend = 0;
762 sym = elf->symtab_start + r_sym;
763 /* Skip special sections */
764 if (sym->st_shndx >= SHN_LORESERVE)
765 continue;
766
767 secname = secstrings +
768 sechdrs[sym->st_shndx].sh_name;
769 if (section(secname))
770 warn_sec_mismatch(modname, name,
771 elf, sym, r);
772 }
723 } 773 }
724 } 774 }
725} 775}