lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 400/452] kexec_file: drop weak attribute from arch_kexec_apply_relocations[_add]
    Date
    From: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>

    commit 3e35142ef99fe6b4fe5d834ad43ee13cca10a2dc upstream.

    Since commit d1bcae833b32f1 ("ELF: Don't generate unused section
    symbols") [1], binutils (v2.36+) started dropping section symbols that
    it thought were unused. This isn't an issue in general, but with
    kexec_file.c, gcc is placing kexec_arch_apply_relocations[_add] into a
    separate .text.unlikely section and the section symbol ".text.unlikely"
    is being dropped. Due to this, recordmcount is unable to find a non-weak
    symbol in .text.unlikely to generate a relocation record against.

    Address this by dropping the weak attribute from these functions.
    Instead, follow the existing pattern of having architectures #define the
    name of the function they want to override in their headers.

    [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=d1bcae833b32f1

    [akpm@linux-foundation.org: arch/s390/include/asm/kexec.h needs linux/module.h]
    Link: https://lkml.kernel.org/r/20220519091237.676736-1-naveen.n.rao@linux.vnet.ibm.com
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/s390/include/asm/kexec.h | 10 +++++++++
    arch/x86/include/asm/kexec.h | 8 +++++++
    include/linux/kexec.h | 46 ++++++++++++++++++++++++++++++++++--------
    kernel/kexec_file.c | 34 -------------------------------
    4 files changed, 56 insertions(+), 42 deletions(-)

    --- a/arch/s390/include/asm/kexec.h
    +++ b/arch/s390/include/asm/kexec.h
    @@ -9,6 +9,8 @@
    #ifndef _S390_KEXEC_H
    #define _S390_KEXEC_H

    +#include <linux/module.h>
    +
    #include <asm/processor.h>
    #include <asm/page.h>
    #include <asm/setup.h>
    @@ -83,4 +85,12 @@ struct kimage_arch {
    extern const struct kexec_file_ops s390_kexec_image_ops;
    extern const struct kexec_file_ops s390_kexec_elf_ops;

    +#ifdef CONFIG_KEXEC_FILE
    +struct purgatory_info;
    +int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
    + Elf_Shdr *section,
    + const Elf_Shdr *relsec,
    + const Elf_Shdr *symtab);
    +#define arch_kexec_apply_relocations_add arch_kexec_apply_relocations_add
    +#endif
    #endif /*_S390_KEXEC_H */
    --- a/arch/x86/include/asm/kexec.h
    +++ b/arch/x86/include/asm/kexec.h
    @@ -191,6 +191,14 @@ extern int arch_kexec_post_alloc_pages(v
    extern void arch_kexec_pre_free_pages(void *vaddr, unsigned int pages);
    #define arch_kexec_pre_free_pages arch_kexec_pre_free_pages

    +#ifdef CONFIG_KEXEC_FILE
    +struct purgatory_info;
    +int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
    + Elf_Shdr *section,
    + const Elf_Shdr *relsec,
    + const Elf_Shdr *symtab);
    +#define arch_kexec_apply_relocations_add arch_kexec_apply_relocations_add
    +#endif
    #endif

    typedef void crash_vmclear_fn(void);
    --- a/include/linux/kexec.h
    +++ b/include/linux/kexec.h
    @@ -187,14 +187,6 @@ void *kexec_purgatory_get_symbol_addr(st
    int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
    unsigned long buf_len);
    void *arch_kexec_kernel_image_load(struct kimage *image);
    -int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
    - Elf_Shdr *section,
    - const Elf_Shdr *relsec,
    - const Elf_Shdr *symtab);
    -int arch_kexec_apply_relocations(struct purgatory_info *pi,
    - Elf_Shdr *section,
    - const Elf_Shdr *relsec,
    - const Elf_Shdr *symtab);
    int arch_kimage_file_post_load_cleanup(struct kimage *image);
    #ifdef CONFIG_KEXEC_SIG
    int arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
    @@ -223,6 +215,44 @@ extern int crash_exclude_mem_range(struc
    unsigned long long mend);
    extern int crash_prepare_elf64_headers(struct crash_mem *mem, int kernel_map,
    void **addr, unsigned long *sz);
    +
    +#ifndef arch_kexec_apply_relocations_add
    +/*
    + * arch_kexec_apply_relocations_add - apply relocations of type RELA
    + * @pi: Purgatory to be relocated.
    + * @section: Section relocations applying to.
    + * @relsec: Section containing RELAs.
    + * @symtab: Corresponding symtab.
    + *
    + * Return: 0 on success, negative errno on error.
    + */
    +static inline int
    +arch_kexec_apply_relocations_add(struct purgatory_info *pi, Elf_Shdr *section,
    + const Elf_Shdr *relsec, const Elf_Shdr *symtab)
    +{
    + pr_err("RELA relocation unsupported.\n");
    + return -ENOEXEC;
    +}
    +#endif
    +
    +#ifndef arch_kexec_apply_relocations
    +/*
    + * arch_kexec_apply_relocations - apply relocations of type REL
    + * @pi: Purgatory to be relocated.
    + * @section: Section relocations applying to.
    + * @relsec: Section containing RELs.
    + * @symtab: Corresponding symtab.
    + *
    + * Return: 0 on success, negative errno on error.
    + */
    +static inline int
    +arch_kexec_apply_relocations(struct purgatory_info *pi, Elf_Shdr *section,
    + const Elf_Shdr *relsec, const Elf_Shdr *symtab)
    +{
    + pr_err("REL relocation unsupported.\n");
    + return -ENOEXEC;
    +}
    +#endif
    #endif /* CONFIG_KEXEC_FILE */

    #ifdef CONFIG_KEXEC_ELF
    --- a/kernel/kexec_file.c
    +++ b/kernel/kexec_file.c
    @@ -109,40 +109,6 @@ int __weak arch_kexec_kernel_verify_sig(
    #endif

    /*
    - * arch_kexec_apply_relocations_add - apply relocations of type RELA
    - * @pi: Purgatory to be relocated.
    - * @section: Section relocations applying to.
    - * @relsec: Section containing RELAs.
    - * @symtab: Corresponding symtab.
    - *
    - * Return: 0 on success, negative errno on error.
    - */
    -int __weak
    -arch_kexec_apply_relocations_add(struct purgatory_info *pi, Elf_Shdr *section,
    - const Elf_Shdr *relsec, const Elf_Shdr *symtab)
    -{
    - pr_err("RELA relocation unsupported.\n");
    - return -ENOEXEC;
    -}
    -
    -/*
    - * arch_kexec_apply_relocations - apply relocations of type REL
    - * @pi: Purgatory to be relocated.
    - * @section: Section relocations applying to.
    - * @relsec: Section containing RELs.
    - * @symtab: Corresponding symtab.
    - *
    - * Return: 0 on success, negative errno on error.
    - */
    -int __weak
    -arch_kexec_apply_relocations(struct purgatory_info *pi, Elf_Shdr *section,
    - const Elf_Shdr *relsec, const Elf_Shdr *symtab)
    -{
    - pr_err("REL relocation unsupported.\n");
    - return -ENOEXEC;
    -}
    -
    -/*
    * Free up memory used by kernel, initrd, and command line. This is temporary
    * memory allocation which is not needed any more after these buffers have
    * been loaded into separate segments and have been copied elsewhere.

    \
     
     \ /
      Last update: 2022-06-07 20:08    [W:4.977 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site