15 Jan, 2021

1 commit

  • With LTO, the compiler doesn't necessarily obey the link order for
    initcalls, and initcall variables need globally unique names to avoid
    collisions at link time.

    This change exports __KBUILD_MODNAME and adds the initcall_id() macro,
    which uses it together with __COUNTER__ and __LINE__ to help ensure
    these variables have unique names, and moves each variable to its own
    section when LTO is enabled, so the correct order can be specified using
    a linker script.

    The generate_initcall_ordering.pl script uses nm to find initcalls from
    the object files passed to the linker, and generates a linker script
    that specifies the same order for initcalls that we would have without
    LTO. With LTO enabled, the script is called in link-vmlinux.sh through
    jobserver-exec to limit the number of jobs spawned.

    Signed-off-by: Sami Tolvanen
    Reviewed-by: Kees Cook
    Signed-off-by: Kees Cook
    Link: https://lore.kernel.org/r/20201211184633.3213045-8-samitolvanen@google.com

    Sami Tolvanen