Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c1a51f3 authored by Atsushi Nemoto's avatar Atsushi Nemoto Committed by Linus Torvalds
Browse files

[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: default avatarAtsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 92f63cd0
Loading
Loading
Loading
Loading
+46 −19
Original line number Diff line number Diff line
@@ -697,18 +697,19 @@ static void check_sec_ref(struct module *mod, const char *modname,

	/* Walk through all sections */
	for (i = 0; i < hdr->e_shnum; i++) {
		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 (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;
		const char *name = secstrings + sechdrs[i].sh_name +
						strlen(".rela");
		/* We want to process only relocation sections and not .init */
		if (section_ref_ok(name) || (sechdrs[i].sh_type != SHT_RELA))
			name += strlen(".rela");
			if (section_ref_ok(name))
				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);
@@ -717,9 +718,35 @@ static void check_sec_ref(struct module *mod, const char *modname,
				if (sym->st_shndx >= SHN_LORESERVE)
					continue;

			secname = secstrings + sechdrs[sym->st_shndx].sh_name;
				secname = secstrings +
					sechdrs[sym->st_shndx].sh_name;
				if (section(secname))
				warn_sec_mismatch(modname, name, elf, sym, r);
					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);
			}
		}
	}
}
+2 −0
Original line number Diff line number Diff line
@@ -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