• Alexey Kardashevskiy's avatar
    powerpc/64: Add UADDR64 relocation support · d7997691
    Alexey Kardashevskiy authored
    When ld detects unaligned relocations, it emits R_PPC64_UADDR64
    relocations instead of R_PPC64_RELATIVE. Currently R_PPC64_UADDR64 are
    detected by arch/powerpc/tools/relocs_check.sh and expected not to work.
    Below is a simple chunk to trigger this behaviour (this disables
    optimization for the demonstration purposes only, this also happens with
    -O1/-O2 when CONFIG_PRINTK_INDEX=y, for example):
    
      \#pragma GCC push_options
      \#pragma GCC optimize ("O0")
      struct entry {
              const char *file;
              int line;
      } __attribute__((packed));
      static const struct entry e1 = { .file = __FILE__, .line = __LINE__ };
      static const struct entry e2 = { .file = __FILE__, .line = __LINE__ };
      ...
      prom_printf("e1=%s %lx %lx\n", e1.file, (unsigned long) e1.file, mfmsr());
      prom_printf("e2=%s %lx\n", e2.file, (unsigned long) e2.file);
      \#pragma GCC pop_options
    
    This adds support for UADDR64 for 64bit. This reuses __dynamic_symtab
    from the 32bit code which supports more relocation types already.
    
    Because RELACOUNT includes only R_PPC64_RELATIVE, this replaces it with
    RELASZ which is the size of all relocation records.
    Signed-off-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20220309061822.168173-1-aik@ozlabs.ru
    d7997691
reloc_64.S 2.46 KB