• Michael Ellerman's avatar
    powerpc: Avoid dead code/data elimination when using recordmcount · f8b2336f
    Michael Ellerman authored
    Although powerpc now has objtool mcount support, it's not enabled in all
    configurations due to dependencies.
    
    On those configurations, with some linkers (binutils 2.37 at least),
    it's still possible to hit the dreaded "recordmcount bug", eg. errors
    such as:
    
        CC      kernel/kexec_file.o
      Cannot find symbol for section 10: .text.unlikely.
      kernel/kexec_file.o: failed
      make[1]: *** [scripts/Makefile.build:287 : kernel/kexec_file.o] Error 1
    
    Those errors are much more prevalent when building with
    CONFIG_LD_DEAD_CODE_DATA_ELIMINATION, because it places every function
    in a separate section.
    
    CONFIG_LD_DEAD_CODE_DATA_ELIMINATION is marked experimental and is not
    enabled in any powerpc defconfigs or by major distros. Although it does
    have at least some users on 32-bit where kernel size tends to be more
    important.
    
    Avoid the build errors by blocking CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
    when the build is using recordmcount, rather than objtool. In practice
    that means for 64-bit big endian builds, or 64-bit clang builds - both
    because they lack CONFIG_MPROFILE_KERNEL.
    
    On 32-bit objtool is always used, so
    CONFIG_LD_DEAD_CODE_DATA_ELIMINATION is still available there.
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20230221130331.2714199-1-mpe@ellerman.id.au
    f8b2336f
Kconfig 39.8 KB