mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 22:02:02 +00:00
modpost: fix section mismatch message for RELA
[ Upstream commit1c4a7587d1
] 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 commit93684d3b80
("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 <masahiroy@kernel.org> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
9a07b662e5
commit
b1205cc72b
1 changed files with 4 additions and 2 deletions
|
@ -1496,13 +1496,15 @@ static void section_rela(struct module *mod, struct elf_info *elf,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (rela = start; rela < stop; rela++) {
|
for (rela = start; rela < stop; rela++) {
|
||||||
|
Elf_Sym *tsym;
|
||||||
Elf_Addr taddr, r_offset;
|
Elf_Addr taddr, r_offset;
|
||||||
unsigned int r_type, r_sym;
|
unsigned int r_type, r_sym;
|
||||||
|
|
||||||
r_offset = TO_NATIVE(rela->r_offset);
|
r_offset = TO_NATIVE(rela->r_offset);
|
||||||
get_rel_type_and_sym(elf, rela->r_info, &r_type, &r_sym);
|
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) {
|
switch (elf->hdr->e_machine) {
|
||||||
case EM_RISCV:
|
case EM_RISCV:
|
||||||
|
@ -1517,7 +1519,7 @@ static void section_rela(struct module *mod, struct elf_info *elf,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
check_section_mismatch(mod, elf, elf->symtab_start + r_sym,
|
check_section_mismatch(mod, elf, tsym,
|
||||||
fsecndx, fromsec, r_offset, taddr);
|
fsecndx, fromsec, r_offset, taddr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue