• Sami Tolvanen's avatar
    init: lto: ensure initcall ordering · a8cccdd9
    Sami Tolvanen authored
    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: default avatarSami Tolvanen <samitolvanen@google.com>
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20201211184633.3213045-8-samitolvanen@google.com
    a8cccdd9
generate_initcall_order.pl 5.95 KB