[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>
This commit is contained in:
Родитель
92f63cd000
Коммит
2c1a51f39d
|
@ -697,29 +697,56 @@ static void check_sec_ref(struct module *mod, const char *modname,
|
|||
|
||||
/* Walk through all sections */
|
||||
for (i = 0; i < hdr->e_shnum; i++) {
|
||||
Elf_Rela *rela;
|
||||
Elf_Rela *start = (void *)hdr + sechdrs[i].sh_offset;
|
||||
Elf_Rela *stop = (void*)start + sechdrs[i].sh_size;
|
||||
const char *name = secstrings + sechdrs[i].sh_name +
|
||||
strlen(".rela");
|
||||
const char *name = secstrings + sechdrs[i].sh_name;
|
||||
const char *secname;
|
||||
Elf_Rela r;
|
||||
/* We want to process only relocation sections and not .init */
|
||||
if (section_ref_ok(name) || (sechdrs[i].sh_type != SHT_RELA))
|
||||
continue;
|
||||
|
||||
for (rela = start; rela < stop; rela++) {
|
||||
Elf_Rela r;
|
||||
const char *secname;
|
||||
r.r_offset = TO_NATIVE(rela->r_offset);
|
||||
r.r_info = TO_NATIVE(rela->r_info);
|
||||
r.r_addend = TO_NATIVE(rela->r_addend);
|
||||
sym = elf->symtab_start + ELF_R_SYM(r.r_info);
|
||||
/* Skip special sections */
|
||||
if (sym->st_shndx >= SHN_LORESERVE)
|
||||
if (sechdrs[i].sh_type == SHT_RELA) {
|
||||
Elf_Rela *rela;
|
||||
Elf_Rela *start = (void *)hdr + sechdrs[i].sh_offset;
|
||||
Elf_Rela *stop = (void*)start + sechdrs[i].sh_size;
|
||||
name += strlen(".rela");
|
||||
if (section_ref_ok(name))
|
||||
continue;
|
||||
|
||||
secname = secstrings + sechdrs[sym->st_shndx].sh_name;
|
||||
if (section(secname))
|
||||
warn_sec_mismatch(modname, name, elf, sym, r);
|
||||
for (rela = start; rela < stop; rela++) {
|
||||
r.r_offset = TO_NATIVE(rela->r_offset);
|
||||
r.r_info = TO_NATIVE(rela->r_info);
|
||||
r.r_addend = TO_NATIVE(rela->r_addend);
|
||||
sym = elf->symtab_start + ELF_R_SYM(r.r_info);
|
||||
/* Skip special sections */
|
||||
if (sym->st_shndx >= SHN_LORESERVE)
|
||||
continue;
|
||||
|
||||
secname = secstrings +
|
||||
sechdrs[sym->st_shndx].sh_name;
|
||||
if (section(secname))
|
||||
warn_sec_mismatch(modname, name,
|
||||
elf, sym, r);
|
||||
}
|
||||
} else if (sechdrs[i].sh_type == SHT_REL) {
|
||||
Elf_Rel *rel;
|
||||
Elf_Rel *start = (void *)hdr + sechdrs[i].sh_offset;
|
||||
Elf_Rel *stop = (void*)start + sechdrs[i].sh_size;
|
||||
name += strlen(".rel");
|
||||
if (section_ref_ok(name))
|
||||
continue;
|
||||
|
||||
for (rel = start; rel < stop; rel++) {
|
||||
r.r_offset = TO_NATIVE(rel->r_offset);
|
||||
r.r_info = TO_NATIVE(rel->r_info);
|
||||
r.r_addend = 0;
|
||||
sym = elf->symtab_start + ELF_R_SYM(r.r_info);
|
||||
/* Skip special sections */
|
||||
if (sym->st_shndx >= SHN_LORESERVE)
|
||||
continue;
|
||||
|
||||
secname = secstrings +
|
||||
sechdrs[sym->st_shndx].sh_name;
|
||||
if (section(secname))
|
||||
warn_sec_mismatch(modname, name,
|
||||
elf, sym, r);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#define ELF_ST_BIND ELF32_ST_BIND
|
||||
#define ELF_ST_TYPE ELF32_ST_TYPE
|
||||
|
||||
#define Elf_Rel Elf32_Rel
|
||||
#define Elf_Rela Elf32_Rela
|
||||
#define ELF_R_SYM ELF32_R_SYM
|
||||
#define ELF_R_TYPE ELF32_R_TYPE
|
||||
|
@ -34,6 +35,7 @@
|
|||
#define ELF_ST_BIND ELF64_ST_BIND
|
||||
#define ELF_ST_TYPE ELF64_ST_TYPE
|
||||
|
||||
#define Elf_Rel Elf64_Rel
|
||||
#define Elf_Rela Elf64_Rela
|
||||
#define ELF_R_SYM ELF64_R_SYM
|
||||
#define ELF_R_TYPE ELF64_R_TYPE
|
||||
|
|
Загрузка…
Ссылка в новой задаче