From: Masahiro Yamada <masahiroy@kernel.org>
To: linux-kbuild@vger.kernel.org
Cc: linux-kernel@vger.kernel.org,
Nathan Chancellor <nathan@kernel.org>,
Nick Desaulniers <ndesaulniers@google.com>,
Nicolas Schier <nicolas@fjasle.eu>,
Masahiro Yamada <masahiroy@kernel.org>
Subject: [PATCH v6 02/20] modpost: fix section mismatch message for R_ARM_ABS32
Date: Mon, 22 May 2023 01:04:07 +0900 [thread overview]
Message-ID: <20230521160426.1881124-3-masahiroy@kernel.org> (raw)
In-Reply-To: <20230521160426.1881124-1-masahiroy@kernel.org>
addend_arm_rel() processes R_ARM_ABS32 in a wrong way.
Here, simple test code.
[test code 1]
#include <linux/init.h>
int __initdata foo;
int get_foo(int x) { return foo; }
If you compile it with ARM versatile_defconfig, modpost will show the
symbol name, (unknown).
WARNING: modpost: vmlinux.o: section mismatch in reference: get_foo (section: .text) -> (unknown) (section: .init.data)
If you compile it for other architectures, modpost will show the correct
symbol name.
WARNING: modpost: vmlinux.o: section mismatch in reference: get_foo (section: .text) -> foo (section: .init.data)
For R_ARM_ABS32, addend_arm_rel() sets r->r_addend to a wrong value.
I just mimicked the code in arch/arm/kernel/module.c.
However, there is more difficulty for ARM.
Here, test code.
[test code 2]
#include <linux/init.h>
int __initdata foo;
int get_foo(int x) { return foo; }
int __initdata bar;
int get_bar(int x) { return bar; }
With this commit applied, modpost will show the following messages
for ARM versatile_defconfig:
WARNING: modpost: vmlinux.o: section mismatch in reference: get_foo (section: .text) -> foo (section: .init.data)
WARNING: modpost: vmlinux.o: section mismatch in reference: get_bar (section: .text) -> foo (section: .init.data)
The reference from 'get_bar' to 'foo' seems wrong.
I have no solution for this because it is true in assembly level.
In the following output, relocation at 0x1c is no longer associated
with 'bar'. The two relocation entries point to the same symbol, and
the offset to 'bar' is encoded in the instruction 'r0, [r3, #4]'.
Disassembly of section .text:
00000000 <get_foo>:
0: e59f3004 ldr r3, [pc, #4] @ c <get_foo+0xc>
4: e5930000 ldr r0, [r3]
8: e12fff1e bx lr
c: 00000000 .word 0x00000000
00000010 <get_bar>:
10: e59f3004 ldr r3, [pc, #4] @ 1c <get_bar+0xc>
14: e5930004 ldr r0, [r3, #4]
18: e12fff1e bx lr
1c: 00000000 .word 0x00000000
Relocation section '.rel.text' at offset 0x244 contains 2 entries:
Offset Info Type Sym.Value Sym. Name
0000000c 00000c02 R_ARM_ABS32 00000000 .init.data
0000001c 00000c02 R_ARM_ABS32 00000000 .init.data
When find_elf_symbol() gets into a situation where relsym->st_name is
zero, there is no guarantee to get the symbol name as written in C.
I am keeping the current logic because it is useful in many architectures,
but the symbol name is not always correct depending on the optimization
of the relocation. I left some comments in find_tosym().
Fixes: 56a974fa2d59 ("kbuild: make better section mismatch reports on arm")
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
Changes in v6:
- More detailed commit log
scripts/mod/modpost.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 71de14544432..34fbbd85bfde 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -1124,6 +1124,10 @@ static Elf_Sym *find_tosym(struct elf_info *elf, Elf64_Sword addr,
if (relsym->st_name != 0)
return relsym;
+ /*
+ * Strive to find a better symbol name, but the resulting name does not
+ * always match the symbol referenced in the original code.
+ */
relsym_secindex = get_secindex(elf, relsym);
for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
if (get_secindex(elf, sym) != relsym_secindex)
@@ -1306,12 +1310,12 @@ static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
{
unsigned int r_typ = ELF_R_TYPE(r->r_info);
+ Elf_Sym *sym = elf->symtab_start + ELF_R_SYM(r->r_info);
+ unsigned int inst = TO_NATIVE(*reloc_location(elf, sechdr, r));
switch (r_typ) {
case R_ARM_ABS32:
- /* From ARM ABI: (S + A) | T */
- r->r_addend = (int)(long)
- (elf->symtab_start + ELF_R_SYM(r->r_info));
+ r->r_addend = inst + sym->st_value;
break;
case R_ARM_PC24:
case R_ARM_CALL:
--
2.39.2
next prev parent reply other threads:[~2023-05-21 16:05 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-21 16:04 [PATCH v6 00/20] Unify <linux/export.h> and <asm/export.h>, remove EXPORT_DATA_SYMBOL(), faster TRIM_UNUSED_KSYMS Masahiro Yamada
2023-05-21 16:04 ` [PATCH v6 01/20] Revert "modpost: skip ELF local symbols during section mismatch check" Masahiro Yamada
2023-05-22 17:42 ` Nick Desaulniers
2023-05-21 16:04 ` Masahiro Yamada [this message]
2023-05-22 17:56 ` [PATCH v6 02/20] modpost: fix section mismatch message for R_ARM_ABS32 Nick Desaulniers
2023-05-22 17:56 ` Nick Desaulniers
2023-05-22 21:35 ` Ard Biesheuvel
2023-05-22 21:35 ` Ard Biesheuvel
2023-05-23 5:07 ` Masahiro Yamada
2023-05-23 5:07 ` Masahiro Yamada
2023-05-23 7:13 ` Ard Biesheuvel
2023-05-23 7:13 ` Ard Biesheuvel
2023-05-21 16:04 ` [PATCH v6 03/20] modpost: detect section mismatch for R_ARM_MOVW_ABS_NC and R_ARM_MOVT_ABS Masahiro Yamada
2023-05-22 18:03 ` Nick Desaulniers
2023-05-22 18:03 ` Nick Desaulniers
2023-05-22 21:50 ` Ard Biesheuvel
2023-05-22 21:50 ` Ard Biesheuvel
2023-05-23 11:58 ` Masahiro Yamada
2023-05-23 11:58 ` Masahiro Yamada
2023-05-23 12:20 ` Ard Biesheuvel
2023-05-23 12:20 ` Ard Biesheuvel
2023-05-24 0:02 ` Masahiro Yamada
2023-05-24 0:02 ` Masahiro Yamada
2023-05-24 0:04 ` Masahiro Yamada
2023-05-24 0:04 ` Masahiro Yamada
2023-05-21 16:04 ` [PATCH v6 04/20] modpost: remove unused argument from secref_whitelist() Masahiro Yamada
2023-05-22 18:10 ` Nick Desaulniers
2023-05-21 16:04 ` [PATCH v6 05/20] modpost: refactor find_fromsym() and find_tosym() Masahiro Yamada
2023-05-22 18:18 ` Nick Desaulniers
2023-05-21 16:04 ` [PATCH v6 06/20] modpost: unify 'sym' and 'to' in default_mismatch_handler() Masahiro Yamada
2023-05-22 18:23 ` Nick Desaulniers
2023-05-21 16:04 ` [PATCH v6 07/20] modpost: replace r->r_offset, r->r_addend with faddr, taddr Masahiro Yamada
2023-05-22 18:31 ` Nick Desaulniers
2023-05-21 16:04 ` [PATCH v6 08/20] modpost: remove is_shndx_special() check from section_rel(a) Masahiro Yamada
2023-05-25 17:20 ` Nick Desaulniers
2023-05-21 16:04 ` [PATCH v6 09/20] modpost: pass struct module pointer to check_section_mismatch() Masahiro Yamada
2023-05-25 17:23 ` Nick Desaulniers
2023-05-21 16:04 ` [PATCH v6 10/20] kbuild: generate KSYMTAB entries by modpost Masahiro Yamada
2023-05-25 17:50 ` Nick Desaulniers
2023-06-02 13:51 ` Masahiro Yamada
2023-05-21 16:04 ` [PATCH v6 11/20] ia64,export.h: replace EXPORT_DATA_SYMBOL* with EXPORT_SYMBOL* Masahiro Yamada
2023-05-25 17:52 ` Nick Desaulniers
2023-05-21 16:04 ` [PATCH v6 12/20] modpost: check static EXPORT_SYMBOL* by modpost again Masahiro Yamada
2023-05-25 18:18 ` Nick Desaulniers
2023-05-21 16:04 ` [PATCH v6 13/20] modpost: squash sym_update_namespace() into sym_add_exported() Masahiro Yamada
2023-05-21 16:04 ` [PATCH v6 14/20] modpost: use null string instead of NULL pointer for default namespace Masahiro Yamada
2023-05-21 16:04 ` [PATCH v6 15/20] kbuild: implement CONFIG_TRIM_UNUSED_KSYMS without recursion Masahiro Yamada
2023-05-25 18:14 ` Nick Desaulniers
2023-05-28 7:40 ` Masahiro Yamada
2023-05-21 16:04 ` [PATCH v6 16/20] modpost: merge fromsec=DATA_SECTIONS entries in sectioncheck table Masahiro Yamada
2023-05-25 18:30 ` Nick Desaulniers
2023-05-21 16:04 ` [PATCH v6 17/20] modpost: merge bad_tosec=ALL_EXIT_SECTIONS " Masahiro Yamada
2023-05-25 18:36 ` Nick Desaulniers
2023-05-28 16:43 ` Masahiro Yamada
2023-05-21 16:04 ` [PATCH v6 18/20] modpost: remove *_sections[] arrays Masahiro Yamada
2023-05-21 16:04 ` [PATCH v6 19/20] modpost: merge two similar section mismatch warnings Masahiro Yamada
2023-05-25 18:20 ` Nick Desaulniers
2023-05-21 16:04 ` [PATCH v6 20/20] modpost: show offset from symbol for " Masahiro Yamada
2023-05-25 18:26 ` Nick Desaulniers
2023-05-28 7:29 ` Masahiro Yamada
2023-05-22 1:47 ` [PATCH v6 00/20] Unify <linux/export.h> and <asm/export.h>, remove EXPORT_DATA_SYMBOL(), faster TRIM_UNUSED_KSYMS Masahiro Yamada
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230521160426.1881124-3-masahiroy@kernel.org \
--to=masahiroy@kernel.org \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=nicolas@fjasle.eu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.