diff options
author | Kuan-Lin Chen <rufus@andestech.com> | 2017-06-08 11:54:14 -0700 |
---|---|---|
committer | Palmer Dabbelt <palmer@dabbelt.com> | 2017-06-26 18:26:40 -0700 |
commit | a6cbf936e3dce68114d28cdf60d510a3f78a6d40 (patch) | |
tree | dc4fe23922098e657bdab1a1f749a36e6bf27e9c /gas/config | |
parent | 7211ae501eb0de1044983f2dfb00091a58fbd66c (diff) | |
download | gdb-a6cbf936e3dce68114d28cdf60d510a3f78a6d40.zip gdb-a6cbf936e3dce68114d28cdf60d510a3f78a6d40.tar.gz gdb-a6cbf936e3dce68114d28cdf60d510a3f78a6d40.tar.bz2 |
RISC-V: Use pc-relative relocation for FDE initial location
The symbol address in .eh_frame may be adjusted in
_bfd_elf_discard_section_eh_frame, and the content of .eh_frame will be
adjusted in _bfd_elf_write_section_eh_frame. Therefore, we cannot insert
a relocation whose addend symbol is in .eh_frame. Othrewise, the value
may be adjusted twice.
bfd/ChangeLog
2017-06-26 Kuan-Lin Chen <rufus@andestech.com>
* elfnn-riscv.c (perform_relocation): Support the new
R_RISCV_32_PCREL relocation.
(riscv_elf_relocate_section): Likewise.
* elfxx-riscv.c (howto_table): Likewise.
(riscv_reloc_map): Likewise.
* bfd-in2.h (BFD_RELOC_RISCV_32_PCREL): New relocation.
* libbfd.h: Regenerate.
gas/ChangeLog
2017-06-26 Kuan-Lin Chen <rufus@andestech.com>
* config/tc-riscv.c (md_apply_fix) [BFD_RELOC_32]: Convert to a
R_RISCV_32_PCREL relocation.
include/ChangeLog
2017-06-26 Kuan-Lin Chen <rufus@andestech.com>
* elf/riscv.h (R_RISCV_32_PCREL): New.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-riscv.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index afda6c5..55c41c5 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -1871,6 +1871,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) bfd_byte *buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where); bfd_boolean relaxable = FALSE; offsetT loc; + segT sub_segment; /* Remember value for tc_gen_reloc. */ fixP->fx_addnumber = *valP; @@ -1919,8 +1920,25 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) _("TLS relocation against a constant")); break; - case BFD_RELOC_64: case BFD_RELOC_32: + /* Use pc-relative relocation for FDE initial location. + The symbol address in .eh_frame may be adjusted in + _bfd_elf_discard_section_eh_frame, and the content of + .eh_frame will be adjusted in _bfd_elf_write_section_eh_frame. + Therefore, we cannot insert a relocation whose addend symbol is + in .eh_frame. Othrewise, the value may be adjusted twice.*/ + if (fixP->fx_addsy && fixP->fx_subsy + && (sub_segment = S_GET_SEGMENT (fixP->fx_subsy)) + && strcmp (sub_segment->name, ".eh_frame") == 0 + && S_GET_VALUE (fixP->fx_subsy) + == fixP->fx_frag->fr_address + fixP->fx_where) + { + fixP->fx_r_type = BFD_RELOC_RISCV_32_PCREL; + fixP->fx_subsy = NULL; + break; + } + /* Fall through. */ + case BFD_RELOC_64: case BFD_RELOC_16: case BFD_RELOC_8: case BFD_RELOC_RISCV_CFA: |