Skip to content

Commit

Permalink
modpost: fix section mismatch message for RELA
Browse files Browse the repository at this point in the history
The section mismatch check prints a bogus symbol name on some
architectures.

[test code]

  #include <linux/init.h>

  int __initdata foo;
  int get_foo(void) { return foo; }

If you compile it with GCC for riscv or loongarch, modpost will show an
incorrect symbol name:

  WARNING: modpost: vmlinux: section mismatch in reference: get_foo+0x8 (section: .text) -> done (section: .init.data)

To get the correct symbol address, the st_value must be added.

This issue has never been noticed since commit 93684d3 ("kbuild:
include symbol names in section mismatch warnings") presumably because
st_value becomes zero on most architectures when the referenced symbol
is looked up. It is not true for riscv or loongarch, at least.

With this fix, modpost will show the correct symbol name:

  WARNING: modpost: vmlinux: section mismatch in reference: get_foo+0x8 (section: .text) -> foo (section: .init.data)

Signed-off-by: Masahiro Yamada <[email protected]>
Reviewed-by: Nick Desaulniers <[email protected]>
  • Loading branch information
masahir0y committed Nov 16, 2023
1 parent b85ea95 commit 1c4a758
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions scripts/mod/modpost.c
Original file line number Diff line number Diff line change
Expand Up @@ -1383,13 +1383,15 @@ static void section_rela(struct module *mod, struct elf_info *elf,
const Elf_Rela *rela;

for (rela = start; rela < stop; rela++) {
Elf_Sym *tsym;
Elf_Addr taddr, r_offset;
unsigned int r_type, r_sym;

r_offset = TO_NATIVE(rela->r_offset);
get_rel_type_and_sym(elf, rela->r_info, &r_type, &r_sym);

taddr = TO_NATIVE(rela->r_addend);
tsym = elf->symtab_start + r_sym;
taddr = tsym->st_value + TO_NATIVE(rela->r_addend);

switch (elf->hdr->e_machine) {
case EM_RISCV:
Expand All @@ -1404,7 +1406,7 @@ static void section_rela(struct module *mod, struct elf_info *elf,
break;
}

check_section_mismatch(mod, elf, elf->symtab_start + r_sym,
check_section_mismatch(mod, elf, tsym,
fsecndx, fromsec, r_offset, taddr);
}
}
Expand Down

0 comments on commit 1c4a758

Please sign in to comment.