• Masahiro Yamada's avatar
    modpost: extract symbol versions from *.cmd files · f292d875
    Masahiro Yamada authored
    Currently, CONFIG_MODVERSIONS needs extra link to embed the symbol
    versions into ELF objects. Then, modpost extracts the version CRCs
    from them.
    
    The following figures show how it currently works, and how I am trying
    to change it.
    
    Current implementation
    ======================
                                                               |----------|
                     embed CRC      -------------------------->| final    |
           $(CC)       $(LD)       /  |---------|              | link for |
           -----> *.o -------> *.o -->| modpost |              | vmlinux  |
          /              /            |         |-- *.mod.c -->| or       |
         / genksyms     /             |---------|              | module   |
      *.c ------> *.symversions                                |----------|
    
    Genksyms outputs the calculated CRCs in the form of linker script
    (*.symversions), which is used by $(LD) to update the object.
    
    If CONFIG_LTO_CLANG=y, the build process is much more complex. Embedding
    the CRCs is postponed until the LLVM bitcode is converted into ELF,
    creating another intermediate *.prelink.o.
    
    However, this complexity is unneeded. There is no reason why we must
    embed version CRCs in objects so early.
    
    There is final link stage for vmlinux (scripts/link-vmlinux.sh) and
    modules (scripts/Makefile.modfinal). We can link CRCs at the very last
    moment.
    
    New implementation
    ==================
                                                               |----------|
                       --------------------------------------->| final    |
           $(CC)      /    |---------|                         | link for |
           -----> *.o ---->|         |                         | vmlinux  |
          /                | modpost |--- .vmlinux.export.c -->| or       |
         / genksyms        |         |--- *.mod.c ------------>| module   |
      *.c ------> *.cmd -->|---------|                         |----------|
    
    Pass the symbol versions to modpost as separate text data, which are
    available in *.cmd files.
    
    This commit changes modpost to extract CRCs from *.cmd files instead of
    from ELF objects.
    Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: default avatarNicolas Schier <nicolas@fjasle.eu>
    Tested-by: default avatarNathan Chancellor <nathan@kernel.org>
    Reviewed-by: default avatarSami Tolvanen <samitolvanen@google.com>
    Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # LLVM-14 (x86-64)
    f292d875
modpost.c 67.6 KB