Skip to content
Snippets Groups Projects
  1. Jan 16, 2022
    • Alexander Egorenkov's avatar
      s390/kexec: handle R_390_PLT32DBL rela in arch_kexec_apply_relocations_add() · 0ed0be75
      Alexander Egorenkov authored
      commit abf0e8e4 upstream.
      
      Starting with gcc 11.3, the C compiler will generate PLT-relative function
      calls even if they are local and do not require it. Later on during linking,
      the linker will replace all PLT-relative calls to local functions with
      PC-relative ones. Unfortunately, the purgatory code of kexec/kdump is
      not being linked as a regular executable or shared library would have been,
      and therefore, all PLT-relative addresses remain in the generated purgatory
      object code unresolved. This leads to the situation where the purgatory
      code is being executed during kdump with all PLT-relative addresses
      unresolved. And this results in endless loops within the purgatory code.
      
      Furthermore, the clang C compiler has always behaved like described above
      and this commit should fix kdump for kernels built with the latter.
      
      Because the purgatory code is no regular executable or shared library,
      contains only calls to local functions and has no PLT, all R_390_PLT32DBL
      relocation entries can be resolved just like a R_390_PC32DBL one.
      
      * https://refspecs.linuxfoundation.org/ELF/zSeries/lzsabi0_zSeries/x1633.html#AEN1699
      
      
      
      Relocation entries of purgatory code generated with gcc 11.3
      ------------------------------------------------------------
      
      $ readelf -r linux/arch/s390/purgatory/purgatory.o
      
      Relocation section '.rela.text' at offset 0x370 contains 5 entries:
        Offset          Info           Type           Sym. Value    Sym. Name + Addend
      00000000005c  000c00000013 R_390_PC32DBL     0000000000000000 purgatory_sha_regions + 2
      00000000007a  000d00000014 R_390_PLT32DBL    0000000000000000 sha256_update + 2
      00000000008c  000e00000014 R_390_PLT32DBL    0000000000000000 sha256_final + 2
      000000000092  000800000013 R_390_PC32DBL     0000000000000000 .LC0 + 2
      0000000000a0  000f00000014 R_390_PLT32DBL    0000000000000000 memcmp + 2
      
      Relocation entries of purgatory code generated with gcc 11.2
      ------------------------------------------------------------
      
      $ readelf -r linux/arch/s390/purgatory/purgatory.o
      
      Relocation section '.rela.text' at offset 0x368 contains 5 entries:
        Offset          Info           Type           Sym. Value    Sym. Name + Addend
      00000000005c  000c00000013 R_390_PC32DBL     0000000000000000 purgatory_sha_regions + 2
      00000000007a  000d00000013 R_390_PC32DBL     0000000000000000 sha256_update + 2
      00000000008c  000e00000013 R_390_PC32DBL     0000000000000000 sha256_final + 2
      000000000092  000800000013 R_390_PC32DBL     0000000000000000 .LC0 + 2
      0000000000a0  000f00000013 R_390_PC32DBL     0000000000000000 memcmp + 2
      
      Signed-off-by: default avatarAlexander Egorenkov <egorenar@linux.ibm.com>
      Reported-by: default avatarTao Liu <ltao@redhat.com>
      Suggested-by: default avatarPhilipp Rudo <prudo@redhat.com>
      Reviewed-by: default avatarPhilipp Rudo <prudo@redhat.com>
      Cc: <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20211209073817.82196-1-egorenar@linux.ibm.com
      
      
      Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0ed0be75
  2. Jan 11, 2022
Loading