Skip to content

Commit

Permalink
kbuild: fix section mismatch check for vmlinux
Browse files Browse the repository at this point in the history
vmlinux does not contain relocation entries which is
used by the section mismatch checks.
Reported by: Atsushi Nemoto <[email protected]>

Use the individual objects as inputs to overcome
this limitation.
In modpost check the .o files and skip non-ELF files.

Signed-off-by: Sam Ravnborg <[email protected]>
  • Loading branch information
sravnborg committed May 2, 2007
1 parent dc87c39 commit 85bd2fd
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 16 deletions.
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,7 @@ vmlinux-init := $(head-y) $(init-y)
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
vmlinux-all := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
export KBUILD_VMLINUX_OBJS := $(vmlinux-all)

# Rule to link vmlinux - also used during CONFIG_KALLSYMS
# May be overridden by arch/$(ARCH)/Makefile
Expand Down
8 changes: 4 additions & 4 deletions scripts/Makefile.modpost
Original file line number Diff line number Diff line change
Expand Up @@ -63,16 +63,16 @@ quiet_cmd_modpost = MODPOST $(words $(filter-out vmlinux FORCE, $^)) modules
$(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \
$(if $(KBUILD_EXTMOD),-I $(modulesymfile)) \
$(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \
$(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) \
$(wildcard vmlinux) $(filter-out FORCE,$^)
$(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w)

PHONY += __modpost
__modpost: $(modules:.ko=.o) FORCE
$(call cmd,modpost)
$(call cmd,modpost) $(wildcard vmlinux) $(filter-out FORCE,$^)

quiet_cmd_kernel-mod = MODPOST $@
cmd_kernel-mod = $(cmd_modpost)
cmd_kernel-mod = $(cmd_modpost) $(KBUILD_VMLINUX_OBJS)

PHONY += vmlinux
vmlinux: FORCE
$(call cmd,kernel-mod)

Expand Down
33 changes: 21 additions & 12 deletions scripts/mod/modpost.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,10 +333,10 @@ void release_file(void *file, unsigned long size)
munmap(file, size);
}

static void parse_elf(struct elf_info *info, const char *filename)
static int parse_elf(struct elf_info *info, const char *filename)
{
unsigned int i;
Elf_Ehdr *hdr = info->hdr;
Elf_Ehdr *hdr;
Elf_Shdr *sechdrs;
Elf_Sym *sym;

Expand All @@ -346,9 +346,18 @@ static void parse_elf(struct elf_info *info, const char *filename)
exit(1);
}
info->hdr = hdr;
if (info->size < sizeof(*hdr))
goto truncated;

if (info->size < sizeof(*hdr)) {
/* file too small, assume this is an empty .o file */
return 0;
}
/* Is this a valid ELF file? */
if ((hdr->e_ident[EI_MAG0] != ELFMAG0) ||
(hdr->e_ident[EI_MAG1] != ELFMAG1) ||
(hdr->e_ident[EI_MAG2] != ELFMAG2) ||
(hdr->e_ident[EI_MAG3] != ELFMAG3)) {
/* Not an ELF file - silently ignore it */
return 0;
}
/* Fix endianness in ELF header */
hdr->e_shoff = TO_NATIVE(hdr->e_shoff);
hdr->e_shstrndx = TO_NATIVE(hdr->e_shstrndx);
Expand All @@ -371,8 +380,10 @@ static void parse_elf(struct elf_info *info, const char *filename)
= (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
const char *secname;

if (sechdrs[i].sh_offset > info->size)
goto truncated;
if (sechdrs[i].sh_offset > info->size) {
fatal("%s is truncated. sechdrs[i].sh_offset=%u > sizeof(*hrd)=%ul\n", filename, (unsigned int)sechdrs[i].sh_offset, sizeof(*hdr));
return 0;
}
secname = secstrings + sechdrs[i].sh_name;
if (strcmp(secname, ".modinfo") == 0) {
info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
Expand Down Expand Up @@ -407,10 +418,7 @@ static void parse_elf(struct elf_info *info, const char *filename)
sym->st_value = TO_NATIVE(sym->st_value);
sym->st_size = TO_NATIVE(sym->st_size);
}
return;

truncated:
fatal("%s is truncated.\n", filename);
return 1;
}

static void parse_elf_finish(struct elf_info *info)
Expand Down Expand Up @@ -1089,7 +1097,8 @@ static void read_symbols(char *modname)
struct elf_info info = { };
Elf_Sym *sym;

parse_elf(&info, modname);
if (!parse_elf(&info, modname))
return;

mod = new_module(modname);

Expand Down

0 comments on commit 85bd2fd

Please sign in to comment.