diff options
author | liuzhensong <liuzhensong@loongson.cn> | 2022-07-20 19:55:27 +0800 |
---|---|---|
committer | liuzhensong <liuzhensong@loongson.cn> | 2022-07-25 09:59:08 +0800 |
commit | 9801120721c3a702ce3bd50433ef920f92a83502 (patch) | |
tree | a4636cc25aac46f15fc1e7d7d62ce9573057b956 /bfd | |
parent | bc2a35c0b48a93db21af2e7c429dc83828c672c8 (diff) | |
download | fsf-binutils-gdb-9801120721c3a702ce3bd50433ef920f92a83502.zip fsf-binutils-gdb-9801120721c3a702ce3bd50433ef920f92a83502.tar.gz fsf-binutils-gdb-9801120721c3a702ce3bd50433ef920f92a83502.tar.bz2 |
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
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/bfd-in2.h | 1 | ||||
-rw-r--r-- | bfd/elfnn-loongarch.c | 11 | ||||
-rw-r--r-- | bfd/elfxx-loongarch.c | 19 | ||||
-rw-r--r-- | bfd/libbfd.h | 1 | ||||
-rw-r--r-- | bfd/reloc.c | 3 |
5 files changed, 34 insertions, 1 deletions
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 91e6ad7..2d6e1bb 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -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 }; diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c index 3d86e14..4efe3d9 100644 --- a/bfd/elfnn-loongarch.c +++ b/bfd/elfnn-loongarch.c @@ -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: diff --git a/bfd/elfxx-loongarch.c b/bfd/elfxx-loongarch.c index f059f1a..0b00df5 100644 --- a/bfd/elfxx-loongarch.c +++ b/bfd/elfxx-loongarch.c @@ -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 */ diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 7eaa75a..c766722 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -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@@", }; diff --git a/bfd/reloc.c b/bfd/reloc.c index 59c2aaa..268e4b1 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -8305,6 +8305,9 @@ ENUMX BFD_RELOC_LARCH_TLS_GD_HI20 ENUMX + BFD_RELOC_LARCH_32_PCREL + +ENUMX BFD_RELOC_LARCH_RELAX ENUMDOC |