diff options
| author | Atsushi Nemoto <anemo@mba.ocn.ne.jp> | 2006-05-20 18:00:26 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-05-21 15:59:21 -0400 |
| commit | 2c1a51f39d9551a514d7a089d01c23c0c3a54ab8 (patch) | |
| tree | e938e986a1a6f41ac701ad231601d90d4c824ffb /scripts | |
| parent | 92f63cd000059366af18712367216d96180e0ec0 (diff) | |
[PATCH] kbuild: check SHT_REL sections
I found that modpost can not detect section mismatch on mips and i386. On
mips64, the modpost (with r_info layout fix) can detect it. The current
modpst only checks SHT_RELA section but I suppose SHT_REL section should be
checked also. This patch does not contain r_info layout fix. I'll post an
updated r_info layout fix on next mail.
Check SHT_REL sections as like as SHT_RELA sections to detect section
mismatch.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/mod/modpost.c | 65 | ||||
| -rw-r--r-- | scripts/mod/modpost.h | 2 |
2 files changed, 48 insertions, 19 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 6d04504b2fc1..1aa52a86c2cf 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -697,29 +697,56 @@ 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 + | ||
| 704 | strlen(".rela"); | ||
| 705 | /* We want to process only relocation sections and not .init */ | 703 | /* We want to process only relocation sections and not .init */ |
| 706 | if (section_ref_ok(name) || (sechdrs[i].sh_type != SHT_RELA)) | 704 | if (sechdrs[i].sh_type == SHT_RELA) { |
| 707 | continue; | 705 | Elf_Rela *rela; |
| 706 | Elf_Rela *start = (void *)hdr + sechdrs[i].sh_offset; | ||
| 707 | Elf_Rela *stop = (void*)start + sechdrs[i].sh_size; | ||
| 708 | name += strlen(".rela"); | ||
| 709 | if (section_ref_ok(name)) | ||
| 710 | continue; | ||
| 708 | 711 | ||
| 709 | for (rela = start; rela < stop; rela++) { | 712 | for (rela = start; rela < stop; rela++) { |
| 710 | Elf_Rela r; | 713 | r.r_offset = TO_NATIVE(rela->r_offset); |
| 711 | const char *secname; | 714 | r.r_info = TO_NATIVE(rela->r_info); |
| 712 | r.r_offset = TO_NATIVE(rela->r_offset); | 715 | r.r_addend = TO_NATIVE(rela->r_addend); |
| 713 | r.r_info = TO_NATIVE(rela->r_info); | 716 | sym = elf->symtab_start + ELF_R_SYM(r.r_info); |
| 714 | r.r_addend = TO_NATIVE(rela->r_addend); | 717 | /* Skip special sections */ |
| 715 | sym = elf->symtab_start + ELF_R_SYM(r.r_info); | 718 | if (sym->st_shndx >= SHN_LORESERVE) |
| 716 | /* Skip special sections */ | 719 | continue; |
| 717 | if (sym->st_shndx >= SHN_LORESERVE) | 720 | |
| 721 | secname = secstrings + | ||
| 722 | sechdrs[sym->st_shndx].sh_name; | ||
| 723 | if (section(secname)) | ||
| 724 | warn_sec_mismatch(modname, name, | ||
| 725 | elf, sym, r); | ||
| 726 | } | ||
| 727 | } else if (sechdrs[i].sh_type == SHT_REL) { | ||
| 728 | Elf_Rel *rel; | ||
| 729 | Elf_Rel *start = (void *)hdr + sechdrs[i].sh_offset; | ||
| 730 | Elf_Rel *stop = (void*)start + sechdrs[i].sh_size; | ||
| 731 | name += strlen(".rel"); | ||
| 732 | if (section_ref_ok(name)) | ||
| 718 | continue; | 733 | continue; |
| 719 | 734 | ||
| 720 | secname = secstrings + sechdrs[sym->st_shndx].sh_name; | 735 | for (rel = start; rel < stop; rel++) { |
| 721 | if (section(secname)) | 736 | r.r_offset = TO_NATIVE(rel->r_offset); |
| 722 | warn_sec_mismatch(modname, name, elf, sym, r); | 737 | r.r_info = TO_NATIVE(rel->r_info); |
| 738 | r.r_addend = 0; | ||
| 739 | sym = elf->symtab_start + ELF_R_SYM(r.r_info); | ||
| 740 | /* Skip special sections */ | ||
| 741 | if (sym->st_shndx >= SHN_LORESERVE) | ||
| 742 | continue; | ||
| 743 | |||
| 744 | secname = secstrings + | ||
| 745 | sechdrs[sym->st_shndx].sh_name; | ||
| 746 | if (section(secname)) | ||
| 747 | warn_sec_mismatch(modname, name, | ||
| 748 | elf, sym, r); | ||
| 749 | } | ||
| 723 | } | 750 | } |
| 724 | } | 751 | } |
| 725 | } | 752 | } |
diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h index b14255c72a37..086fa466504c 100644 --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #define ELF_ST_BIND ELF32_ST_BIND | 21 | #define ELF_ST_BIND ELF32_ST_BIND |
| 22 | #define ELF_ST_TYPE ELF32_ST_TYPE | 22 | #define ELF_ST_TYPE ELF32_ST_TYPE |
| 23 | 23 | ||
| 24 | #define Elf_Rel Elf32_Rel | ||
| 24 | #define Elf_Rela Elf32_Rela | 25 | #define Elf_Rela Elf32_Rela |
| 25 | #define ELF_R_SYM ELF32_R_SYM | 26 | #define ELF_R_SYM ELF32_R_SYM |
| 26 | #define ELF_R_TYPE ELF32_R_TYPE | 27 | #define ELF_R_TYPE ELF32_R_TYPE |
| @@ -34,6 +35,7 @@ | |||
| 34 | #define ELF_ST_BIND ELF64_ST_BIND | 35 | #define ELF_ST_BIND ELF64_ST_BIND |
| 35 | #define ELF_ST_TYPE ELF64_ST_TYPE | 36 | #define ELF_ST_TYPE ELF64_ST_TYPE |
| 36 | 37 | ||
| 38 | #define Elf_Rel Elf64_Rel | ||
| 37 | #define Elf_Rela Elf64_Rela | 39 | #define Elf_Rela Elf64_Rela |
| 38 | #define ELF_R_SYM ELF64_R_SYM | 40 | #define ELF_R_SYM ELF64_R_SYM |
| 39 | #define ELF_R_TYPE ELF64_R_TYPE | 41 | #define ELF_R_TYPE ELF64_R_TYPE |
