bfd: Delete R_LARCH_NONE from dyn info of LoongArch.

Some R_LARCH_64 in section .eh_frame will to generate
  R_LARCH_NONE, we change relocation to R_LARCH_32_PCREL
  from R_LARCH_64 in setction .eh_frame and not generate
  dynamic relocation for R_LARCH_32_PCREL.

  Add New relocate type R_LARCH_32_PCREL for .eh_frame.

  include/elf/
    loongarch.h

  bfd/
    bfd/bfd-in2.h
    libbfd.h
    reloc.c
    elfxx-loongarch.c
    elfnn-loongarch.c

  gas/config/
    tc-loongarch.c

  binutils/
    readelf.c

  ld/testsuite/ld-elf/
    eh5.d
This commit is contained in:
liuzhensong 2022-07-20 19:55:27 +08:00
parent bc2a35c0b4
commit 9801120721
8 changed files with 41 additions and 3 deletions

View File

@ -6309,6 +6309,7 @@ assembler and not (currently) written to any object files. */
BFD_RELOC_LARCH_TLS_LD_HI20,
BFD_RELOC_LARCH_TLS_GD_PC_HI20,
BFD_RELOC_LARCH_TLS_GD_HI20,
BFD_RELOC_LARCH_32_PCREL,
BFD_RELOC_LARCH_RELAX,
BFD_RELOC_UNUSED };

View File

@ -2010,6 +2010,17 @@ perform_relocation (const Elf_Internal_Rela *rel, asection *input_section,
bfd_put (bits, input_bfd, opr1 - value, contents + rel->r_offset);
break;
/* For eh_frame and debug info. */
case R_LARCH_32_PCREL:
value -= sec_addr (input_section) + rel->r_offset;
value += rel->r_addend;
bfd_vma word = bfd_get (howto->bitsize, input_bfd,
contents + rel->r_offset);
word = (word & ~howto->dst_mask) | (value & howto->dst_mask);
bfd_put (howto->bitsize, input_bfd, word, contents + rel->r_offset);
r = bfd_reloc_ok;
break;
/* New reloc type.
R_LARCH_B16 ~ R_LARCH_TLS_GD_HI20. */
case R_LARCH_B16:

View File

@ -1327,7 +1327,24 @@ static loongarch_reloc_howto_type loongarch_howto_table[] =
reloc_bits, /* adjust_reloc_bits */
"gd_hi20"), /* larch_reloc_type_name */
LOONGARCH_HOWTO (R_LARCH_RELAX, /* type (99). */
LOONGARCH_HOWTO (R_LARCH_32_PCREL, /* type (99). */
0, /* rightshift. */
4, /* size. */
32, /* bitsize. */
true, /* pc_relative. */
0, /* bitpos. */
complain_overflow_dont, /* complain_on_overflow. */
bfd_elf_generic_reloc, /* special_function. */
"R_LARCH_32_PCREL", /* name. */
false, /* partial_inplace. */
0, /* src_mask */
0xffffffff, /* dst_mask */
false, /* pcrel_offset */
BFD_RELOC_LARCH_32_PCREL, /* bfd_reloc_code_real_type */
NULL, /* adjust_reloc_bits */
NULL), /* larch_reloc_type_name */
LOONGARCH_HOWTO (R_LARCH_RELAX, /* type (100). */
0, /* rightshift */
1, /* size */
0, /* bitsize */

View File

@ -3492,6 +3492,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_LARCH_TLS_LD_HI20",
"BFD_RELOC_LARCH_TLS_GD_PC_HI20",
"BFD_RELOC_LARCH_TLS_GD_HI20",
"BFD_RELOC_LARCH_32_PCREL",
"BFD_RELOC_LARCH_RELAX",
"@@overflow: BFD_RELOC_UNUSED@@",
};

View File

@ -8304,6 +8304,9 @@ ENUMX
ENUMX
BFD_RELOC_LARCH_TLS_GD_HI20
ENUMX
BFD_RELOC_LARCH_32_PCREL
ENUMX
BFD_RELOC_LARCH_RELAX

View File

@ -14389,6 +14389,8 @@ is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
case EM_AVR_OLD:
case EM_AVR:
return reloc_type == 36; /* R_AVR_32_PCREL. */
case EM_LOONGARCH:
return reloc_type == 99; /* R_LARCH_32_PCREL. */
case EM_MICROBLAZE:
return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
case EM_OR1K:

View File

@ -223,8 +223,11 @@ RELOC_NUMBER (R_LARCH_TLS_GD_PC_HI20, 97)
%gd_hi20 (sym). */
RELOC_NUMBER (R_LARCH_TLS_GD_HI20, 98)
/* For eh_frame and debug info. */
RELOC_NUMBER (R_LARCH_32_PCREL, 99)
/* RELAX. */
RELOC_NUMBER (R_LARCH_RELAX, 99)
RELOC_NUMBER (R_LARCH_RELAX, 100)
END_RELOC_NUMBERS (R_LARCH_count)

View File

@ -4,7 +4,7 @@
#ld:
#readelf: -wf
#target: [check_as_cfi]
#xfail: alpha-*-*ecoff hppa64-*-* tile*-*-* visium-*-* loongarch64-*-*
#xfail: alpha-*-*ecoff hppa64-*-* tile*-*-* visium-*-*
Contents of the .eh_frame section: