lkml.org 
[lkml]   [2019]   [Dec]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 158/243] modpost: skip ELF local symbols during section mismatch check
    Date
    From: Paul Walmsley <paul.walmsley@sifive.com>

    [ Upstream commit a4d26f1a0958bb1c2b60c6f1e67c6f5d43e2647b ]

    During development of a serial console driver with a gcc 8.2.0
    toolchain for RISC-V, the following modpost warning appeared:

    ----
    WARNING: vmlinux.o(.data+0x19b10): Section mismatch in reference from the variable .LANCHOR1 to the function .init.text:sifive_serial_console_setup()
    The variable .LANCHOR1 references
    the function __init sifive_serial_console_setup()
    If the reference is valid then annotate the
    variable with __init* or __refdata (see linux/init.h) or name the variable:
    *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console
    ----

    ".LANCHOR1" is an ELF local symbol, automatically created by gcc's section
    anchor generation code:

    https://gcc.gnu.org/onlinedocs/gccint/Anchored-Addresses.html

    https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/varasm.c;h=cd9591a45617464946dcf9a126dde277d9de9804;hb=9fb89fa845c1b2e0a18d85ada0b077c84508ab78#l7473

    This was verified by compiling the kernel with -fno-section-anchors
    and observing that the ".LANCHOR1" ELF local symbol disappeared, and
    modpost no longer warned about the section mismatch. The serial
    driver code idiom triggering the warning is standard Linux serial
    driver practice that has a specific whitelist inclusion in modpost.c.

    I'm neither a modpost nor an ELF expert, but naively, it doesn't seem
    useful for modpost to report section mismatch warnings caused by ELF
    local symbols by default. Local symbols have compiler-generated
    names, and thus bypass modpost's whitelisting algorithm, which relies
    on the presence of a non-autogenerated symbol name. This increases
    the likelihood that false positive warnings will be generated (as in
    the above case).

    Thus, disable section mismatch reporting on ELF local symbols. The
    rationale here is similar to that of commit 2e3a10a1551d ("ARM: avoid
    ARM binutils leaking ELF local symbols") and of similar code already
    present in modpost.c:

    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/mod/modpost.c?h=v4.19-rc4&id=7876320f88802b22d4e2daf7eb027dd14175a0f8#n1256

    This third version of the patch implements a suggestion from Masahiro
    Yamada <yamada.masahiro@socionext.com> to restructure the code as an
    additional pattern matching step inside secref_whitelist(), and
    further improves the patch description.

    Signed-off-by: Paul Walmsley <paul.walmsley@sifive.com>
    Signed-off-by: Paul Walmsley <paul@pwsan.com>
    Acked-by: Sam Ravnborg <sam@ravnborg.org>
    Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    scripts/mod/modpost.c | 12 ++++++++++++
    1 file changed, 12 insertions(+)

    diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
    index 858cbe56b1006..91a80036c05d5 100644
    --- a/scripts/mod/modpost.c
    +++ b/scripts/mod/modpost.c
    @@ -1163,6 +1163,14 @@ static const struct sectioncheck *section_mismatch(
    * fromsec = text section
    * refsymname = *.constprop.*
    *
    + * Pattern 6:
    + * Hide section mismatch warnings for ELF local symbols. The goal
    + * is to eliminate false positive modpost warnings caused by
    + * compiler-generated ELF local symbol names such as ".LANCHOR1".
    + * Autogenerated symbol names bypass modpost's "Pattern 2"
    + * whitelisting, which relies on pattern-matching against symbol
    + * names to work. (One situation where gcc can autogenerate ELF
    + * local symbols is when "-fsection-anchors" is used.)
    **/
    static int secref_whitelist(const struct sectioncheck *mismatch,
    const char *fromsec, const char *fromsym,
    @@ -1201,6 +1209,10 @@ static int secref_whitelist(const struct sectioncheck *mismatch,
    match(fromsym, optim_symbols))
    return 0;

    + /* Check for pattern 6 */
    + if (strstarts(fromsym, ".L"))
    + return 0;
    +
    return 1;
    }

    --
    2.20.1


    \
     
     \ /
      Last update: 2019-12-11 16:23    [W:4.023 / U:0.208 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site