1 /* RISC-V-specific support for NN-bit ELF.
2 Copyright (C) 2011-2017 Free Software Foundation, Inc.
4 Contributed by Andrew Waterman (andrew@sifive.com).
5 Based on TILE-Gx and MIPS targets.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; see the file COPYING3. If not,
21 see <http://www.gnu.org/licenses/>. */
23 /* This file handles RISC-V ELF targets. */
31 #include "elfxx-riscv.h"
32 #include "elf/riscv.h"
33 #include "opcode/riscv.h"
35 /* Internal relocations used exclusively by the relaxation pass. */
36 #define R_RISCV_DELETE (R_RISCV_max + 1)
40 #define MINUS_ONE ((bfd_vma)0 - 1)
42 #define RISCV_ELF_LOG_WORD_BYTES (ARCH_SIZE == 32 ? 2 : 3)
44 #define RISCV_ELF_WORD_BYTES (1 << RISCV_ELF_LOG_WORD_BYTES)
46 /* The name of the dynamic interpreter. This is put in the .interp
49 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld.so.1"
50 #define ELF32_DYNAMIC_INTERPRETER "/lib32/ld.so.1"
52 #define ELF_ARCH bfd_arch_riscv
53 #define ELF_TARGET_ID RISCV_ELF_DATA
54 #define ELF_MACHINE_CODE EM_RISCV
55 #define ELF_MAXPAGESIZE 0x1000
56 #define ELF_COMMONPAGESIZE 0x1000
58 /* The RISC-V linker needs to keep track of the number of relocs that it
59 decides to copy as dynamic relocs in check_relocs for each symbol.
60 This is so that it can later discard them if they are found to be
61 unnecessary. We store the information in a field extending the
62 regular ELF linker hash table. */
64 struct riscv_elf_dyn_relocs
66 struct riscv_elf_dyn_relocs *next;
68 /* The input section of the reloc. */
71 /* Total number of relocs copied for the input section. */
74 /* Number of pc-relative relocs copied for the input section. */
75 bfd_size_type pc_count;
78 /* RISC-V ELF linker hash entry. */
80 struct riscv_elf_link_hash_entry
82 struct elf_link_hash_entry elf;
84 /* Track dynamic relocs copied for this symbol. */
85 struct riscv_elf_dyn_relocs *dyn_relocs;
95 #define riscv_elf_hash_entry(ent) \
96 ((struct riscv_elf_link_hash_entry *)(ent))
98 struct _bfd_riscv_elf_obj_tdata
100 struct elf_obj_tdata root;
102 /* tls_type for each local got entry. */
103 char *local_got_tls_type;
106 #define _bfd_riscv_elf_tdata(abfd) \
107 ((struct _bfd_riscv_elf_obj_tdata *) (abfd)->tdata.any)
109 #define _bfd_riscv_elf_local_got_tls_type(abfd) \
110 (_bfd_riscv_elf_tdata (abfd)->local_got_tls_type)
112 #define _bfd_riscv_elf_tls_type(abfd, h, symndx) \
113 (*((h) != NULL ? &riscv_elf_hash_entry (h)->tls_type \
114 : &_bfd_riscv_elf_local_got_tls_type (abfd) [symndx]))
116 #define is_riscv_elf(bfd) \
117 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
118 && elf_tdata (bfd) != NULL \
119 && elf_object_id (bfd) == RISCV_ELF_DATA)
121 #include "elf/common.h"
122 #include "elf/internal.h"
124 struct riscv_elf_link_hash_table
126 struct elf_link_hash_table elf;
128 /* Short-cuts to get to dynamic linker sections. */
131 /* Small local sym to section mapping cache. */
132 struct sym_cache sym_cache;
134 /* The max alignment of output sections. */
135 bfd_vma max_alignment;
139 /* Get the RISC-V ELF linker hash table from a link_info structure. */
140 #define riscv_elf_hash_table(p) \
141 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
142 == RISCV_ELF_DATA ? ((struct riscv_elf_link_hash_table *) ((p)->hash)) : NULL)
145 riscv_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
147 Elf_Internal_Rela *dst)
149 cache_ptr->howto = riscv_elf_rtype_to_howto (ELFNN_R_TYPE (dst->r_info));
153 riscv_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
155 const struct elf_backend_data *bed;
158 bed = get_elf_backend_data (abfd);
159 loc = s->contents + (s->reloc_count++ * bed->s->sizeof_rela);
160 bed->s->swap_reloca_out (abfd, rel, loc);
165 #define PLT_HEADER_INSNS 8
166 #define PLT_ENTRY_INSNS 4
167 #define PLT_HEADER_SIZE (PLT_HEADER_INSNS * 4)
168 #define PLT_ENTRY_SIZE (PLT_ENTRY_INSNS * 4)
170 #define GOT_ENTRY_SIZE RISCV_ELF_WORD_BYTES
172 #define GOTPLT_HEADER_SIZE (2 * GOT_ENTRY_SIZE)
174 #define sec_addr(sec) ((sec)->output_section->vma + (sec)->output_offset)
177 riscv_elf_got_plt_val (bfd_vma plt_index, struct bfd_link_info *info)
179 return sec_addr (riscv_elf_hash_table (info)->elf.sgotplt)
180 + GOTPLT_HEADER_SIZE + (plt_index * GOT_ENTRY_SIZE);
184 # define MATCH_LREG MATCH_LW
186 # define MATCH_LREG MATCH_LD
189 /* Generate a PLT header. */
192 riscv_make_plt_header (bfd_vma gotplt_addr, bfd_vma addr, uint32_t *entry)
194 bfd_vma gotplt_offset_high = RISCV_PCREL_HIGH_PART (gotplt_addr, addr);
195 bfd_vma gotplt_offset_low = RISCV_PCREL_LOW_PART (gotplt_addr, addr);
197 /* auipc t2, %hi(.got.plt)
198 sub t1, t1, t3 # shifted .got.plt offset + hdr size + 12
199 l[w|d] t3, %lo(.got.plt)(t2) # _dl_runtime_resolve
200 addi t1, t1, -(hdr size + 12) # shifted .got.plt offset
201 addi t0, t2, %lo(.got.plt) # &.got.plt
202 srli t1, t1, log2(16/PTRSIZE) # .got.plt offset
203 l[w|d] t0, PTRSIZE(t0) # link map
206 entry[0] = RISCV_UTYPE (AUIPC, X_T2, gotplt_offset_high);
207 entry[1] = RISCV_RTYPE (SUB, X_T1, X_T1, X_T3);
208 entry[2] = RISCV_ITYPE (LREG, X_T3, X_T2, gotplt_offset_low);
209 entry[3] = RISCV_ITYPE (ADDI, X_T1, X_T1, -(PLT_HEADER_SIZE + 12));
210 entry[4] = RISCV_ITYPE (ADDI, X_T0, X_T2, gotplt_offset_low);
211 entry[5] = RISCV_ITYPE (SRLI, X_T1, X_T1, 4 - RISCV_ELF_LOG_WORD_BYTES);
212 entry[6] = RISCV_ITYPE (LREG, X_T0, X_T0, RISCV_ELF_WORD_BYTES);
213 entry[7] = RISCV_ITYPE (JALR, 0, X_T3, 0);
216 /* Generate a PLT entry. */
219 riscv_make_plt_entry (bfd_vma got, bfd_vma addr, uint32_t *entry)
221 /* auipc t3, %hi(.got.plt entry)
222 l[w|d] t3, %lo(.got.plt entry)(t3)
226 entry[0] = RISCV_UTYPE (AUIPC, X_T3, RISCV_PCREL_HIGH_PART (got, addr));
227 entry[1] = RISCV_ITYPE (LREG, X_T3, X_T3, RISCV_PCREL_LOW_PART (got, addr));
228 entry[2] = RISCV_ITYPE (JALR, X_T1, X_T3, 0);
229 entry[3] = RISCV_NOP;
232 /* Create an entry in an RISC-V ELF linker hash table. */
234 static struct bfd_hash_entry *
235 link_hash_newfunc (struct bfd_hash_entry *entry,
236 struct bfd_hash_table *table, const char *string)
238 /* Allocate the structure if it has not already been allocated by a
243 bfd_hash_allocate (table,
244 sizeof (struct riscv_elf_link_hash_entry));
249 /* Call the allocation method of the superclass. */
250 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
253 struct riscv_elf_link_hash_entry *eh;
255 eh = (struct riscv_elf_link_hash_entry *) entry;
256 eh->dyn_relocs = NULL;
257 eh->tls_type = GOT_UNKNOWN;
263 /* Create a RISC-V ELF linker hash table. */
265 static struct bfd_link_hash_table *
266 riscv_elf_link_hash_table_create (bfd *abfd)
268 struct riscv_elf_link_hash_table *ret;
269 bfd_size_type amt = sizeof (struct riscv_elf_link_hash_table);
271 ret = (struct riscv_elf_link_hash_table *) bfd_zmalloc (amt);
275 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
276 sizeof (struct riscv_elf_link_hash_entry),
283 ret->max_alignment = (bfd_vma) -1;
284 return &ret->elf.root;
287 /* Create the .got section. */
290 riscv_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
294 struct elf_link_hash_entry *h;
295 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
296 struct elf_link_hash_table *htab = elf_hash_table (info);
298 /* This function may be called more than once. */
299 if (htab->sgot != NULL)
302 flags = bed->dynamic_sec_flags;
304 s = bfd_make_section_anyway_with_flags (abfd,
305 (bed->rela_plts_and_copies_p
306 ? ".rela.got" : ".rel.got"),
307 (bed->dynamic_sec_flags
310 || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
314 s = s_got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
316 || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
320 /* The first bit of the global offset table is the header. */
321 s->size += bed->got_header_size;
323 if (bed->want_got_plt)
325 s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
327 || !bfd_set_section_alignment (abfd, s,
328 bed->s->log_file_align))
332 /* Reserve room for the header. */
333 s->size += GOTPLT_HEADER_SIZE;
336 if (bed->want_got_sym)
338 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
339 section. We don't do this in the linker script because we don't want
340 to define the symbol if we are not creating a global offset
342 h = _bfd_elf_define_linkage_sym (abfd, info, s_got,
343 "_GLOBAL_OFFSET_TABLE_");
344 elf_hash_table (info)->hgot = h;
352 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
353 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
357 riscv_elf_create_dynamic_sections (bfd *dynobj,
358 struct bfd_link_info *info)
360 struct riscv_elf_link_hash_table *htab;
362 htab = riscv_elf_hash_table (info);
363 BFD_ASSERT (htab != NULL);
365 if (!riscv_elf_create_got_section (dynobj, info))
368 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
371 if (!bfd_link_pic (info))
374 bfd_make_section_anyway_with_flags (dynobj, ".tdata.dyn",
375 SEC_ALLOC | SEC_THREAD_LOCAL);
378 if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss
379 || (!bfd_link_pic (info) && (!htab->elf.srelbss || !htab->sdyntdata)))
385 /* Copy the extra info we tack onto an elf_link_hash_entry. */
388 riscv_elf_copy_indirect_symbol (struct bfd_link_info *info,
389 struct elf_link_hash_entry *dir,
390 struct elf_link_hash_entry *ind)
392 struct riscv_elf_link_hash_entry *edir, *eind;
394 edir = (struct riscv_elf_link_hash_entry *) dir;
395 eind = (struct riscv_elf_link_hash_entry *) ind;
397 if (eind->dyn_relocs != NULL)
399 if (edir->dyn_relocs != NULL)
401 struct riscv_elf_dyn_relocs **pp;
402 struct riscv_elf_dyn_relocs *p;
404 /* Add reloc counts against the indirect sym to the direct sym
405 list. Merge any entries against the same section. */
406 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
408 struct riscv_elf_dyn_relocs *q;
410 for (q = edir->dyn_relocs; q != NULL; q = q->next)
411 if (q->sec == p->sec)
413 q->pc_count += p->pc_count;
414 q->count += p->count;
421 *pp = edir->dyn_relocs;
424 edir->dyn_relocs = eind->dyn_relocs;
425 eind->dyn_relocs = NULL;
428 if (ind->root.type == bfd_link_hash_indirect
429 && dir->got.refcount <= 0)
431 edir->tls_type = eind->tls_type;
432 eind->tls_type = GOT_UNKNOWN;
434 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
438 riscv_elf_record_tls_type (bfd *abfd, struct elf_link_hash_entry *h,
439 unsigned long symndx, char tls_type)
441 char *new_tls_type = &_bfd_riscv_elf_tls_type (abfd, h, symndx);
443 *new_tls_type |= tls_type;
444 if ((*new_tls_type & GOT_NORMAL) && (*new_tls_type & ~GOT_NORMAL))
446 (*_bfd_error_handler)
447 (_("%B: `%s' accessed both as normal and thread local symbol"),
448 abfd, h ? h->root.root.string : "<local>");
455 riscv_elf_record_got_reference (bfd *abfd, struct bfd_link_info *info,
456 struct elf_link_hash_entry *h, long symndx)
458 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
459 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
461 if (htab->elf.sgot == NULL)
463 if (!riscv_elf_create_got_section (htab->elf.dynobj, info))
469 h->got.refcount += 1;
473 /* This is a global offset table entry for a local symbol. */
474 if (elf_local_got_refcounts (abfd) == NULL)
476 bfd_size_type size = symtab_hdr->sh_info * (sizeof (bfd_vma) + 1);
477 if (!(elf_local_got_refcounts (abfd) = bfd_zalloc (abfd, size)))
479 _bfd_riscv_elf_local_got_tls_type (abfd)
480 = (char *) (elf_local_got_refcounts (abfd) + symtab_hdr->sh_info);
482 elf_local_got_refcounts (abfd) [symndx] += 1;
488 bad_static_reloc (bfd *abfd, unsigned r_type, struct elf_link_hash_entry *h)
490 (*_bfd_error_handler)
491 (_("%B: relocation %s against `%s' can not be used when making a shared "
492 "object; recompile with -fPIC"),
493 abfd, riscv_elf_rtype_to_howto (r_type)->name,
494 h != NULL ? h->root.root.string : "a local symbol");
495 bfd_set_error (bfd_error_bad_value);
498 /* Look through the relocs for a section during the first phase, and
499 allocate space in the global offset table or procedure linkage
503 riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
504 asection *sec, const Elf_Internal_Rela *relocs)
506 struct riscv_elf_link_hash_table *htab;
507 Elf_Internal_Shdr *symtab_hdr;
508 struct elf_link_hash_entry **sym_hashes;
509 const Elf_Internal_Rela *rel;
510 asection *sreloc = NULL;
512 if (bfd_link_relocatable (info))
515 htab = riscv_elf_hash_table (info);
516 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
517 sym_hashes = elf_sym_hashes (abfd);
519 if (htab->elf.dynobj == NULL)
520 htab->elf.dynobj = abfd;
522 for (rel = relocs; rel < relocs + sec->reloc_count; rel++)
525 unsigned int r_symndx;
526 struct elf_link_hash_entry *h;
528 r_symndx = ELFNN_R_SYM (rel->r_info);
529 r_type = ELFNN_R_TYPE (rel->r_info);
531 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
533 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
538 if (r_symndx < symtab_hdr->sh_info)
542 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
543 while (h->root.type == bfd_link_hash_indirect
544 || h->root.type == bfd_link_hash_warning)
545 h = (struct elf_link_hash_entry *) h->root.u.i.link;
550 case R_RISCV_TLS_GD_HI20:
551 if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
552 || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_GD))
556 case R_RISCV_TLS_GOT_HI20:
557 if (bfd_link_pic (info))
558 info->flags |= DF_STATIC_TLS;
559 if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
560 || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_IE))
564 case R_RISCV_GOT_HI20:
565 if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
566 || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_NORMAL))
570 case R_RISCV_CALL_PLT:
571 /* This symbol requires a procedure linkage table entry. We
572 actually build the entry in adjust_dynamic_symbol,
573 because this might be a case of linking PIC code without
574 linking in any dynamic objects, in which case we don't
575 need to generate a procedure linkage table after all. */
580 h->plt.refcount += 1;
587 case R_RISCV_RVC_BRANCH:
588 case R_RISCV_RVC_JUMP:
589 case R_RISCV_PCREL_HI20:
590 /* In shared libraries, these relocs are known to bind locally. */
591 if (bfd_link_pic (info))
595 case R_RISCV_TPREL_HI20:
596 if (!bfd_link_executable (info))
597 return bad_static_reloc (abfd, r_type, h);
599 riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
603 if (bfd_link_pic (info))
604 return bad_static_reloc (abfd, r_type, h);
608 case R_RISCV_JUMP_SLOT:
609 case R_RISCV_RELATIVE:
615 /* This reloc might not bind locally. */
619 if (h != NULL && !bfd_link_pic (info))
621 /* We may need a .plt entry if the function this reloc
622 refers to is in a shared lib. */
623 h->plt.refcount += 1;
626 /* If we are creating a shared library, and this is a reloc
627 against a global symbol, or a non PC relative reloc
628 against a local symbol, then we need to copy the reloc
629 into the shared library. However, if we are linking with
630 -Bsymbolic, we do not need to copy a reloc against a
631 global symbol which is defined in an object we are
632 including in the link (i.e., DEF_REGULAR is set). At
633 this point we have not seen all the input files, so it is
634 possible that DEF_REGULAR is not set now but will be set
635 later (it is never cleared). In case of a weak definition,
636 DEF_REGULAR may be cleared later by a strong definition in
637 a shared library. We account for that possibility below by
638 storing information in the relocs_copied field of the hash
639 table entry. A similar situation occurs when creating
640 shared libraries and symbol visibility changes render the
643 If on the other hand, we are creating an executable, we
644 may need to keep relocations for symbols satisfied by a
645 dynamic library if we manage to avoid copy relocs for the
647 if ((bfd_link_pic (info)
648 && (sec->flags & SEC_ALLOC) != 0
649 && (! riscv_elf_rtype_to_howto (r_type)->pc_relative
652 || h->root.type == bfd_link_hash_defweak
653 || !h->def_regular))))
654 || (!bfd_link_pic (info)
655 && (sec->flags & SEC_ALLOC) != 0
657 && (h->root.type == bfd_link_hash_defweak
658 || !h->def_regular)))
660 struct riscv_elf_dyn_relocs *p;
661 struct riscv_elf_dyn_relocs **head;
663 /* When creating a shared object, we must copy these
664 relocs into the output file. We create a reloc
665 section in dynobj and make room for the reloc. */
668 sreloc = _bfd_elf_make_dynamic_reloc_section
669 (sec, htab->elf.dynobj, RISCV_ELF_LOG_WORD_BYTES,
670 abfd, /*rela?*/ TRUE);
676 /* If this is a global symbol, we count the number of
677 relocations we need for this symbol. */
679 head = &((struct riscv_elf_link_hash_entry *) h)->dyn_relocs;
682 /* Track dynamic relocs needed for local syms too.
683 We really need local syms available to do this
688 Elf_Internal_Sym *isym;
690 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
695 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
699 vpp = &elf_section_data (s)->local_dynrel;
700 head = (struct riscv_elf_dyn_relocs **) vpp;
704 if (p == NULL || p->sec != sec)
706 bfd_size_type amt = sizeof *p;
707 p = ((struct riscv_elf_dyn_relocs *)
708 bfd_alloc (htab->elf.dynobj, amt));
719 p->pc_count += riscv_elf_rtype_to_howto (r_type)->pc_relative;
724 case R_RISCV_GNU_VTINHERIT:
725 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
729 case R_RISCV_GNU_VTENTRY:
730 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
743 riscv_elf_gc_mark_hook (asection *sec,
744 struct bfd_link_info *info,
745 Elf_Internal_Rela *rel,
746 struct elf_link_hash_entry *h,
747 Elf_Internal_Sym *sym)
750 switch (ELFNN_R_TYPE (rel->r_info))
752 case R_RISCV_GNU_VTINHERIT:
753 case R_RISCV_GNU_VTENTRY:
757 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
760 /* Find dynamic relocs for H that apply to read-only sections. */
763 readonly_dynrelocs (struct elf_link_hash_entry *h)
765 struct riscv_elf_dyn_relocs *p;
767 for (p = riscv_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
769 asection *s = p->sec->output_section;
771 if (s != NULL && (s->flags & SEC_READONLY) != 0)
777 /* Adjust a symbol defined by a dynamic object and referenced by a
778 regular object. The current definition is in some section of the
779 dynamic object, but we're not including those sections. We have to
780 change the definition to something the rest of the link can
784 riscv_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
785 struct elf_link_hash_entry *h)
787 struct riscv_elf_link_hash_table *htab;
788 struct riscv_elf_link_hash_entry * eh;
789 struct riscv_elf_dyn_relocs *p;
793 htab = riscv_elf_hash_table (info);
794 BFD_ASSERT (htab != NULL);
796 dynobj = htab->elf.dynobj;
798 /* Make sure we know what is going on here. */
799 BFD_ASSERT (dynobj != NULL
801 || h->type == STT_GNU_IFUNC
805 && !h->def_regular)));
807 /* If this is a function, put it in the procedure linkage table. We
808 will fill in the contents of the procedure linkage table later
809 (although we could actually do it here). */
810 if (h->type == STT_FUNC || h->type == STT_GNU_IFUNC || h->needs_plt)
812 if (h->plt.refcount <= 0
813 || SYMBOL_CALLS_LOCAL (info, h)
814 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
815 && h->root.type == bfd_link_hash_undefweak))
817 /* This case can occur if we saw a R_RISCV_CALL_PLT reloc in an
818 input file, but the symbol was never referred to by a dynamic
819 object, or if all references were garbage collected. In such
820 a case, we don't actually need to build a PLT entry. */
821 h->plt.offset = (bfd_vma) -1;
828 h->plt.offset = (bfd_vma) -1;
830 /* If this is a weak symbol, and there is a real definition, the
831 processor independent code will have arranged for us to see the
832 real definition first, and we can just use the same value. */
835 struct elf_link_hash_entry *def = weakdef (h);
836 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
837 h->root.u.def.section = def->root.u.def.section;
838 h->root.u.def.value = def->root.u.def.value;
842 /* This is a reference to a symbol defined by a dynamic object which
843 is not a function. */
845 /* If we are creating a shared library, we must presume that the
846 only references to the symbol are via the global offset table.
847 For such cases we need not do anything here; the relocations will
848 be handled correctly by relocate_section. */
849 if (bfd_link_pic (info))
852 /* If there are no references to this symbol that do not use the
853 GOT, we don't need to generate a copy reloc. */
857 /* If -z nocopyreloc was given, we won't generate them either. */
858 if (info->nocopyreloc)
864 eh = (struct riscv_elf_link_hash_entry *) h;
865 for (p = eh->dyn_relocs; p != NULL; p = p->next)
867 s = p->sec->output_section;
868 if (s != NULL && (s->flags & SEC_READONLY) != 0)
872 /* If we didn't find any dynamic relocs in read-only sections, then
873 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
880 /* We must allocate the symbol in our .dynbss section, which will
881 become part of the .bss section of the executable. There will be
882 an entry for this symbol in the .dynsym section. The dynamic
883 object will contain position independent code, so all references
884 from the dynamic object to this symbol will go through the global
885 offset table. The dynamic linker will use the .dynsym entry to
886 determine the address it must put in the global offset table, so
887 both the dynamic object and the regular object will refer to the
888 same memory location for the variable. */
890 /* We must generate a R_RISCV_COPY reloc to tell the dynamic linker
891 to copy the initial value out of the dynamic object and into the
892 runtime process image. We need to remember the offset into the
893 .rel.bss section we are going to use. */
894 if (eh->tls_type & ~GOT_NORMAL)
897 srel = htab->elf.srelbss;
899 else if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
901 s = htab->elf.sdynrelro;
902 srel = htab->elf.sreldynrelro;
906 s = htab->elf.sdynbss;
907 srel = htab->elf.srelbss;
909 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
911 srel->size += sizeof (ElfNN_External_Rela);
915 return _bfd_elf_adjust_dynamic_copy (info, h, s);
918 /* Allocate space in .plt, .got and associated reloc sections for
922 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
924 struct bfd_link_info *info;
925 struct riscv_elf_link_hash_table *htab;
926 struct riscv_elf_link_hash_entry *eh;
927 struct riscv_elf_dyn_relocs *p;
929 if (h->root.type == bfd_link_hash_indirect)
932 info = (struct bfd_link_info *) inf;
933 htab = riscv_elf_hash_table (info);
934 BFD_ASSERT (htab != NULL);
936 if (htab->elf.dynamic_sections_created
937 && h->plt.refcount > 0)
939 /* Make sure this symbol is output as a dynamic symbol.
940 Undefined weak syms won't yet be marked as dynamic. */
944 if (! bfd_elf_link_record_dynamic_symbol (info, h))
948 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
950 asection *s = htab->elf.splt;
953 s->size = PLT_HEADER_SIZE;
955 h->plt.offset = s->size;
957 /* Make room for this entry. */
958 s->size += PLT_ENTRY_SIZE;
960 /* We also need to make an entry in the .got.plt section. */
961 htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
963 /* We also need to make an entry in the .rela.plt section. */
964 htab->elf.srelplt->size += sizeof (ElfNN_External_Rela);
966 /* If this symbol is not defined in a regular file, and we are
967 not generating a shared library, then set the symbol to this
968 location in the .plt. This is required to make function
969 pointers compare as equal between the normal executable and
970 the shared library. */
971 if (! bfd_link_pic (info)
974 h->root.u.def.section = s;
975 h->root.u.def.value = h->plt.offset;
980 h->plt.offset = (bfd_vma) -1;
986 h->plt.offset = (bfd_vma) -1;
990 if (h->got.refcount > 0)
994 int tls_type = riscv_elf_hash_entry (h)->tls_type;
996 /* Make sure this symbol is output as a dynamic symbol.
997 Undefined weak syms won't yet be marked as dynamic. */
1001 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1006 h->got.offset = s->size;
1007 dyn = htab->elf.dynamic_sections_created;
1008 if (tls_type & (GOT_TLS_GD | GOT_TLS_IE))
1010 /* TLS_GD needs two dynamic relocs and two GOT slots. */
1011 if (tls_type & GOT_TLS_GD)
1013 s->size += 2 * RISCV_ELF_WORD_BYTES;
1014 htab->elf.srelgot->size += 2 * sizeof (ElfNN_External_Rela);
1017 /* TLS_IE needs one dynamic reloc and one GOT slot. */
1018 if (tls_type & GOT_TLS_IE)
1020 s->size += RISCV_ELF_WORD_BYTES;
1021 htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
1026 s->size += RISCV_ELF_WORD_BYTES;
1027 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
1028 htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
1032 h->got.offset = (bfd_vma) -1;
1034 eh = (struct riscv_elf_link_hash_entry *) h;
1035 if (eh->dyn_relocs == NULL)
1038 /* In the shared -Bsymbolic case, discard space allocated for
1039 dynamic pc-relative relocs against symbols which turn out to be
1040 defined in regular objects. For the normal shared case, discard
1041 space for pc-relative relocs that have become local due to symbol
1042 visibility changes. */
1044 if (bfd_link_pic (info))
1046 if (SYMBOL_CALLS_LOCAL (info, h))
1048 struct riscv_elf_dyn_relocs **pp;
1050 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1052 p->count -= p->pc_count;
1061 /* Also discard relocs on undefined weak syms with non-default
1063 if (eh->dyn_relocs != NULL
1064 && h->root.type == bfd_link_hash_undefweak)
1066 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1067 eh->dyn_relocs = NULL;
1069 /* Make sure undefined weak symbols are output as a dynamic
1071 else if (h->dynindx == -1
1072 && !h->forced_local)
1074 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1081 /* For the non-shared case, discard space for relocs against
1082 symbols which turn out to need copy relocs or are not
1088 || (htab->elf.dynamic_sections_created
1089 && (h->root.type == bfd_link_hash_undefweak
1090 || h->root.type == bfd_link_hash_undefined))))
1092 /* Make sure this symbol is output as a dynamic symbol.
1093 Undefined weak syms won't yet be marked as dynamic. */
1094 if (h->dynindx == -1
1095 && !h->forced_local)
1097 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1101 /* If that succeeded, we know we'll be keeping all the
1103 if (h->dynindx != -1)
1107 eh->dyn_relocs = NULL;
1112 /* Finally, allocate space. */
1113 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1115 asection *sreloc = elf_section_data (p->sec)->sreloc;
1116 sreloc->size += p->count * sizeof (ElfNN_External_Rela);
1122 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
1123 read-only sections. */
1126 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
1130 if (h->root.type == bfd_link_hash_indirect)
1133 sec = readonly_dynrelocs (h);
1136 struct bfd_link_info *info = (struct bfd_link_info *) info_p;
1138 info->flags |= DF_TEXTREL;
1139 info->callbacks->minfo
1140 (_("%B: dynamic relocation against `%T' in read-only section `%A'\n"),
1141 sec->owner, h->root.root.string, sec);
1143 /* Not an error, just cut short the traversal. */
1150 riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1152 struct riscv_elf_link_hash_table *htab;
1157 htab = riscv_elf_hash_table (info);
1158 BFD_ASSERT (htab != NULL);
1159 dynobj = htab->elf.dynobj;
1160 BFD_ASSERT (dynobj != NULL);
1162 if (elf_hash_table (info)->dynamic_sections_created)
1164 /* Set the contents of the .interp section to the interpreter. */
1165 if (bfd_link_executable (info) && !info->nointerp)
1167 s = bfd_get_linker_section (dynobj, ".interp");
1168 BFD_ASSERT (s != NULL);
1169 s->size = strlen (ELFNN_DYNAMIC_INTERPRETER) + 1;
1170 s->contents = (unsigned char *) ELFNN_DYNAMIC_INTERPRETER;
1174 /* Set up .got offsets for local syms, and space for local dynamic
1176 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1178 bfd_signed_vma *local_got;
1179 bfd_signed_vma *end_local_got;
1180 char *local_tls_type;
1181 bfd_size_type locsymcount;
1182 Elf_Internal_Shdr *symtab_hdr;
1185 if (! is_riscv_elf (ibfd))
1188 for (s = ibfd->sections; s != NULL; s = s->next)
1190 struct riscv_elf_dyn_relocs *p;
1192 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
1194 if (!bfd_is_abs_section (p->sec)
1195 && bfd_is_abs_section (p->sec->output_section))
1197 /* Input section has been discarded, either because
1198 it is a copy of a linkonce section or due to
1199 linker script /DISCARD/, so we'll be discarding
1202 else if (p->count != 0)
1204 srel = elf_section_data (p->sec)->sreloc;
1205 srel->size += p->count * sizeof (ElfNN_External_Rela);
1206 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1207 info->flags |= DF_TEXTREL;
1212 local_got = elf_local_got_refcounts (ibfd);
1216 symtab_hdr = &elf_symtab_hdr (ibfd);
1217 locsymcount = symtab_hdr->sh_info;
1218 end_local_got = local_got + locsymcount;
1219 local_tls_type = _bfd_riscv_elf_local_got_tls_type (ibfd);
1221 srel = htab->elf.srelgot;
1222 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1226 *local_got = s->size;
1227 s->size += RISCV_ELF_WORD_BYTES;
1228 if (*local_tls_type & GOT_TLS_GD)
1229 s->size += RISCV_ELF_WORD_BYTES;
1230 if (bfd_link_pic (info)
1231 || (*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)))
1232 srel->size += sizeof (ElfNN_External_Rela);
1235 *local_got = (bfd_vma) -1;
1239 /* Allocate global sym .plt and .got entries, and space for global
1240 sym dynamic relocs. */
1241 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
1243 if (htab->elf.sgotplt)
1245 struct elf_link_hash_entry *got;
1246 got = elf_link_hash_lookup (elf_hash_table (info),
1247 "_GLOBAL_OFFSET_TABLE_",
1248 FALSE, FALSE, FALSE);
1250 /* Don't allocate .got.plt section if there are no GOT nor PLT
1251 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
1253 || !got->ref_regular_nonweak)
1254 && (htab->elf.sgotplt->size == GOTPLT_HEADER_SIZE)
1255 && (htab->elf.splt == NULL
1256 || htab->elf.splt->size == 0)
1257 && (htab->elf.sgot == NULL
1258 || (htab->elf.sgot->size
1259 == get_elf_backend_data (output_bfd)->got_header_size)))
1260 htab->elf.sgotplt->size = 0;
1263 /* The check_relocs and adjust_dynamic_symbol entry points have
1264 determined the sizes of the various dynamic sections. Allocate
1266 for (s = dynobj->sections; s != NULL; s = s->next)
1268 if ((s->flags & SEC_LINKER_CREATED) == 0)
1271 if (s == htab->elf.splt
1272 || s == htab->elf.sgot
1273 || s == htab->elf.sgotplt
1274 || s == htab->elf.sdynbss
1275 || s == htab->elf.sdynrelro)
1277 /* Strip this section if we don't need it; see the
1280 else if (strncmp (s->name, ".rela", 5) == 0)
1284 /* We use the reloc_count field as a counter if we need
1285 to copy relocs into the output file. */
1291 /* It's not one of our sections. */
1297 /* If we don't need this section, strip it from the
1298 output file. This is mostly to handle .rela.bss and
1299 .rela.plt. We must create both sections in
1300 create_dynamic_sections, because they must be created
1301 before the linker maps input sections to output
1302 sections. The linker does that before
1303 adjust_dynamic_symbol is called, and it is that
1304 function which decides whether anything needs to go
1305 into these sections. */
1306 s->flags |= SEC_EXCLUDE;
1310 if ((s->flags & SEC_HAS_CONTENTS) == 0)
1313 /* Allocate memory for the section contents. Zero the memory
1314 for the benefit of .rela.plt, which has 4 unused entries
1315 at the beginning, and we don't want garbage. */
1316 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1317 if (s->contents == NULL)
1321 if (elf_hash_table (info)->dynamic_sections_created)
1323 /* Add some entries to the .dynamic section. We fill in the
1324 values later, in riscv_elf_finish_dynamic_sections, but we
1325 must add the entries now so that we get the correct size for
1326 the .dynamic section. The DT_DEBUG entry is filled in by the
1327 dynamic linker and used by the debugger. */
1328 #define add_dynamic_entry(TAG, VAL) \
1329 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1331 if (bfd_link_executable (info))
1333 if (!add_dynamic_entry (DT_DEBUG, 0))
1337 if (htab->elf.srelplt->size != 0)
1339 if (!add_dynamic_entry (DT_PLTGOT, 0)
1340 || !add_dynamic_entry (DT_PLTRELSZ, 0)
1341 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1342 || !add_dynamic_entry (DT_JMPREL, 0))
1346 if (!add_dynamic_entry (DT_RELA, 0)
1347 || !add_dynamic_entry (DT_RELASZ, 0)
1348 || !add_dynamic_entry (DT_RELAENT, sizeof (ElfNN_External_Rela)))
1351 /* If any dynamic relocs apply to a read-only section,
1352 then we need a DT_TEXTREL entry. */
1353 if ((info->flags & DF_TEXTREL) == 0)
1354 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
1356 if (info->flags & DF_TEXTREL)
1358 if (!add_dynamic_entry (DT_TEXTREL, 0))
1362 #undef add_dynamic_entry
1368 #define DTP_OFFSET 0x800
1370 /* Return the relocation value for a TLS dtp-relative reloc. */
1373 dtpoff (struct bfd_link_info *info, bfd_vma address)
1375 /* If tls_sec is NULL, we should have signalled an error already. */
1376 if (elf_hash_table (info)->tls_sec == NULL)
1378 return address - elf_hash_table (info)->tls_sec->vma - DTP_OFFSET;
1381 /* Return the relocation value for a static TLS tp-relative relocation. */
1384 tpoff (struct bfd_link_info *info, bfd_vma address)
1386 /* If tls_sec is NULL, we should have signalled an error already. */
1387 if (elf_hash_table (info)->tls_sec == NULL)
1389 return address - elf_hash_table (info)->tls_sec->vma - TP_OFFSET;
1392 /* Return the global pointer's value, or 0 if it is not in use. */
1395 riscv_global_pointer_value (struct bfd_link_info *info)
1397 struct bfd_link_hash_entry *h;
1399 h = bfd_link_hash_lookup (info->hash, RISCV_GP_SYMBOL, FALSE, FALSE, TRUE);
1400 if (h == NULL || h->type != bfd_link_hash_defined)
1403 return h->u.def.value + sec_addr (h->u.def.section);
1406 /* Emplace a static relocation. */
1408 static bfd_reloc_status_type
1409 perform_relocation (const reloc_howto_type *howto,
1410 const Elf_Internal_Rela *rel,
1412 asection *input_section,
1416 if (howto->pc_relative)
1417 value -= sec_addr (input_section) + rel->r_offset;
1418 value += rel->r_addend;
1420 switch (ELFNN_R_TYPE (rel->r_info))
1423 case R_RISCV_TPREL_HI20:
1424 case R_RISCV_PCREL_HI20:
1425 case R_RISCV_GOT_HI20:
1426 case R_RISCV_TLS_GOT_HI20:
1427 case R_RISCV_TLS_GD_HI20:
1428 if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)))
1429 return bfd_reloc_overflow;
1430 value = ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value));
1433 case R_RISCV_LO12_I:
1434 case R_RISCV_GPREL_I:
1435 case R_RISCV_TPREL_LO12_I:
1436 case R_RISCV_TPREL_I:
1437 case R_RISCV_PCREL_LO12_I:
1438 value = ENCODE_ITYPE_IMM (value);
1441 case R_RISCV_LO12_S:
1442 case R_RISCV_GPREL_S:
1443 case R_RISCV_TPREL_LO12_S:
1444 case R_RISCV_TPREL_S:
1445 case R_RISCV_PCREL_LO12_S:
1446 value = ENCODE_STYPE_IMM (value);
1450 case R_RISCV_CALL_PLT:
1451 if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)))
1452 return bfd_reloc_overflow;
1453 value = ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value))
1454 | (ENCODE_ITYPE_IMM (value) << 32);
1458 if (!VALID_UJTYPE_IMM (value))
1459 return bfd_reloc_overflow;
1460 value = ENCODE_UJTYPE_IMM (value);
1463 case R_RISCV_BRANCH:
1464 if (!VALID_SBTYPE_IMM (value))
1465 return bfd_reloc_overflow;
1466 value = ENCODE_SBTYPE_IMM (value);
1469 case R_RISCV_RVC_BRANCH:
1470 if (!VALID_RVC_B_IMM (value))
1471 return bfd_reloc_overflow;
1472 value = ENCODE_RVC_B_IMM (value);
1475 case R_RISCV_RVC_JUMP:
1476 if (!VALID_RVC_J_IMM (value))
1477 return bfd_reloc_overflow;
1478 value = ENCODE_RVC_J_IMM (value);
1481 case R_RISCV_RVC_LUI:
1482 if (!VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value)))
1483 return bfd_reloc_overflow;
1484 value = ENCODE_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value));
1502 case R_RISCV_32_PCREL:
1503 case R_RISCV_TLS_DTPREL32:
1504 case R_RISCV_TLS_DTPREL64:
1507 case R_RISCV_DELETE:
1508 return bfd_reloc_ok;
1511 return bfd_reloc_notsupported;
1514 bfd_vma word = bfd_get (howto->bitsize, input_bfd, contents + rel->r_offset);
1515 word = (word & ~howto->dst_mask) | (value & howto->dst_mask);
1516 bfd_put (howto->bitsize, input_bfd, word, contents + rel->r_offset);
1518 return bfd_reloc_ok;
1521 /* Remember all PC-relative high-part relocs we've encountered to help us
1522 later resolve the corresponding low-part relocs. */
1528 } riscv_pcrel_hi_reloc;
1530 typedef struct riscv_pcrel_lo_reloc
1532 asection * input_section;
1533 struct bfd_link_info * info;
1534 reloc_howto_type * howto;
1535 const Elf_Internal_Rela * reloc;
1538 bfd_byte * contents;
1539 struct riscv_pcrel_lo_reloc * next;
1540 } riscv_pcrel_lo_reloc;
1545 riscv_pcrel_lo_reloc *lo_relocs;
1546 } riscv_pcrel_relocs;
1549 riscv_pcrel_reloc_hash (const void *entry)
1551 const riscv_pcrel_hi_reloc *e = entry;
1552 return (hashval_t)(e->address >> 2);
1556 riscv_pcrel_reloc_eq (const void *entry1, const void *entry2)
1558 const riscv_pcrel_hi_reloc *e1 = entry1, *e2 = entry2;
1559 return e1->address == e2->address;
1563 riscv_init_pcrel_relocs (riscv_pcrel_relocs *p)
1566 p->lo_relocs = NULL;
1567 p->hi_relocs = htab_create (1024, riscv_pcrel_reloc_hash,
1568 riscv_pcrel_reloc_eq, free);
1569 return p->hi_relocs != NULL;
1573 riscv_free_pcrel_relocs (riscv_pcrel_relocs *p)
1575 riscv_pcrel_lo_reloc *cur = p->lo_relocs;
1579 riscv_pcrel_lo_reloc *next = cur->next;
1584 htab_delete (p->hi_relocs);
1588 riscv_zero_pcrel_hi_reloc (Elf_Internal_Rela *rel,
1589 struct bfd_link_info *info,
1593 const reloc_howto_type *howto,
1596 /* We may need to reference low addreses in PC-relative modes even when the
1597 * PC is far away from these addresses. For example, undefweak references
1598 * need to produce the address 0 when linked. As 0 is far from the arbitrary
1599 * addresses that we can link PC-relative programs at, the linker can't
1600 * actually relocate references to those symbols. In order to allow these
1601 * programs to work we simply convert the PC-relative auipc sequences to
1602 * 0-relative lui sequences. */
1603 if (bfd_link_pic (info))
1606 /* If it's possible to reference the symbol using auipc we do so, as that's
1607 * more in the spirit of the PC-relative relocations we're processing. */
1608 bfd_vma offset = addr - pc;
1609 if (ARCH_SIZE == 32 || VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (offset)))
1612 /* If it's impossible to reference this with a LUI-based offset then don't
1613 * bother to convert it at all so users still see the PC-relative relocation
1614 * in the truncation message. */
1615 if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (addr)))
1618 rel->r_info = ELFNN_R_INFO(addr, R_RISCV_HI20);
1620 bfd_vma insn = bfd_get(howto->bitsize, input_bfd, contents + rel->r_offset);
1621 insn = (insn & ~MASK_AUIPC) | MATCH_LUI;
1622 bfd_put(howto->bitsize, input_bfd, insn, contents + rel->r_offset);
1627 riscv_record_pcrel_hi_reloc (riscv_pcrel_relocs *p, bfd_vma addr,
1628 bfd_vma value, bfd_boolean absolute)
1630 bfd_vma offset = absolute ? value : value - addr;
1631 riscv_pcrel_hi_reloc entry = {addr, offset};
1632 riscv_pcrel_hi_reloc **slot =
1633 (riscv_pcrel_hi_reloc **) htab_find_slot (p->hi_relocs, &entry, INSERT);
1635 BFD_ASSERT (*slot == NULL);
1636 *slot = (riscv_pcrel_hi_reloc *) bfd_malloc (sizeof (riscv_pcrel_hi_reloc));
1644 riscv_record_pcrel_lo_reloc (riscv_pcrel_relocs *p,
1645 asection *input_section,
1646 struct bfd_link_info *info,
1647 reloc_howto_type *howto,
1648 const Elf_Internal_Rela *reloc,
1653 riscv_pcrel_lo_reloc *entry;
1654 entry = (riscv_pcrel_lo_reloc *) bfd_malloc (sizeof (riscv_pcrel_lo_reloc));
1657 *entry = (riscv_pcrel_lo_reloc) {input_section, info, howto, reloc, addr,
1658 name, contents, p->lo_relocs};
1659 p->lo_relocs = entry;
1664 riscv_resolve_pcrel_lo_relocs (riscv_pcrel_relocs *p)
1666 riscv_pcrel_lo_reloc *r;
1668 for (r = p->lo_relocs; r != NULL; r = r->next)
1670 bfd *input_bfd = r->input_section->owner;
1672 riscv_pcrel_hi_reloc search = {r->addr, 0};
1673 riscv_pcrel_hi_reloc *entry = htab_find (p->hi_relocs, &search);
1676 ((*r->info->callbacks->reloc_overflow)
1677 (r->info, NULL, r->name, r->howto->name, (bfd_vma) 0,
1678 input_bfd, r->input_section, r->reloc->r_offset));
1682 perform_relocation (r->howto, r->reloc, entry->value, r->input_section,
1683 input_bfd, r->contents);
1689 /* Relocate a RISC-V ELF section.
1691 The RELOCATE_SECTION function is called by the new ELF backend linker
1692 to handle the relocations for a section.
1694 The relocs are always passed as Rela structures.
1696 This function is responsible for adjusting the section contents as
1697 necessary, and (if generating a relocatable output file) adjusting
1698 the reloc addend as necessary.
1700 This function does not have to worry about setting the reloc
1701 address or the reloc symbol index.
1703 LOCAL_SYMS is a pointer to the swapped in local symbols.
1705 LOCAL_SECTIONS is an array giving the section in the input file
1706 corresponding to the st_shndx field of each local symbol.
1708 The global hash table entry for the global symbols can be found
1709 via elf_sym_hashes (input_bfd).
1711 When generating relocatable output, this function must handle
1712 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
1713 going to be the section symbol corresponding to the output
1714 section, which means that the addend must be adjusted
1718 riscv_elf_relocate_section (bfd *output_bfd,
1719 struct bfd_link_info *info,
1721 asection *input_section,
1723 Elf_Internal_Rela *relocs,
1724 Elf_Internal_Sym *local_syms,
1725 asection **local_sections)
1727 Elf_Internal_Rela *rel;
1728 Elf_Internal_Rela *relend;
1729 riscv_pcrel_relocs pcrel_relocs;
1730 bfd_boolean ret = FALSE;
1731 asection *sreloc = elf_section_data (input_section)->sreloc;
1732 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
1733 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_bfd);
1734 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
1735 bfd_vma *local_got_offsets = elf_local_got_offsets (input_bfd);
1736 bfd_boolean absolute;
1738 if (!riscv_init_pcrel_relocs (&pcrel_relocs))
1741 relend = relocs + input_section->reloc_count;
1742 for (rel = relocs; rel < relend; rel++)
1744 unsigned long r_symndx;
1745 struct elf_link_hash_entry *h;
1746 Elf_Internal_Sym *sym;
1749 bfd_reloc_status_type r = bfd_reloc_ok;
1751 bfd_vma off, ie_off;
1752 bfd_boolean unresolved_reloc, is_ie = FALSE;
1753 bfd_vma pc = sec_addr (input_section) + rel->r_offset;
1754 int r_type = ELFNN_R_TYPE (rel->r_info), tls_type;
1755 reloc_howto_type *howto = riscv_elf_rtype_to_howto (r_type);
1756 const char *msg = NULL;
1758 if (r_type == R_RISCV_GNU_VTINHERIT || r_type == R_RISCV_GNU_VTENTRY)
1761 /* This is a final link. */
1762 r_symndx = ELFNN_R_SYM (rel->r_info);
1766 unresolved_reloc = FALSE;
1767 if (r_symndx < symtab_hdr->sh_info)
1769 sym = local_syms + r_symndx;
1770 sec = local_sections[r_symndx];
1771 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1775 bfd_boolean warned, ignored;
1777 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1778 r_symndx, symtab_hdr, sym_hashes,
1780 unresolved_reloc, warned, ignored);
1783 /* To avoid generating warning messages about truncated
1784 relocations, set the relocation's address to be the same as
1785 the start of this section. */
1786 if (input_section->output_section != NULL)
1787 relocation = input_section->output_section->vma;
1793 if (sec != NULL && discarded_section (sec))
1794 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1795 rel, 1, relend, howto, 0, contents);
1797 if (bfd_link_relocatable (info))
1801 name = h->root.root.string;
1804 name = (bfd_elf_string_from_elf_section
1805 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1806 if (name == NULL || *name == '\0')
1807 name = bfd_section_name (input_bfd, sec);
1814 case R_RISCV_TPREL_ADD:
1816 case R_RISCV_JUMP_SLOT:
1817 case R_RISCV_RELATIVE:
1818 /* These require nothing of us at all. */
1822 case R_RISCV_BRANCH:
1823 case R_RISCV_RVC_BRANCH:
1824 case R_RISCV_RVC_LUI:
1825 case R_RISCV_LO12_I:
1826 case R_RISCV_LO12_S:
1831 case R_RISCV_32_PCREL:
1832 case R_RISCV_DELETE:
1833 /* These require no special handling beyond perform_relocation. */
1836 case R_RISCV_GOT_HI20:
1839 bfd_boolean dyn, pic;
1841 off = h->got.offset;
1842 BFD_ASSERT (off != (bfd_vma) -1);
1843 dyn = elf_hash_table (info)->dynamic_sections_created;
1844 pic = bfd_link_pic (info);
1846 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
1847 || (pic && SYMBOL_REFERENCES_LOCAL (info, h)))
1849 /* This is actually a static link, or it is a
1850 -Bsymbolic link and the symbol is defined
1851 locally, or the symbol was forced to be local
1852 because of a version file. We must initialize
1853 this entry in the global offset table. Since the
1854 offset must always be a multiple of the word size,
1855 we use the least significant bit to record whether
1856 we have initialized it already.
1858 When doing a dynamic link, we create a .rela.got
1859 relocation entry to initialize the value. This
1860 is done in the finish_dynamic_symbol routine. */
1865 bfd_put_NN (output_bfd, relocation,
1866 htab->elf.sgot->contents + off);
1871 unresolved_reloc = FALSE;
1875 BFD_ASSERT (local_got_offsets != NULL
1876 && local_got_offsets[r_symndx] != (bfd_vma) -1);
1878 off = local_got_offsets[r_symndx];
1880 /* The offset must always be a multiple of the word size.
1881 So, we can use the least significant bit to record
1882 whether we have already processed this entry. */
1887 if (bfd_link_pic (info))
1890 Elf_Internal_Rela outrel;
1892 /* We need to generate a R_RISCV_RELATIVE reloc
1893 for the dynamic linker. */
1894 s = htab->elf.srelgot;
1895 BFD_ASSERT (s != NULL);
1897 outrel.r_offset = sec_addr (htab->elf.sgot) + off;
1899 ELFNN_R_INFO (0, R_RISCV_RELATIVE);
1900 outrel.r_addend = relocation;
1902 riscv_elf_append_rela (output_bfd, s, &outrel);
1905 bfd_put_NN (output_bfd, relocation,
1906 htab->elf.sgot->contents + off);
1907 local_got_offsets[r_symndx] |= 1;
1910 relocation = sec_addr (htab->elf.sgot) + off;
1911 absolute = riscv_zero_pcrel_hi_reloc (rel,
1918 r_type = ELFNN_R_TYPE (rel->r_info);
1919 howto = riscv_elf_rtype_to_howto (r_type);
1920 if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
1921 relocation, absolute))
1922 r = bfd_reloc_overflow;
1930 bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1931 contents + rel->r_offset);
1932 relocation = old_value + relocation;
1942 bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1943 contents + rel->r_offset);
1944 relocation = old_value - relocation;
1948 case R_RISCV_CALL_PLT:
1951 case R_RISCV_RVC_JUMP:
1952 if (bfd_link_pic (info) && h != NULL && h->plt.offset != MINUS_ONE)
1954 /* Refer to the PLT entry. */
1955 relocation = sec_addr (htab->elf.splt) + h->plt.offset;
1956 unresolved_reloc = FALSE;
1960 case R_RISCV_TPREL_HI20:
1961 relocation = tpoff (info, relocation);
1964 case R_RISCV_TPREL_LO12_I:
1965 case R_RISCV_TPREL_LO12_S:
1966 relocation = tpoff (info, relocation);
1969 case R_RISCV_TPREL_I:
1970 case R_RISCV_TPREL_S:
1971 relocation = tpoff (info, relocation);
1972 if (VALID_ITYPE_IMM (relocation + rel->r_addend))
1974 /* We can use tp as the base register. */
1975 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
1976 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1977 insn |= X_TP << OP_SH_RS1;
1978 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
1981 r = bfd_reloc_overflow;
1984 case R_RISCV_GPREL_I:
1985 case R_RISCV_GPREL_S:
1987 bfd_vma gp = riscv_global_pointer_value (info);
1988 bfd_boolean x0_base = VALID_ITYPE_IMM (relocation + rel->r_addend);
1989 if (x0_base || VALID_ITYPE_IMM (relocation + rel->r_addend - gp))
1991 /* We can use x0 or gp as the base register. */
1992 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
1993 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1996 rel->r_addend -= gp;
1997 insn |= X_GP << OP_SH_RS1;
1999 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
2002 r = bfd_reloc_overflow;
2006 case R_RISCV_PCREL_HI20:
2007 absolute = riscv_zero_pcrel_hi_reloc (rel,
2014 r_type = ELFNN_R_TYPE (rel->r_info);
2015 howto = riscv_elf_rtype_to_howto (r_type);
2016 if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2017 relocation + rel->r_addend,
2019 r = bfd_reloc_overflow;
2022 case R_RISCV_PCREL_LO12_I:
2023 case R_RISCV_PCREL_LO12_S:
2024 if (riscv_record_pcrel_lo_reloc (&pcrel_relocs, input_section, info,
2025 howto, rel, relocation, name,
2028 r = bfd_reloc_overflow;
2031 case R_RISCV_TLS_DTPREL32:
2032 case R_RISCV_TLS_DTPREL64:
2033 relocation = dtpoff (info, relocation);
2038 if ((input_section->flags & SEC_ALLOC) == 0)
2041 if ((bfd_link_pic (info)
2043 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2044 || h->root.type != bfd_link_hash_undefweak)
2045 && (! howto->pc_relative
2046 || !SYMBOL_CALLS_LOCAL (info, h)))
2047 || (!bfd_link_pic (info)
2053 || h->root.type == bfd_link_hash_undefweak
2054 || h->root.type == bfd_link_hash_undefined)))
2056 Elf_Internal_Rela outrel;
2057 bfd_boolean skip_static_relocation, skip_dynamic_relocation;
2059 /* When generating a shared object, these relocations
2060 are copied into the output file to be resolved at run
2064 _bfd_elf_section_offset (output_bfd, info, input_section,
2066 skip_static_relocation = outrel.r_offset != (bfd_vma) -2;
2067 skip_dynamic_relocation = outrel.r_offset >= (bfd_vma) -2;
2068 outrel.r_offset += sec_addr (input_section);
2070 if (skip_dynamic_relocation)
2071 memset (&outrel, 0, sizeof outrel);
2072 else if (h != NULL && h->dynindx != -1
2073 && !(bfd_link_pic (info)
2074 && SYMBOLIC_BIND (info, h)
2077 outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
2078 outrel.r_addend = rel->r_addend;
2082 outrel.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2083 outrel.r_addend = relocation + rel->r_addend;
2086 riscv_elf_append_rela (output_bfd, sreloc, &outrel);
2087 if (skip_static_relocation)
2092 case R_RISCV_TLS_GOT_HI20:
2096 case R_RISCV_TLS_GD_HI20:
2099 off = h->got.offset;
2104 off = local_got_offsets[r_symndx];
2105 local_got_offsets[r_symndx] |= 1;
2108 tls_type = _bfd_riscv_elf_tls_type (input_bfd, h, r_symndx);
2109 BFD_ASSERT (tls_type & (GOT_TLS_IE | GOT_TLS_GD));
2110 /* If this symbol is referenced by both GD and IE TLS, the IE
2111 reference's GOT slot follows the GD reference's slots. */
2113 if ((tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_IE))
2114 ie_off = 2 * GOT_ENTRY_SIZE;
2120 Elf_Internal_Rela outrel;
2122 bfd_boolean need_relocs = FALSE;
2124 if (htab->elf.srelgot == NULL)
2129 bfd_boolean dyn, pic;
2130 dyn = htab->elf.dynamic_sections_created;
2131 pic = bfd_link_pic (info);
2133 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
2134 && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
2138 /* The GOT entries have not been initialized yet. Do it
2139 now, and emit any relocations. */
2140 if ((bfd_link_pic (info) || indx != 0)
2142 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2143 || h->root.type != bfd_link_hash_undefweak))
2146 if (tls_type & GOT_TLS_GD)
2150 outrel.r_offset = sec_addr (htab->elf.sgot) + off;
2151 outrel.r_addend = 0;
2152 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPMODNN);
2153 bfd_put_NN (output_bfd, 0,
2154 htab->elf.sgot->contents + off);
2155 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2158 BFD_ASSERT (! unresolved_reloc);
2159 bfd_put_NN (output_bfd,
2160 dtpoff (info, relocation),
2161 (htab->elf.sgot->contents + off +
2162 RISCV_ELF_WORD_BYTES));
2166 bfd_put_NN (output_bfd, 0,
2167 (htab->elf.sgot->contents + off +
2168 RISCV_ELF_WORD_BYTES));
2169 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPRELNN);
2170 outrel.r_offset += RISCV_ELF_WORD_BYTES;
2171 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2176 /* If we are not emitting relocations for a
2177 general dynamic reference, then we must be in a
2178 static link or an executable link with the
2179 symbol binding locally. Mark it as belonging
2180 to module 1, the executable. */
2181 bfd_put_NN (output_bfd, 1,
2182 htab->elf.sgot->contents + off);
2183 bfd_put_NN (output_bfd,
2184 dtpoff (info, relocation),
2185 (htab->elf.sgot->contents + off +
2186 RISCV_ELF_WORD_BYTES));
2190 if (tls_type & GOT_TLS_IE)
2194 bfd_put_NN (output_bfd, 0,
2195 htab->elf.sgot->contents + off + ie_off);
2196 outrel.r_offset = sec_addr (htab->elf.sgot)
2198 outrel.r_addend = 0;
2200 outrel.r_addend = tpoff (info, relocation);
2201 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_TPRELNN);
2202 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2206 bfd_put_NN (output_bfd, tpoff (info, relocation),
2207 htab->elf.sgot->contents + off + ie_off);
2212 BFD_ASSERT (off < (bfd_vma) -2);
2213 relocation = sec_addr (htab->elf.sgot) + off + (is_ie ? ie_off : 0);
2214 if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2216 r = bfd_reloc_overflow;
2217 unresolved_reloc = FALSE;
2221 r = bfd_reloc_notsupported;
2224 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2225 because such sections are not SEC_ALLOC and thus ld.so will
2226 not process them. */
2227 if (unresolved_reloc
2228 && !((input_section->flags & SEC_DEBUGGING) != 0
2230 && _bfd_elf_section_offset (output_bfd, info, input_section,
2231 rel->r_offset) != (bfd_vma) -1)
2233 (*_bfd_error_handler)
2234 (_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"),
2239 h->root.root.string);
2243 if (r == bfd_reloc_ok)
2244 r = perform_relocation (howto, rel, relocation, input_section,
2245 input_bfd, contents);
2252 case bfd_reloc_overflow:
2253 info->callbacks->reloc_overflow
2254 (info, (h ? &h->root : NULL), name, howto->name,
2255 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
2258 case bfd_reloc_undefined:
2259 info->callbacks->undefined_symbol
2260 (info, name, input_bfd, input_section, rel->r_offset,
2264 case bfd_reloc_outofrange:
2265 msg = _("internal error: out of range error");
2268 case bfd_reloc_notsupported:
2269 msg = _("internal error: unsupported relocation error");
2272 case bfd_reloc_dangerous:
2273 msg = _("internal error: dangerous relocation");
2277 msg = _("internal error: unknown error");
2282 info->callbacks->warning
2283 (info, msg, name, input_bfd, input_section, rel->r_offset);
2287 ret = riscv_resolve_pcrel_lo_relocs (&pcrel_relocs);
2289 riscv_free_pcrel_relocs (&pcrel_relocs);
2293 /* Finish up dynamic symbol handling. We set the contents of various
2294 dynamic sections here. */
2297 riscv_elf_finish_dynamic_symbol (bfd *output_bfd,
2298 struct bfd_link_info *info,
2299 struct elf_link_hash_entry *h,
2300 Elf_Internal_Sym *sym)
2302 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2303 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2305 if (h->plt.offset != (bfd_vma) -1)
2307 /* We've decided to create a PLT entry for this symbol. */
2309 bfd_vma i, header_address, plt_idx, got_address;
2310 uint32_t plt_entry[PLT_ENTRY_INSNS];
2311 Elf_Internal_Rela rela;
2313 BFD_ASSERT (h->dynindx != -1);
2315 /* Calculate the address of the PLT header. */
2316 header_address = sec_addr (htab->elf.splt);
2318 /* Calculate the index of the entry. */
2319 plt_idx = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
2321 /* Calculate the address of the .got.plt entry. */
2322 got_address = riscv_elf_got_plt_val (plt_idx, info);
2324 /* Find out where the .plt entry should go. */
2325 loc = htab->elf.splt->contents + h->plt.offset;
2327 /* Fill in the PLT entry itself. */
2328 riscv_make_plt_entry (got_address, header_address + h->plt.offset,
2330 for (i = 0; i < PLT_ENTRY_INSNS; i++)
2331 bfd_put_32 (output_bfd, plt_entry[i], loc + 4*i);
2333 /* Fill in the initial value of the .got.plt entry. */
2334 loc = htab->elf.sgotplt->contents
2335 + (got_address - sec_addr (htab->elf.sgotplt));
2336 bfd_put_NN (output_bfd, sec_addr (htab->elf.splt), loc);
2338 /* Fill in the entry in the .rela.plt section. */
2339 rela.r_offset = got_address;
2341 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_JUMP_SLOT);
2343 loc = htab->elf.srelplt->contents + plt_idx * sizeof (ElfNN_External_Rela);
2344 bed->s->swap_reloca_out (output_bfd, &rela, loc);
2346 if (!h->def_regular)
2348 /* Mark the symbol as undefined, rather than as defined in
2349 the .plt section. Leave the value alone. */
2350 sym->st_shndx = SHN_UNDEF;
2351 /* If the symbol is weak, we do need to clear the value.
2352 Otherwise, the PLT entry would provide a definition for
2353 the symbol even if the symbol wasn't defined anywhere,
2354 and so the symbol would never be NULL. */
2355 if (!h->ref_regular_nonweak)
2360 if (h->got.offset != (bfd_vma) -1
2361 && !(riscv_elf_hash_entry (h)->tls_type & (GOT_TLS_GD | GOT_TLS_IE)))
2365 Elf_Internal_Rela rela;
2367 /* This symbol has an entry in the GOT. Set it up. */
2369 sgot = htab->elf.sgot;
2370 srela = htab->elf.srelgot;
2371 BFD_ASSERT (sgot != NULL && srela != NULL);
2373 rela.r_offset = sec_addr (sgot) + (h->got.offset &~ (bfd_vma) 1);
2375 /* If this is a -Bsymbolic link, and the symbol is defined
2376 locally, we just want to emit a RELATIVE reloc. Likewise if
2377 the symbol was forced to be local because of a version file.
2378 The entry in the global offset table will already have been
2379 initialized in the relocate_section function. */
2380 if (bfd_link_pic (info)
2381 && (info->symbolic || h->dynindx == -1)
2384 asection *sec = h->root.u.def.section;
2385 rela.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2386 rela.r_addend = (h->root.u.def.value
2387 + sec->output_section->vma
2388 + sec->output_offset);
2392 BFD_ASSERT (h->dynindx != -1);
2393 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_NN);
2397 bfd_put_NN (output_bfd, 0,
2398 sgot->contents + (h->got.offset & ~(bfd_vma) 1));
2399 riscv_elf_append_rela (output_bfd, srela, &rela);
2404 Elf_Internal_Rela rela;
2407 /* This symbols needs a copy reloc. Set it up. */
2408 BFD_ASSERT (h->dynindx != -1);
2410 rela.r_offset = sec_addr (h->root.u.def.section) + h->root.u.def.value;
2411 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_COPY);
2413 if (h->root.u.def.section == htab->elf.sdynrelro)
2414 s = htab->elf.sreldynrelro;
2416 s = htab->elf.srelbss;
2417 riscv_elf_append_rela (output_bfd, s, &rela);
2420 /* Mark some specially defined symbols as absolute. */
2421 if (h == htab->elf.hdynamic
2422 || (h == htab->elf.hgot || h == htab->elf.hplt))
2423 sym->st_shndx = SHN_ABS;
2428 /* Finish up the dynamic sections. */
2431 riscv_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
2432 bfd *dynobj, asection *sdyn)
2434 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2435 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2436 size_t dynsize = bed->s->sizeof_dyn;
2437 bfd_byte *dyncon, *dynconend;
2439 dynconend = sdyn->contents + sdyn->size;
2440 for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
2442 Elf_Internal_Dyn dyn;
2445 bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
2450 s = htab->elf.sgotplt;
2451 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2454 s = htab->elf.srelplt;
2455 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2458 s = htab->elf.srelplt;
2459 dyn.d_un.d_val = s->size;
2465 bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
2471 riscv_elf_finish_dynamic_sections (bfd *output_bfd,
2472 struct bfd_link_info *info)
2476 struct riscv_elf_link_hash_table *htab;
2478 htab = riscv_elf_hash_table (info);
2479 BFD_ASSERT (htab != NULL);
2480 dynobj = htab->elf.dynobj;
2482 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
2484 if (elf_hash_table (info)->dynamic_sections_created)
2489 splt = htab->elf.splt;
2490 BFD_ASSERT (splt != NULL && sdyn != NULL);
2492 ret = riscv_finish_dyn (output_bfd, info, dynobj, sdyn);
2497 /* Fill in the head and tail entries in the procedure linkage table. */
2501 uint32_t plt_header[PLT_HEADER_INSNS];
2502 riscv_make_plt_header (sec_addr (htab->elf.sgotplt),
2503 sec_addr (splt), plt_header);
2505 for (i = 0; i < PLT_HEADER_INSNS; i++)
2506 bfd_put_32 (output_bfd, plt_header[i], splt->contents + 4*i);
2508 elf_section_data (splt->output_section)->this_hdr.sh_entsize
2513 if (htab->elf.sgotplt)
2515 asection *output_section = htab->elf.sgotplt->output_section;
2517 if (bfd_is_abs_section (output_section))
2519 (*_bfd_error_handler)
2520 (_("discarded output section: `%A'"), htab->elf.sgotplt);
2524 if (htab->elf.sgotplt->size > 0)
2526 /* Write the first two entries in .got.plt, needed for the dynamic
2528 bfd_put_NN (output_bfd, (bfd_vma) -1, htab->elf.sgotplt->contents);
2529 bfd_put_NN (output_bfd, (bfd_vma) 0,
2530 htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
2533 elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2538 asection *output_section = htab->elf.sgot->output_section;
2540 if (htab->elf.sgot->size > 0)
2542 /* Set the first entry in the global offset table to the address of
2543 the dynamic section. */
2544 bfd_vma val = sdyn ? sec_addr (sdyn) : 0;
2545 bfd_put_NN (output_bfd, val, htab->elf.sgot->contents);
2548 elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2554 /* Return address for Ith PLT stub in section PLT, for relocation REL
2555 or (bfd_vma) -1 if it should not be included. */
2558 riscv_elf_plt_sym_val (bfd_vma i, const asection *plt,
2559 const arelent *rel ATTRIBUTE_UNUSED)
2561 return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
2564 static enum elf_reloc_type_class
2565 riscv_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2566 const asection *rel_sec ATTRIBUTE_UNUSED,
2567 const Elf_Internal_Rela *rela)
2569 switch (ELFNN_R_TYPE (rela->r_info))
2571 case R_RISCV_RELATIVE:
2572 return reloc_class_relative;
2573 case R_RISCV_JUMP_SLOT:
2574 return reloc_class_plt;
2576 return reloc_class_copy;
2578 return reloc_class_normal;
2582 /* Merge backend specific data from an object file to the output
2583 object file when linking. */
2586 _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2588 bfd *obfd = info->output_bfd;
2589 flagword new_flags = elf_elfheader (ibfd)->e_flags;
2590 flagword old_flags = elf_elfheader (obfd)->e_flags;
2592 if (!is_riscv_elf (ibfd) || !is_riscv_elf (obfd))
2595 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
2597 (*_bfd_error_handler)
2598 (_("%B: ABI is incompatible with that of the selected emulation:\n"
2599 " target emulation `%s' does not match `%s'"),
2600 ibfd, bfd_get_target (ibfd), bfd_get_target (obfd));
2604 if (!_bfd_elf_merge_object_attributes (ibfd, info))
2607 if (! elf_flags_init (obfd))
2609 elf_flags_init (obfd) = TRUE;
2610 elf_elfheader (obfd)->e_flags = new_flags;
2614 /* Disallow linking different float ABIs. */
2615 if ((old_flags ^ new_flags) & EF_RISCV_FLOAT_ABI)
2617 (*_bfd_error_handler)
2618 (_("%B: can't link hard-float modules with soft-float modules"), ibfd);
2622 /* Allow linking RVC and non-RVC, and keep the RVC flag. */
2623 elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC;
2628 bfd_set_error (bfd_error_bad_value);
2632 /* Delete some bytes from a section while relaxing. */
2635 riscv_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, size_t count)
2637 unsigned int i, symcount;
2638 bfd_vma toaddr = sec->size;
2639 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
2640 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2641 unsigned int sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2642 struct bfd_elf_section_data *data = elf_section_data (sec);
2643 bfd_byte *contents = data->this_hdr.contents;
2645 /* Actually delete the bytes. */
2647 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
2649 /* Adjust the location of all of the relocs. Note that we need not
2650 adjust the addends, since all PC-relative references must be against
2651 symbols, which we will adjust below. */
2652 for (i = 0; i < sec->reloc_count; i++)
2653 if (data->relocs[i].r_offset > addr && data->relocs[i].r_offset < toaddr)
2654 data->relocs[i].r_offset -= count;
2656 /* Adjust the local symbols defined in this section. */
2657 for (i = 0; i < symtab_hdr->sh_info; i++)
2659 Elf_Internal_Sym *sym = (Elf_Internal_Sym *) symtab_hdr->contents + i;
2660 if (sym->st_shndx == sec_shndx)
2662 /* If the symbol is in the range of memory we just moved, we
2663 have to adjust its value. */
2664 if (sym->st_value > addr && sym->st_value <= toaddr)
2665 sym->st_value -= count;
2667 /* If the symbol *spans* the bytes we just deleted (i.e. its
2668 *end* is in the moved bytes but its *start* isn't), then we
2669 must adjust its size. */
2670 if (sym->st_value <= addr
2671 && sym->st_value + sym->st_size > addr
2672 && sym->st_value + sym->st_size <= toaddr)
2673 sym->st_size -= count;
2677 /* Now adjust the global symbols defined in this section. */
2678 symcount = ((symtab_hdr->sh_size / sizeof (ElfNN_External_Sym))
2679 - symtab_hdr->sh_info);
2681 for (i = 0; i < symcount; i++)
2683 struct elf_link_hash_entry *sym_hash = sym_hashes[i];
2685 if ((sym_hash->root.type == bfd_link_hash_defined
2686 || sym_hash->root.type == bfd_link_hash_defweak)
2687 && sym_hash->root.u.def.section == sec)
2689 /* As above, adjust the value if needed. */
2690 if (sym_hash->root.u.def.value > addr
2691 && sym_hash->root.u.def.value <= toaddr)
2692 sym_hash->root.u.def.value -= count;
2694 /* As above, adjust the size if needed. */
2695 if (sym_hash->root.u.def.value <= addr
2696 && sym_hash->root.u.def.value + sym_hash->size > addr
2697 && sym_hash->root.u.def.value + sym_hash->size <= toaddr)
2698 sym_hash->size -= count;
2705 /* A second format for recording PC-relative hi relocations. This stores the
2706 information required to relax them to GP-relative addresses. */
2708 typedef struct riscv_pcgp_hi_reloc riscv_pcgp_hi_reloc;
2709 struct riscv_pcgp_hi_reloc
2716 riscv_pcgp_hi_reloc *next;
2719 typedef struct riscv_pcgp_lo_reloc riscv_pcgp_lo_reloc;
2720 struct riscv_pcgp_lo_reloc
2723 riscv_pcgp_lo_reloc *next;
2728 riscv_pcgp_hi_reloc *hi;
2729 riscv_pcgp_lo_reloc *lo;
2730 } riscv_pcgp_relocs;
2733 riscv_init_pcgp_relocs (riscv_pcgp_relocs *p)
2741 riscv_free_pcgp_relocs (riscv_pcgp_relocs *p,
2742 bfd *abfd ATTRIBUTE_UNUSED,
2743 asection *sec ATTRIBUTE_UNUSED)
2745 riscv_pcgp_hi_reloc *c;
2746 riscv_pcgp_lo_reloc *l;
2748 for (c = p->hi; c != NULL;)
2750 riscv_pcgp_hi_reloc *next = c->next;
2755 for (l = p->lo; l != NULL;)
2757 riscv_pcgp_lo_reloc *next = l->next;
2764 riscv_record_pcgp_hi_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off,
2765 bfd_vma hi_addend, bfd_vma hi_addr,
2766 unsigned hi_sym, asection *sym_sec)
2768 riscv_pcgp_hi_reloc *new = bfd_malloc (sizeof(*new));
2771 new->hi_sec_off = hi_sec_off;
2772 new->hi_addend = hi_addend;
2773 new->hi_addr = hi_addr;
2774 new->hi_sym = hi_sym;
2775 new->sym_sec = sym_sec;
2781 static riscv_pcgp_hi_reloc *
2782 riscv_find_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2784 riscv_pcgp_hi_reloc *c;
2786 for (c = p->hi; c != NULL; c = c->next)
2787 if (c->hi_sec_off == hi_sec_off)
2793 riscv_delete_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2795 bfd_boolean out = FALSE;
2796 riscv_pcgp_hi_reloc *c;
2798 for (c = p->hi; c != NULL; c = c->next)
2799 if (c->hi_sec_off == hi_sec_off)
2806 riscv_use_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2808 bfd_boolean out = FALSE;
2809 riscv_pcgp_hi_reloc *c;
2811 for (c = p->hi; c != NULL; c = c->next)
2812 if (c->hi_sec_off == hi_sec_off)
2819 riscv_record_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2821 riscv_pcgp_lo_reloc *new = bfd_malloc (sizeof(*new));
2824 new->hi_sec_off = hi_sec_off;
2831 riscv_find_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2833 riscv_pcgp_lo_reloc *c;
2835 for (c = p->lo; c != NULL; c = c->next)
2836 if (c->hi_sec_off == hi_sec_off)
2842 riscv_delete_pcgp_lo_reloc (riscv_pcgp_relocs *p ATTRIBUTE_UNUSED,
2843 bfd_vma lo_sec_off ATTRIBUTE_UNUSED,
2844 size_t bytes ATTRIBUTE_UNUSED)
2849 typedef bfd_boolean (*relax_func_t) (bfd *, asection *, asection *,
2850 struct bfd_link_info *,
2851 Elf_Internal_Rela *,
2852 bfd_vma, bfd_vma, bfd_vma, bfd_boolean *,
2853 riscv_pcgp_relocs *);
2855 /* Relax AUIPC + JALR into JAL. */
2858 _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec,
2859 struct bfd_link_info *link_info,
2860 Elf_Internal_Rela *rel,
2862 bfd_vma max_alignment,
2863 bfd_vma reserve_size ATTRIBUTE_UNUSED,
2865 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
2867 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2868 bfd_signed_vma foff = symval - (sec_addr (sec) + rel->r_offset);
2869 bfd_boolean near_zero = (symval + RISCV_IMM_REACH/2) < RISCV_IMM_REACH;
2870 bfd_vma auipc, jalr;
2871 int rd, r_type, len = 4, rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
2873 /* If the call crosses section boundaries, an alignment directive could
2874 cause the PC-relative offset to later increase. */
2875 if (VALID_UJTYPE_IMM (foff) && sym_sec->output_section != sec->output_section)
2876 foff += (foff < 0 ? -max_alignment : max_alignment);
2878 /* See if this function call can be shortened. */
2879 if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero))
2882 /* Shorten the function call. */
2883 BFD_ASSERT (rel->r_offset + 8 <= sec->size);
2885 auipc = bfd_get_32 (abfd, contents + rel->r_offset);
2886 jalr = bfd_get_32 (abfd, contents + rel->r_offset + 4);
2887 rd = (jalr >> OP_SH_RD) & OP_MASK_RD;
2888 rvc = rvc && VALID_RVC_J_IMM (foff) && ARCH_SIZE == 32;
2890 if (rvc && (rd == 0 || rd == X_RA))
2892 /* Relax to C.J[AL] rd, addr. */
2893 r_type = R_RISCV_RVC_JUMP;
2894 auipc = rd == 0 ? MATCH_C_J : MATCH_C_JAL;
2897 else if (VALID_UJTYPE_IMM (foff))
2899 /* Relax to JAL rd, addr. */
2900 r_type = R_RISCV_JAL;
2901 auipc = MATCH_JAL | (rd << OP_SH_RD);
2903 else /* near_zero */
2905 /* Relax to JALR rd, x0, addr. */
2906 r_type = R_RISCV_LO12_I;
2907 auipc = MATCH_JALR | (rd << OP_SH_RD);
2910 /* Replace the R_RISCV_CALL reloc. */
2911 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), r_type);
2912 /* Replace the AUIPC. */
2913 bfd_put (8 * len, abfd, auipc, contents + rel->r_offset);
2915 /* Delete unnecessary JALR. */
2917 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + len, 8 - len);
2920 /* Traverse all output sections and return the max alignment. */
2923 _bfd_riscv_get_max_alignment (asection *sec)
2925 unsigned int max_alignment_power = 0;
2928 for (o = sec->output_section->owner->sections; o != NULL; o = o->next)
2930 if (o->alignment_power > max_alignment_power)
2931 max_alignment_power = o->alignment_power;
2934 return (bfd_vma) 1 << max_alignment_power;
2937 /* Relax non-PIC global variable references. */
2940 _bfd_riscv_relax_lui (bfd *abfd,
2943 struct bfd_link_info *link_info,
2944 Elf_Internal_Rela *rel,
2946 bfd_vma max_alignment,
2947 bfd_vma reserve_size,
2949 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
2951 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2952 bfd_vma gp = riscv_global_pointer_value (link_info);
2953 int use_rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
2955 /* Mergeable symbols and code might later move out of range. */
2956 if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
2959 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
2963 /* If gp and the symbol are in the same output section, then
2964 consider only that section's alignment. */
2965 struct bfd_link_hash_entry *h =
2966 bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE,
2968 if (h->u.def.section->output_section == sym_sec->output_section)
2969 max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
2972 /* Is the reference in range of x0 or gp?
2973 Valid gp range conservatively because of alignment issue. */
2974 if (VALID_ITYPE_IMM (symval)
2976 && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
2978 && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
2980 unsigned sym = ELFNN_R_SYM (rel->r_info);
2981 switch (ELFNN_R_TYPE (rel->r_info))
2983 case R_RISCV_LO12_I:
2984 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
2987 case R_RISCV_LO12_S:
2988 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
2992 /* We can delete the unnecessary LUI and reloc. */
2993 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
2995 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4);
3002 /* Can we relax LUI to C.LUI? Alignment might move the section forward;
3003 account for this assuming page alignment at worst. */
3005 && ELFNN_R_TYPE (rel->r_info) == R_RISCV_HI20
3006 && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval))
3007 && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval + ELF_MAXPAGESIZE)))
3009 /* Replace LUI with C.LUI if legal (i.e., rd != x0 and rd != x2/sp). */
3010 bfd_vma lui = bfd_get_32 (abfd, contents + rel->r_offset);
3011 unsigned rd = ((unsigned)lui >> OP_SH_RD) & OP_MASK_RD;
3012 if (rd == 0 || rd == X_SP)
3015 lui = (lui & (OP_MASK_RD << OP_SH_RD)) | MATCH_C_LUI;
3016 bfd_put_32 (abfd, lui, contents + rel->r_offset);
3018 /* Replace the R_RISCV_HI20 reloc. */
3019 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_RVC_LUI);
3022 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + 2, 2);
3028 /* Relax non-PIC TLS references. */
3031 _bfd_riscv_relax_tls_le (bfd *abfd,
3033 asection *sym_sec ATTRIBUTE_UNUSED,
3034 struct bfd_link_info *link_info,
3035 Elf_Internal_Rela *rel,
3037 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3038 bfd_vma reserve_size ATTRIBUTE_UNUSED,
3040 riscv_pcgp_relocs *prcel_relocs ATTRIBUTE_UNUSED)
3042 /* See if this symbol is in range of tp. */
3043 if (RISCV_CONST_HIGH_PART (tpoff (link_info, symval)) != 0)
3046 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3047 switch (ELFNN_R_TYPE (rel->r_info))
3049 case R_RISCV_TPREL_LO12_I:
3050 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_I);
3053 case R_RISCV_TPREL_LO12_S:
3054 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_S);
3057 case R_RISCV_TPREL_HI20:
3058 case R_RISCV_TPREL_ADD:
3059 /* We can delete the unnecessary instruction and reloc. */
3060 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3062 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4);
3069 /* Implement R_RISCV_ALIGN by deleting excess alignment NOPs. */
3072 _bfd_riscv_relax_align (bfd *abfd, asection *sec,
3074 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
3075 Elf_Internal_Rela *rel,
3077 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3078 bfd_vma reserve_size ATTRIBUTE_UNUSED,
3079 bfd_boolean *again ATTRIBUTE_UNUSED,
3080 riscv_pcgp_relocs *pcrel_relocs ATTRIBUTE_UNUSED)
3082 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
3083 bfd_vma alignment = 1, pos;
3084 while (alignment <= rel->r_addend)
3087 symval -= rel->r_addend;
3088 bfd_vma aligned_addr = ((symval - 1) & ~(alignment - 1)) + alignment;
3089 bfd_vma nop_bytes = aligned_addr - symval;
3091 /* Once we've handled an R_RISCV_ALIGN, we can't relax anything else. */
3092 sec->sec_flg0 = TRUE;
3094 /* Make sure there are enough NOPs to actually achieve the alignment. */
3095 if (rel->r_addend < nop_bytes)
3097 (*_bfd_error_handler)
3098 (_("%B(%A+0x%lx): %d bytes required for alignment "
3099 "to %d-byte boundary, but only %d present"),
3100 abfd, sym_sec, rel->r_offset, nop_bytes, alignment, rel->r_addend);
3101 bfd_set_error (bfd_error_bad_value);
3105 /* Delete the reloc. */
3106 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3108 /* If the number of NOPs is already correct, there's nothing to do. */
3109 if (nop_bytes == rel->r_addend)
3112 /* Write as many RISC-V NOPs as we need. */
3113 for (pos = 0; pos < (nop_bytes & -4); pos += 4)
3114 bfd_put_32 (abfd, RISCV_NOP, contents + rel->r_offset + pos);
3116 /* Write a final RVC NOP if need be. */
3117 if (nop_bytes % 4 != 0)
3118 bfd_put_16 (abfd, RVC_NOP, contents + rel->r_offset + pos);
3120 /* Delete the excess bytes. */
3121 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + nop_bytes,
3122 rel->r_addend - nop_bytes);
3125 /* Relax PC-relative references to GP-relative references. */
3128 _bfd_riscv_relax_pc (bfd *abfd,
3131 struct bfd_link_info *link_info,
3132 Elf_Internal_Rela *rel,
3134 bfd_vma max_alignment,
3135 bfd_vma reserve_size,
3136 bfd_boolean *again ATTRIBUTE_UNUSED,
3137 riscv_pcgp_relocs *pcgp_relocs)
3139 bfd_vma gp = riscv_global_pointer_value (link_info);
3141 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3143 /* Chain the _LO relocs to their cooresponding _HI reloc to compute the
3144 * actual target address. */
3145 riscv_pcgp_hi_reloc hi_reloc = {0};
3146 switch (ELFNN_R_TYPE (rel->r_info))
3148 case R_RISCV_PCREL_LO12_I:
3149 case R_RISCV_PCREL_LO12_S:
3151 riscv_pcgp_hi_reloc *hi = riscv_find_pcgp_hi_reloc (pcgp_relocs,
3152 symval - sec_addr(sym_sec));
3155 riscv_record_pcgp_lo_reloc (pcgp_relocs, symval - sec_addr(sym_sec));
3160 symval = hi_reloc.hi_addr;
3161 sym_sec = hi_reloc.sym_sec;
3162 if (!riscv_use_pcgp_hi_reloc(pcgp_relocs, hi->hi_sec_off))
3163 (*_bfd_error_handler)
3164 (_("%B(%A+0x%lx): Unable to clear RISCV_PCREL_HI20 reloc"
3165 "for cooresponding RISCV_PCREL_LO12 reloc"),
3166 abfd, sec, rel->r_offset);
3170 case R_RISCV_PCREL_HI20:
3171 /* Mergeable symbols and code might later move out of range. */
3172 if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
3175 /* If the cooresponding lo relocation has already been seen then it's not
3176 * safe to relax this relocation. */
3177 if (riscv_find_pcgp_lo_reloc (pcgp_relocs, rel->r_offset))
3188 /* If gp and the symbol are in the same output section, then
3189 consider only that section's alignment. */
3190 struct bfd_link_hash_entry *h =
3191 bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE, TRUE);
3192 if (h->u.def.section->output_section == sym_sec->output_section)
3193 max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
3196 /* Is the reference in range of x0 or gp?
3197 Valid gp range conservatively because of alignment issue. */
3198 if (VALID_ITYPE_IMM (symval)
3200 && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
3202 && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
3204 unsigned sym = hi_reloc.hi_sym;
3205 switch (ELFNN_R_TYPE (rel->r_info))
3207 case R_RISCV_PCREL_LO12_I:
3208 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
3209 rel->r_addend += hi_reloc.hi_addend;
3210 return riscv_delete_pcgp_lo_reloc (pcgp_relocs, rel->r_offset, 4);
3212 case R_RISCV_PCREL_LO12_S:
3213 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
3214 rel->r_addend += hi_reloc.hi_addend;
3215 return riscv_delete_pcgp_lo_reloc (pcgp_relocs, rel->r_offset, 4);
3217 case R_RISCV_PCREL_HI20:
3218 riscv_record_pcgp_hi_reloc (pcgp_relocs,
3222 ELFNN_R_SYM(rel->r_info),
3224 /* We can delete the unnecessary AUIPC and reloc. */
3225 rel->r_info = ELFNN_R_INFO (0, R_RISCV_DELETE);
3227 return riscv_delete_pcgp_hi_reloc (pcgp_relocs, rel->r_offset);
3237 /* Relax PC-relative references to GP-relative references. */
3240 _bfd_riscv_relax_delete (bfd *abfd,
3242 asection *sym_sec ATTRIBUTE_UNUSED,
3243 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
3244 Elf_Internal_Rela *rel,
3245 bfd_vma symval ATTRIBUTE_UNUSED,
3246 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3247 bfd_vma reserve_size ATTRIBUTE_UNUSED,
3248 bfd_boolean *again ATTRIBUTE_UNUSED,
3249 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
3251 if (!riscv_relax_delete_bytes(abfd, sec, rel->r_offset, rel->r_addend))
3253 rel->r_info = ELFNN_R_INFO(0, R_RISCV_NONE);
3257 /* Relax a section. Pass 0 shortens code sequences unless disabled. Pass 1
3258 deletes the bytes that pass 0 made obselete. Pass 2, which cannot be
3259 disabled, handles code alignment directives. */
3262 _bfd_riscv_relax_section (bfd *abfd, asection *sec,
3263 struct bfd_link_info *info,
3266 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
3267 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
3268 struct bfd_elf_section_data *data = elf_section_data (sec);
3269 Elf_Internal_Rela *relocs;
3270 bfd_boolean ret = FALSE;
3272 bfd_vma max_alignment, reserve_size = 0;
3273 riscv_pcgp_relocs pcgp_relocs;
3277 if (bfd_link_relocatable (info)
3279 || (sec->flags & SEC_RELOC) == 0
3280 || sec->reloc_count == 0
3281 || (info->disable_target_specific_optimizations
3282 && info->relax_pass == 0))
3285 riscv_init_pcgp_relocs (&pcgp_relocs);
3287 /* Read this BFD's relocs if we haven't done so already. */
3289 relocs = data->relocs;
3290 else if (!(relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
3291 info->keep_memory)))
3296 max_alignment = htab->max_alignment;
3297 if (max_alignment == (bfd_vma) -1)
3299 max_alignment = _bfd_riscv_get_max_alignment (sec);
3300 htab->max_alignment = max_alignment;
3304 max_alignment = _bfd_riscv_get_max_alignment (sec);
3306 /* Examine and consider relaxing each reloc. */
3307 for (i = 0; i < sec->reloc_count; i++)
3310 Elf_Internal_Rela *rel = relocs + i;
3311 relax_func_t relax_func;
3312 int type = ELFNN_R_TYPE (rel->r_info);
3316 if (info->relax_pass == 0)
3318 if (type == R_RISCV_CALL || type == R_RISCV_CALL_PLT)
3319 relax_func = _bfd_riscv_relax_call;
3320 else if (type == R_RISCV_HI20
3321 || type == R_RISCV_LO12_I
3322 || type == R_RISCV_LO12_S)
3323 relax_func = _bfd_riscv_relax_lui;
3324 else if (!bfd_link_pic(info)
3325 && (type == R_RISCV_PCREL_HI20
3326 || type == R_RISCV_PCREL_LO12_I
3327 || type == R_RISCV_PCREL_LO12_S))
3328 relax_func = _bfd_riscv_relax_pc;
3329 else if (type == R_RISCV_TPREL_HI20
3330 || type == R_RISCV_TPREL_ADD
3331 || type == R_RISCV_TPREL_LO12_I
3332 || type == R_RISCV_TPREL_LO12_S)
3333 relax_func = _bfd_riscv_relax_tls_le;
3337 /* Only relax this reloc if it is paired with R_RISCV_RELAX. */
3338 if (i == sec->reloc_count - 1
3339 || ELFNN_R_TYPE ((rel + 1)->r_info) != R_RISCV_RELAX
3340 || rel->r_offset != (rel + 1)->r_offset)
3343 /* Skip over the R_RISCV_RELAX. */
3346 else if (info->relax_pass == 1 && type == R_RISCV_DELETE)
3347 relax_func = _bfd_riscv_relax_delete;
3348 else if (info->relax_pass == 2 && type == R_RISCV_ALIGN)
3349 relax_func = _bfd_riscv_relax_align;
3353 data->relocs = relocs;
3355 /* Read this BFD's contents if we haven't done so already. */
3356 if (!data->this_hdr.contents
3357 && !bfd_malloc_and_get_section (abfd, sec, &data->this_hdr.contents))
3360 /* Read this BFD's symbols if we haven't done so already. */
3361 if (symtab_hdr->sh_info != 0
3362 && !symtab_hdr->contents
3363 && !(symtab_hdr->contents =
3364 (unsigned char *) bfd_elf_get_elf_syms (abfd, symtab_hdr,
3365 symtab_hdr->sh_info,
3366 0, NULL, NULL, NULL)))
3369 /* Get the value of the symbol referred to by the reloc. */
3370 if (ELFNN_R_SYM (rel->r_info) < symtab_hdr->sh_info)
3372 /* A local symbol. */
3373 Elf_Internal_Sym *isym = ((Elf_Internal_Sym *) symtab_hdr->contents
3374 + ELFNN_R_SYM (rel->r_info));
3375 reserve_size = (isym->st_size - rel->r_addend) > isym->st_size
3376 ? 0 : isym->st_size - rel->r_addend;
3378 if (isym->st_shndx == SHN_UNDEF)
3379 sym_sec = sec, symval = sec_addr (sec) + rel->r_offset;
3382 BFD_ASSERT (isym->st_shndx < elf_numsections (abfd));
3383 sym_sec = elf_elfsections (abfd)[isym->st_shndx]->bfd_section;
3384 if (sec_addr (sym_sec) == 0)
3386 symval = sec_addr (sym_sec) + isym->st_value;
3392 struct elf_link_hash_entry *h;
3394 indx = ELFNN_R_SYM (rel->r_info) - symtab_hdr->sh_info;
3395 h = elf_sym_hashes (abfd)[indx];
3397 while (h->root.type == bfd_link_hash_indirect
3398 || h->root.type == bfd_link_hash_warning)
3399 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3401 if (h->plt.offset != MINUS_ONE)
3402 symval = sec_addr (htab->elf.splt) + h->plt.offset;
3403 else if (h->root.u.def.section->output_section == NULL
3404 || (h->root.type != bfd_link_hash_defined
3405 && h->root.type != bfd_link_hash_defweak))
3408 symval = sec_addr (h->root.u.def.section) + h->root.u.def.value;
3410 if (h->type != STT_FUNC)
3412 (h->size - rel->r_addend) > h->size ? 0 : h->size - rel->r_addend;
3413 sym_sec = h->root.u.def.section;
3416 symval += rel->r_addend;
3418 if (!relax_func (abfd, sec, sym_sec, info, rel, symval,
3419 max_alignment, reserve_size, again,
3427 if (relocs != data->relocs)
3429 riscv_free_pcgp_relocs(&pcgp_relocs, abfd, sec);
3435 # define PRSTATUS_SIZE 0 /* FIXME */
3436 # define PRSTATUS_OFFSET_PR_CURSIG 12
3437 # define PRSTATUS_OFFSET_PR_PID 24
3438 # define PRSTATUS_OFFSET_PR_REG 72
3439 # define ELF_GREGSET_T_SIZE 128
3440 # define PRPSINFO_SIZE 128
3441 # define PRPSINFO_OFFSET_PR_PID 16
3442 # define PRPSINFO_OFFSET_PR_FNAME 32
3443 # define PRPSINFO_OFFSET_PR_PSARGS 48
3445 # define PRSTATUS_SIZE 376
3446 # define PRSTATUS_OFFSET_PR_CURSIG 12
3447 # define PRSTATUS_OFFSET_PR_PID 32
3448 # define PRSTATUS_OFFSET_PR_REG 112
3449 # define ELF_GREGSET_T_SIZE 256
3450 # define PRPSINFO_SIZE 136
3451 # define PRPSINFO_OFFSET_PR_PID 24
3452 # define PRPSINFO_OFFSET_PR_FNAME 40
3453 # define PRPSINFO_OFFSET_PR_PSARGS 56
3456 /* Support for core dump NOTE sections. */
3459 riscv_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3461 switch (note->descsz)
3466 case PRSTATUS_SIZE: /* sizeof(struct elf_prstatus) on Linux/RISC-V. */
3468 elf_tdata (abfd)->core->signal
3469 = bfd_get_16 (abfd, note->descdata + PRSTATUS_OFFSET_PR_CURSIG);
3472 elf_tdata (abfd)->core->lwpid
3473 = bfd_get_32 (abfd, note->descdata + PRSTATUS_OFFSET_PR_PID);
3477 /* Make a ".reg/999" section. */
3478 return _bfd_elfcore_make_pseudosection (abfd, ".reg", ELF_GREGSET_T_SIZE,
3479 note->descpos + PRSTATUS_OFFSET_PR_REG);
3483 riscv_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3485 switch (note->descsz)
3490 case PRPSINFO_SIZE: /* sizeof(struct elf_prpsinfo) on Linux/RISC-V. */
3492 elf_tdata (abfd)->core->pid
3493 = bfd_get_32 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PID);
3496 elf_tdata (abfd)->core->program = _bfd_elfcore_strndup
3497 (abfd, note->descdata + PRPSINFO_OFFSET_PR_FNAME, 16);
3500 elf_tdata (abfd)->core->command = _bfd_elfcore_strndup
3501 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PSARGS, 80);
3505 /* Note that for some reason, a spurious space is tacked
3506 onto the end of the args in some (at least one anyway)
3507 implementations, so strip it off if it exists. */
3510 char *command = elf_tdata (abfd)->core->command;
3511 int n = strlen (command);
3513 if (0 < n && command[n - 1] == ' ')
3514 command[n - 1] = '\0';
3520 /* Set the right mach type. */
3522 riscv_elf_object_p (bfd *abfd)
3524 /* There are only two mach types in RISCV currently. */
3525 if (strcmp (abfd->xvec->name, "elf32-littleriscv") == 0)
3526 bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv32);
3528 bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv64);
3534 #define TARGET_LITTLE_SYM riscv_elfNN_vec
3535 #define TARGET_LITTLE_NAME "elfNN-littleriscv"
3537 #define elf_backend_reloc_type_class riscv_reloc_type_class
3539 #define bfd_elfNN_bfd_reloc_name_lookup riscv_reloc_name_lookup
3540 #define bfd_elfNN_bfd_link_hash_table_create riscv_elf_link_hash_table_create
3541 #define bfd_elfNN_bfd_reloc_type_lookup riscv_reloc_type_lookup
3542 #define bfd_elfNN_bfd_merge_private_bfd_data \
3543 _bfd_riscv_elf_merge_private_bfd_data
3545 #define elf_backend_copy_indirect_symbol riscv_elf_copy_indirect_symbol
3546 #define elf_backend_create_dynamic_sections riscv_elf_create_dynamic_sections
3547 #define elf_backend_check_relocs riscv_elf_check_relocs
3548 #define elf_backend_adjust_dynamic_symbol riscv_elf_adjust_dynamic_symbol
3549 #define elf_backend_size_dynamic_sections riscv_elf_size_dynamic_sections
3550 #define elf_backend_relocate_section riscv_elf_relocate_section
3551 #define elf_backend_finish_dynamic_symbol riscv_elf_finish_dynamic_symbol
3552 #define elf_backend_finish_dynamic_sections riscv_elf_finish_dynamic_sections
3553 #define elf_backend_gc_mark_hook riscv_elf_gc_mark_hook
3554 #define elf_backend_plt_sym_val riscv_elf_plt_sym_val
3555 #define elf_backend_grok_prstatus riscv_elf_grok_prstatus
3556 #define elf_backend_grok_psinfo riscv_elf_grok_psinfo
3557 #define elf_backend_object_p riscv_elf_object_p
3558 #define elf_info_to_howto_rel NULL
3559 #define elf_info_to_howto riscv_info_to_howto_rela
3560 #define bfd_elfNN_bfd_relax_section _bfd_riscv_relax_section
3562 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
3564 #define elf_backend_can_gc_sections 1
3565 #define elf_backend_can_refcount 1
3566 #define elf_backend_want_got_plt 1
3567 #define elf_backend_plt_readonly 1
3568 #define elf_backend_plt_alignment 4
3569 #define elf_backend_want_plt_sym 1
3570 #define elf_backend_got_header_size (ARCH_SIZE / 8)
3571 #define elf_backend_want_dynrelro 1
3572 #define elf_backend_rela_normal 1
3573 #define elf_backend_default_execstack 0
3575 #include "elfNN-target.h"