1 /* RISC-V-specific support for NN-bit ELF.
2 Copyright (C) 2011-2018 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 /* RISC-V ELF linker hash entry. */
60 struct riscv_elf_link_hash_entry
62 struct elf_link_hash_entry elf;
64 /* Track dynamic relocs copied for this symbol. */
65 struct elf_dyn_relocs *dyn_relocs;
75 #define riscv_elf_hash_entry(ent) \
76 ((struct riscv_elf_link_hash_entry *)(ent))
78 struct _bfd_riscv_elf_obj_tdata
80 struct elf_obj_tdata root;
82 /* tls_type for each local got entry. */
83 char *local_got_tls_type;
86 #define _bfd_riscv_elf_tdata(abfd) \
87 ((struct _bfd_riscv_elf_obj_tdata *) (abfd)->tdata.any)
89 #define _bfd_riscv_elf_local_got_tls_type(abfd) \
90 (_bfd_riscv_elf_tdata (abfd)->local_got_tls_type)
92 #define _bfd_riscv_elf_tls_type(abfd, h, symndx) \
93 (*((h) != NULL ? &riscv_elf_hash_entry (h)->tls_type \
94 : &_bfd_riscv_elf_local_got_tls_type (abfd) [symndx]))
96 #define is_riscv_elf(bfd) \
97 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
98 && elf_tdata (bfd) != NULL \
99 && elf_object_id (bfd) == RISCV_ELF_DATA)
101 #include "elf/common.h"
102 #include "elf/internal.h"
104 struct riscv_elf_link_hash_table
106 struct elf_link_hash_table elf;
108 /* Short-cuts to get to dynamic linker sections. */
111 /* Small local sym to section mapping cache. */
112 struct sym_cache sym_cache;
114 /* The max alignment of output sections. */
115 bfd_vma max_alignment;
119 /* Get the RISC-V ELF linker hash table from a link_info structure. */
120 #define riscv_elf_hash_table(p) \
121 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
122 == RISCV_ELF_DATA ? ((struct riscv_elf_link_hash_table *) ((p)->hash)) : NULL)
125 riscv_info_to_howto_rela (bfd *abfd,
127 Elf_Internal_Rela *dst)
129 cache_ptr->howto = riscv_elf_rtype_to_howto (abfd, ELFNN_R_TYPE (dst->r_info));
130 return cache_ptr->howto != NULL;
134 riscv_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
136 const struct elf_backend_data *bed;
139 bed = get_elf_backend_data (abfd);
140 loc = s->contents + (s->reloc_count++ * bed->s->sizeof_rela);
141 bed->s->swap_reloca_out (abfd, rel, loc);
146 #define PLT_HEADER_INSNS 8
147 #define PLT_ENTRY_INSNS 4
148 #define PLT_HEADER_SIZE (PLT_HEADER_INSNS * 4)
149 #define PLT_ENTRY_SIZE (PLT_ENTRY_INSNS * 4)
151 #define GOT_ENTRY_SIZE RISCV_ELF_WORD_BYTES
153 #define GOTPLT_HEADER_SIZE (2 * GOT_ENTRY_SIZE)
155 #define sec_addr(sec) ((sec)->output_section->vma + (sec)->output_offset)
158 riscv_elf_got_plt_val (bfd_vma plt_index, struct bfd_link_info *info)
160 return sec_addr (riscv_elf_hash_table (info)->elf.sgotplt)
161 + GOTPLT_HEADER_SIZE + (plt_index * GOT_ENTRY_SIZE);
165 # define MATCH_LREG MATCH_LW
167 # define MATCH_LREG MATCH_LD
170 /* Generate a PLT header. */
173 riscv_make_plt_header (bfd_vma gotplt_addr, bfd_vma addr, uint32_t *entry)
175 bfd_vma gotplt_offset_high = RISCV_PCREL_HIGH_PART (gotplt_addr, addr);
176 bfd_vma gotplt_offset_low = RISCV_PCREL_LOW_PART (gotplt_addr, addr);
178 /* auipc t2, %hi(.got.plt)
179 sub t1, t1, t3 # shifted .got.plt offset + hdr size + 12
180 l[w|d] t3, %lo(.got.plt)(t2) # _dl_runtime_resolve
181 addi t1, t1, -(hdr size + 12) # shifted .got.plt offset
182 addi t0, t2, %lo(.got.plt) # &.got.plt
183 srli t1, t1, log2(16/PTRSIZE) # .got.plt offset
184 l[w|d] t0, PTRSIZE(t0) # link map
187 entry[0] = RISCV_UTYPE (AUIPC, X_T2, gotplt_offset_high);
188 entry[1] = RISCV_RTYPE (SUB, X_T1, X_T1, X_T3);
189 entry[2] = RISCV_ITYPE (LREG, X_T3, X_T2, gotplt_offset_low);
190 entry[3] = RISCV_ITYPE (ADDI, X_T1, X_T1, -(PLT_HEADER_SIZE + 12));
191 entry[4] = RISCV_ITYPE (ADDI, X_T0, X_T2, gotplt_offset_low);
192 entry[5] = RISCV_ITYPE (SRLI, X_T1, X_T1, 4 - RISCV_ELF_LOG_WORD_BYTES);
193 entry[6] = RISCV_ITYPE (LREG, X_T0, X_T0, RISCV_ELF_WORD_BYTES);
194 entry[7] = RISCV_ITYPE (JALR, 0, X_T3, 0);
197 /* Generate a PLT entry. */
200 riscv_make_plt_entry (bfd_vma got, bfd_vma addr, uint32_t *entry)
202 /* auipc t3, %hi(.got.plt entry)
203 l[w|d] t3, %lo(.got.plt entry)(t3)
207 entry[0] = RISCV_UTYPE (AUIPC, X_T3, RISCV_PCREL_HIGH_PART (got, addr));
208 entry[1] = RISCV_ITYPE (LREG, X_T3, X_T3, RISCV_PCREL_LOW_PART (got, addr));
209 entry[2] = RISCV_ITYPE (JALR, X_T1, X_T3, 0);
210 entry[3] = RISCV_NOP;
213 /* Create an entry in an RISC-V ELF linker hash table. */
215 static struct bfd_hash_entry *
216 link_hash_newfunc (struct bfd_hash_entry *entry,
217 struct bfd_hash_table *table, const char *string)
219 /* Allocate the structure if it has not already been allocated by a
224 bfd_hash_allocate (table,
225 sizeof (struct riscv_elf_link_hash_entry));
230 /* Call the allocation method of the superclass. */
231 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
234 struct riscv_elf_link_hash_entry *eh;
236 eh = (struct riscv_elf_link_hash_entry *) entry;
237 eh->dyn_relocs = NULL;
238 eh->tls_type = GOT_UNKNOWN;
244 /* Create a RISC-V ELF linker hash table. */
246 static struct bfd_link_hash_table *
247 riscv_elf_link_hash_table_create (bfd *abfd)
249 struct riscv_elf_link_hash_table *ret;
250 bfd_size_type amt = sizeof (struct riscv_elf_link_hash_table);
252 ret = (struct riscv_elf_link_hash_table *) bfd_zmalloc (amt);
256 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
257 sizeof (struct riscv_elf_link_hash_entry),
264 ret->max_alignment = (bfd_vma) -1;
265 return &ret->elf.root;
268 /* Create the .got section. */
271 riscv_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
275 struct elf_link_hash_entry *h;
276 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
277 struct elf_link_hash_table *htab = elf_hash_table (info);
279 /* This function may be called more than once. */
280 if (htab->sgot != NULL)
283 flags = bed->dynamic_sec_flags;
285 s = bfd_make_section_anyway_with_flags (abfd,
286 (bed->rela_plts_and_copies_p
287 ? ".rela.got" : ".rel.got"),
288 (bed->dynamic_sec_flags
291 || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
295 s = s_got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
297 || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
301 /* The first bit of the global offset table is the header. */
302 s->size += bed->got_header_size;
304 if (bed->want_got_plt)
306 s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
308 || !bfd_set_section_alignment (abfd, s,
309 bed->s->log_file_align))
313 /* Reserve room for the header. */
314 s->size += GOTPLT_HEADER_SIZE;
317 if (bed->want_got_sym)
319 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
320 section. We don't do this in the linker script because we don't want
321 to define the symbol if we are not creating a global offset
323 h = _bfd_elf_define_linkage_sym (abfd, info, s_got,
324 "_GLOBAL_OFFSET_TABLE_");
325 elf_hash_table (info)->hgot = h;
333 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
334 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
338 riscv_elf_create_dynamic_sections (bfd *dynobj,
339 struct bfd_link_info *info)
341 struct riscv_elf_link_hash_table *htab;
343 htab = riscv_elf_hash_table (info);
344 BFD_ASSERT (htab != NULL);
346 if (!riscv_elf_create_got_section (dynobj, info))
349 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
352 if (!bfd_link_pic (info))
355 bfd_make_section_anyway_with_flags (dynobj, ".tdata.dyn",
356 (SEC_ALLOC | SEC_THREAD_LOCAL
357 | SEC_LINKER_CREATED));
360 if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss
361 || (!bfd_link_pic (info) && (!htab->elf.srelbss || !htab->sdyntdata)))
367 /* Copy the extra info we tack onto an elf_link_hash_entry. */
370 riscv_elf_copy_indirect_symbol (struct bfd_link_info *info,
371 struct elf_link_hash_entry *dir,
372 struct elf_link_hash_entry *ind)
374 struct riscv_elf_link_hash_entry *edir, *eind;
376 edir = (struct riscv_elf_link_hash_entry *) dir;
377 eind = (struct riscv_elf_link_hash_entry *) ind;
379 if (eind->dyn_relocs != NULL)
381 if (edir->dyn_relocs != NULL)
383 struct elf_dyn_relocs **pp;
384 struct elf_dyn_relocs *p;
386 /* Add reloc counts against the indirect sym to the direct sym
387 list. Merge any entries against the same section. */
388 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
390 struct elf_dyn_relocs *q;
392 for (q = edir->dyn_relocs; q != NULL; q = q->next)
393 if (q->sec == p->sec)
395 q->pc_count += p->pc_count;
396 q->count += p->count;
403 *pp = edir->dyn_relocs;
406 edir->dyn_relocs = eind->dyn_relocs;
407 eind->dyn_relocs = NULL;
410 if (ind->root.type == bfd_link_hash_indirect
411 && dir->got.refcount <= 0)
413 edir->tls_type = eind->tls_type;
414 eind->tls_type = GOT_UNKNOWN;
416 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
420 riscv_elf_record_tls_type (bfd *abfd, struct elf_link_hash_entry *h,
421 unsigned long symndx, char tls_type)
423 char *new_tls_type = &_bfd_riscv_elf_tls_type (abfd, h, symndx);
425 *new_tls_type |= tls_type;
426 if ((*new_tls_type & GOT_NORMAL) && (*new_tls_type & ~GOT_NORMAL))
428 (*_bfd_error_handler)
429 (_("%pB: `%s' accessed both as normal and thread local symbol"),
430 abfd, h ? h->root.root.string : "<local>");
437 riscv_elf_record_got_reference (bfd *abfd, struct bfd_link_info *info,
438 struct elf_link_hash_entry *h, long symndx)
440 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
441 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
443 if (htab->elf.sgot == NULL)
445 if (!riscv_elf_create_got_section (htab->elf.dynobj, info))
451 h->got.refcount += 1;
455 /* This is a global offset table entry for a local symbol. */
456 if (elf_local_got_refcounts (abfd) == NULL)
458 bfd_size_type size = symtab_hdr->sh_info * (sizeof (bfd_vma) + 1);
459 if (!(elf_local_got_refcounts (abfd) = bfd_zalloc (abfd, size)))
461 _bfd_riscv_elf_local_got_tls_type (abfd)
462 = (char *) (elf_local_got_refcounts (abfd) + symtab_hdr->sh_info);
464 elf_local_got_refcounts (abfd) [symndx] += 1;
470 bad_static_reloc (bfd *abfd, unsigned r_type, struct elf_link_hash_entry *h)
472 reloc_howto_type * r = riscv_elf_rtype_to_howto (abfd, r_type);
474 (*_bfd_error_handler)
475 (_("%pB: relocation %s against `%s' can not be used when making a shared "
476 "object; recompile with -fPIC"),
477 abfd, r ? r->name : _("<unknown>"),
478 h != NULL ? h->root.root.string : "a local symbol");
479 bfd_set_error (bfd_error_bad_value);
482 /* Look through the relocs for a section during the first phase, and
483 allocate space in the global offset table or procedure linkage
487 riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
488 asection *sec, const Elf_Internal_Rela *relocs)
490 struct riscv_elf_link_hash_table *htab;
491 Elf_Internal_Shdr *symtab_hdr;
492 struct elf_link_hash_entry **sym_hashes;
493 const Elf_Internal_Rela *rel;
494 asection *sreloc = NULL;
496 if (bfd_link_relocatable (info))
499 htab = riscv_elf_hash_table (info);
500 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
501 sym_hashes = elf_sym_hashes (abfd);
503 if (htab->elf.dynobj == NULL)
504 htab->elf.dynobj = abfd;
506 for (rel = relocs; rel < relocs + sec->reloc_count; rel++)
509 unsigned int r_symndx;
510 struct elf_link_hash_entry *h;
512 r_symndx = ELFNN_R_SYM (rel->r_info);
513 r_type = ELFNN_R_TYPE (rel->r_info);
515 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
517 (*_bfd_error_handler) (_("%pB: bad symbol index: %d"),
522 if (r_symndx < symtab_hdr->sh_info)
526 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
527 while (h->root.type == bfd_link_hash_indirect
528 || h->root.type == bfd_link_hash_warning)
529 h = (struct elf_link_hash_entry *) h->root.u.i.link;
534 case R_RISCV_TLS_GD_HI20:
535 if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
536 || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_GD))
540 case R_RISCV_TLS_GOT_HI20:
541 if (bfd_link_pic (info))
542 info->flags |= DF_STATIC_TLS;
543 if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
544 || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_IE))
548 case R_RISCV_GOT_HI20:
549 if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
550 || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_NORMAL))
554 case R_RISCV_CALL_PLT:
555 /* This symbol requires a procedure linkage table entry. We
556 actually build the entry in adjust_dynamic_symbol,
557 because this might be a case of linking PIC code without
558 linking in any dynamic objects, in which case we don't
559 need to generate a procedure linkage table after all. */
564 h->plt.refcount += 1;
571 case R_RISCV_RVC_BRANCH:
572 case R_RISCV_RVC_JUMP:
573 case R_RISCV_PCREL_HI20:
574 /* In shared libraries, these relocs are known to bind locally. */
575 if (bfd_link_pic (info))
579 case R_RISCV_TPREL_HI20:
580 if (!bfd_link_executable (info))
581 return bad_static_reloc (abfd, r_type, h);
583 riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
587 if (bfd_link_pic (info))
588 return bad_static_reloc (abfd, r_type, h);
592 case R_RISCV_JUMP_SLOT:
593 case R_RISCV_RELATIVE:
599 /* This reloc might not bind locally. */
603 if (h != NULL && !bfd_link_pic (info))
605 /* We may need a .plt entry if the function this reloc
606 refers to is in a shared lib. */
607 h->plt.refcount += 1;
610 /* If we are creating a shared library, and this is a reloc
611 against a global symbol, or a non PC relative reloc
612 against a local symbol, then we need to copy the reloc
613 into the shared library. However, if we are linking with
614 -Bsymbolic, we do not need to copy a reloc against a
615 global symbol which is defined in an object we are
616 including in the link (i.e., DEF_REGULAR is set). At
617 this point we have not seen all the input files, so it is
618 possible that DEF_REGULAR is not set now but will be set
619 later (it is never cleared). In case of a weak definition,
620 DEF_REGULAR may be cleared later by a strong definition in
621 a shared library. We account for that possibility below by
622 storing information in the relocs_copied field of the hash
623 table entry. A similar situation occurs when creating
624 shared libraries and symbol visibility changes render the
627 If on the other hand, we are creating an executable, we
628 may need to keep relocations for symbols satisfied by a
629 dynamic library if we manage to avoid copy relocs for the
631 reloc_howto_type * r = riscv_elf_rtype_to_howto (abfd, r_type);
633 if ((bfd_link_pic (info)
634 && (sec->flags & SEC_ALLOC) != 0
635 && ((r != NULL && ! r->pc_relative)
638 || h->root.type == bfd_link_hash_defweak
639 || !h->def_regular))))
640 || (!bfd_link_pic (info)
641 && (sec->flags & SEC_ALLOC) != 0
643 && (h->root.type == bfd_link_hash_defweak
644 || !h->def_regular)))
646 struct elf_dyn_relocs *p;
647 struct elf_dyn_relocs **head;
649 /* When creating a shared object, we must copy these
650 relocs into the output file. We create a reloc
651 section in dynobj and make room for the reloc. */
654 sreloc = _bfd_elf_make_dynamic_reloc_section
655 (sec, htab->elf.dynobj, RISCV_ELF_LOG_WORD_BYTES,
656 abfd, /*rela?*/ TRUE);
662 /* If this is a global symbol, we count the number of
663 relocations we need for this symbol. */
665 head = &((struct riscv_elf_link_hash_entry *) h)->dyn_relocs;
668 /* Track dynamic relocs needed for local syms too.
669 We really need local syms available to do this
674 Elf_Internal_Sym *isym;
676 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
681 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
685 vpp = &elf_section_data (s)->local_dynrel;
686 head = (struct elf_dyn_relocs **) vpp;
690 if (p == NULL || p->sec != sec)
692 bfd_size_type amt = sizeof *p;
693 p = ((struct elf_dyn_relocs *)
694 bfd_alloc (htab->elf.dynobj, amt));
705 p->pc_count += r == NULL ? 0 : r->pc_relative;
710 case R_RISCV_GNU_VTINHERIT:
711 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
715 case R_RISCV_GNU_VTENTRY:
716 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
729 riscv_elf_gc_mark_hook (asection *sec,
730 struct bfd_link_info *info,
731 Elf_Internal_Rela *rel,
732 struct elf_link_hash_entry *h,
733 Elf_Internal_Sym *sym)
736 switch (ELFNN_R_TYPE (rel->r_info))
738 case R_RISCV_GNU_VTINHERIT:
739 case R_RISCV_GNU_VTENTRY:
743 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
746 /* Find dynamic relocs for H that apply to read-only sections. */
749 readonly_dynrelocs (struct elf_link_hash_entry *h)
751 struct elf_dyn_relocs *p;
753 for (p = riscv_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
755 asection *s = p->sec->output_section;
757 if (s != NULL && (s->flags & SEC_READONLY) != 0)
763 /* Adjust a symbol defined by a dynamic object and referenced by a
764 regular object. The current definition is in some section of the
765 dynamic object, but we're not including those sections. We have to
766 change the definition to something the rest of the link can
770 riscv_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
771 struct elf_link_hash_entry *h)
773 struct riscv_elf_link_hash_table *htab;
774 struct riscv_elf_link_hash_entry * eh;
778 htab = riscv_elf_hash_table (info);
779 BFD_ASSERT (htab != NULL);
781 dynobj = htab->elf.dynobj;
783 /* Make sure we know what is going on here. */
784 BFD_ASSERT (dynobj != NULL
786 || h->type == STT_GNU_IFUNC
790 && !h->def_regular)));
792 /* If this is a function, put it in the procedure linkage table. We
793 will fill in the contents of the procedure linkage table later
794 (although we could actually do it here). */
795 if (h->type == STT_FUNC || h->type == STT_GNU_IFUNC || h->needs_plt)
797 if (h->plt.refcount <= 0
798 || SYMBOL_CALLS_LOCAL (info, h)
799 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
800 && h->root.type == bfd_link_hash_undefweak))
802 /* This case can occur if we saw a R_RISCV_CALL_PLT reloc in an
803 input file, but the symbol was never referred to by a dynamic
804 object, or if all references were garbage collected. In such
805 a case, we don't actually need to build a PLT entry. */
806 h->plt.offset = (bfd_vma) -1;
813 h->plt.offset = (bfd_vma) -1;
815 /* If this is a weak symbol, and there is a real definition, the
816 processor independent code will have arranged for us to see the
817 real definition first, and we can just use the same value. */
820 struct elf_link_hash_entry *def = weakdef (h);
821 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
822 h->root.u.def.section = def->root.u.def.section;
823 h->root.u.def.value = def->root.u.def.value;
827 /* This is a reference to a symbol defined by a dynamic object which
828 is not a function. */
830 /* If we are creating a shared library, we must presume that the
831 only references to the symbol are via the global offset table.
832 For such cases we need not do anything here; the relocations will
833 be handled correctly by relocate_section. */
834 if (bfd_link_pic (info))
837 /* If there are no references to this symbol that do not use the
838 GOT, we don't need to generate a copy reloc. */
842 /* If -z nocopyreloc was given, we won't generate them either. */
843 if (info->nocopyreloc)
849 /* If we don't find any dynamic relocs in read-only sections, then
850 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
851 if (!readonly_dynrelocs (h))
857 /* We must allocate the symbol in our .dynbss section, which will
858 become part of the .bss section of the executable. There will be
859 an entry for this symbol in the .dynsym section. The dynamic
860 object will contain position independent code, so all references
861 from the dynamic object to this symbol will go through the global
862 offset table. The dynamic linker will use the .dynsym entry to
863 determine the address it must put in the global offset table, so
864 both the dynamic object and the regular object will refer to the
865 same memory location for the variable. */
867 /* We must generate a R_RISCV_COPY reloc to tell the dynamic linker
868 to copy the initial value out of the dynamic object and into the
869 runtime process image. We need to remember the offset into the
870 .rel.bss section we are going to use. */
871 eh = (struct riscv_elf_link_hash_entry *) h;
872 if (eh->tls_type & ~GOT_NORMAL)
875 srel = htab->elf.srelbss;
877 else if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
879 s = htab->elf.sdynrelro;
880 srel = htab->elf.sreldynrelro;
884 s = htab->elf.sdynbss;
885 srel = htab->elf.srelbss;
887 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
889 srel->size += sizeof (ElfNN_External_Rela);
893 return _bfd_elf_adjust_dynamic_copy (info, h, s);
896 /* Allocate space in .plt, .got and associated reloc sections for
900 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
902 struct bfd_link_info *info;
903 struct riscv_elf_link_hash_table *htab;
904 struct riscv_elf_link_hash_entry *eh;
905 struct elf_dyn_relocs *p;
907 if (h->root.type == bfd_link_hash_indirect)
910 info = (struct bfd_link_info *) inf;
911 htab = riscv_elf_hash_table (info);
912 BFD_ASSERT (htab != NULL);
914 if (htab->elf.dynamic_sections_created
915 && h->plt.refcount > 0)
917 /* Make sure this symbol is output as a dynamic symbol.
918 Undefined weak syms won't yet be marked as dynamic. */
922 if (! bfd_elf_link_record_dynamic_symbol (info, h))
926 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
928 asection *s = htab->elf.splt;
931 s->size = PLT_HEADER_SIZE;
933 h->plt.offset = s->size;
935 /* Make room for this entry. */
936 s->size += PLT_ENTRY_SIZE;
938 /* We also need to make an entry in the .got.plt section. */
939 htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
941 /* We also need to make an entry in the .rela.plt section. */
942 htab->elf.srelplt->size += sizeof (ElfNN_External_Rela);
944 /* If this symbol is not defined in a regular file, and we are
945 not generating a shared library, then set the symbol to this
946 location in the .plt. This is required to make function
947 pointers compare as equal between the normal executable and
948 the shared library. */
949 if (! bfd_link_pic (info)
952 h->root.u.def.section = s;
953 h->root.u.def.value = h->plt.offset;
958 h->plt.offset = (bfd_vma) -1;
964 h->plt.offset = (bfd_vma) -1;
968 if (h->got.refcount > 0)
972 int tls_type = riscv_elf_hash_entry (h)->tls_type;
974 /* Make sure this symbol is output as a dynamic symbol.
975 Undefined weak syms won't yet be marked as dynamic. */
979 if (! bfd_elf_link_record_dynamic_symbol (info, h))
984 h->got.offset = s->size;
985 dyn = htab->elf.dynamic_sections_created;
986 if (tls_type & (GOT_TLS_GD | GOT_TLS_IE))
988 /* TLS_GD needs two dynamic relocs and two GOT slots. */
989 if (tls_type & GOT_TLS_GD)
991 s->size += 2 * RISCV_ELF_WORD_BYTES;
992 htab->elf.srelgot->size += 2 * sizeof (ElfNN_External_Rela);
995 /* TLS_IE needs one dynamic reloc and one GOT slot. */
996 if (tls_type & GOT_TLS_IE)
998 s->size += RISCV_ELF_WORD_BYTES;
999 htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
1004 s->size += RISCV_ELF_WORD_BYTES;
1005 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
1006 && ! UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
1007 htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
1011 h->got.offset = (bfd_vma) -1;
1013 eh = (struct riscv_elf_link_hash_entry *) h;
1014 if (eh->dyn_relocs == NULL)
1017 /* In the shared -Bsymbolic case, discard space allocated for
1018 dynamic pc-relative relocs against symbols which turn out to be
1019 defined in regular objects. For the normal shared case, discard
1020 space for pc-relative relocs that have become local due to symbol
1021 visibility changes. */
1023 if (bfd_link_pic (info))
1025 if (SYMBOL_CALLS_LOCAL (info, h))
1027 struct elf_dyn_relocs **pp;
1029 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1031 p->count -= p->pc_count;
1040 /* Also discard relocs on undefined weak syms with non-default
1042 if (eh->dyn_relocs != NULL
1043 && h->root.type == bfd_link_hash_undefweak)
1045 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1046 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
1047 eh->dyn_relocs = NULL;
1049 /* Make sure undefined weak symbols are output as a dynamic
1051 else if (h->dynindx == -1
1052 && !h->forced_local)
1054 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1061 /* For the non-shared case, discard space for relocs against
1062 symbols which turn out to need copy relocs or are not
1068 || (htab->elf.dynamic_sections_created
1069 && (h->root.type == bfd_link_hash_undefweak
1070 || h->root.type == bfd_link_hash_undefined))))
1072 /* Make sure this symbol is output as a dynamic symbol.
1073 Undefined weak syms won't yet be marked as dynamic. */
1074 if (h->dynindx == -1
1075 && !h->forced_local)
1077 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1081 /* If that succeeded, we know we'll be keeping all the
1083 if (h->dynindx != -1)
1087 eh->dyn_relocs = NULL;
1092 /* Finally, allocate space. */
1093 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1095 asection *sreloc = elf_section_data (p->sec)->sreloc;
1096 sreloc->size += p->count * sizeof (ElfNN_External_Rela);
1102 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
1103 read-only sections. */
1106 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
1110 if (h->root.type == bfd_link_hash_indirect)
1113 sec = readonly_dynrelocs (h);
1116 struct bfd_link_info *info = (struct bfd_link_info *) info_p;
1118 info->flags |= DF_TEXTREL;
1119 info->callbacks->minfo
1120 (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
1121 sec->owner, h->root.root.string, sec);
1123 /* Not an error, just cut short the traversal. */
1130 riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1132 struct riscv_elf_link_hash_table *htab;
1137 htab = riscv_elf_hash_table (info);
1138 BFD_ASSERT (htab != NULL);
1139 dynobj = htab->elf.dynobj;
1140 BFD_ASSERT (dynobj != NULL);
1142 if (elf_hash_table (info)->dynamic_sections_created)
1144 /* Set the contents of the .interp section to the interpreter. */
1145 if (bfd_link_executable (info) && !info->nointerp)
1147 s = bfd_get_linker_section (dynobj, ".interp");
1148 BFD_ASSERT (s != NULL);
1149 s->size = strlen (ELFNN_DYNAMIC_INTERPRETER) + 1;
1150 s->contents = (unsigned char *) ELFNN_DYNAMIC_INTERPRETER;
1154 /* Set up .got offsets for local syms, and space for local dynamic
1156 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1158 bfd_signed_vma *local_got;
1159 bfd_signed_vma *end_local_got;
1160 char *local_tls_type;
1161 bfd_size_type locsymcount;
1162 Elf_Internal_Shdr *symtab_hdr;
1165 if (! is_riscv_elf (ibfd))
1168 for (s = ibfd->sections; s != NULL; s = s->next)
1170 struct elf_dyn_relocs *p;
1172 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
1174 if (!bfd_is_abs_section (p->sec)
1175 && bfd_is_abs_section (p->sec->output_section))
1177 /* Input section has been discarded, either because
1178 it is a copy of a linkonce section or due to
1179 linker script /DISCARD/, so we'll be discarding
1182 else if (p->count != 0)
1184 srel = elf_section_data (p->sec)->sreloc;
1185 srel->size += p->count * sizeof (ElfNN_External_Rela);
1186 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1187 info->flags |= DF_TEXTREL;
1192 local_got = elf_local_got_refcounts (ibfd);
1196 symtab_hdr = &elf_symtab_hdr (ibfd);
1197 locsymcount = symtab_hdr->sh_info;
1198 end_local_got = local_got + locsymcount;
1199 local_tls_type = _bfd_riscv_elf_local_got_tls_type (ibfd);
1201 srel = htab->elf.srelgot;
1202 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1206 *local_got = s->size;
1207 s->size += RISCV_ELF_WORD_BYTES;
1208 if (*local_tls_type & GOT_TLS_GD)
1209 s->size += RISCV_ELF_WORD_BYTES;
1210 if (bfd_link_pic (info)
1211 || (*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)))
1212 srel->size += sizeof (ElfNN_External_Rela);
1215 *local_got = (bfd_vma) -1;
1219 /* Allocate global sym .plt and .got entries, and space for global
1220 sym dynamic relocs. */
1221 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
1223 if (htab->elf.sgotplt)
1225 struct elf_link_hash_entry *got;
1226 got = elf_link_hash_lookup (elf_hash_table (info),
1227 "_GLOBAL_OFFSET_TABLE_",
1228 FALSE, FALSE, FALSE);
1230 /* Don't allocate .got.plt section if there are no GOT nor PLT
1231 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
1233 || !got->ref_regular_nonweak)
1234 && (htab->elf.sgotplt->size == GOTPLT_HEADER_SIZE)
1235 && (htab->elf.splt == NULL
1236 || htab->elf.splt->size == 0)
1237 && (htab->elf.sgot == NULL
1238 || (htab->elf.sgot->size
1239 == get_elf_backend_data (output_bfd)->got_header_size)))
1240 htab->elf.sgotplt->size = 0;
1243 /* The check_relocs and adjust_dynamic_symbol entry points have
1244 determined the sizes of the various dynamic sections. Allocate
1246 for (s = dynobj->sections; s != NULL; s = s->next)
1248 if ((s->flags & SEC_LINKER_CREATED) == 0)
1251 if (s == htab->elf.splt
1252 || s == htab->elf.sgot
1253 || s == htab->elf.sgotplt
1254 || s == htab->elf.sdynbss
1255 || s == htab->elf.sdynrelro)
1257 /* Strip this section if we don't need it; see the
1260 else if (strncmp (s->name, ".rela", 5) == 0)
1264 /* We use the reloc_count field as a counter if we need
1265 to copy relocs into the output file. */
1271 /* It's not one of our sections. */
1277 /* If we don't need this section, strip it from the
1278 output file. This is mostly to handle .rela.bss and
1279 .rela.plt. We must create both sections in
1280 create_dynamic_sections, because they must be created
1281 before the linker maps input sections to output
1282 sections. The linker does that before
1283 adjust_dynamic_symbol is called, and it is that
1284 function which decides whether anything needs to go
1285 into these sections. */
1286 s->flags |= SEC_EXCLUDE;
1290 if ((s->flags & SEC_HAS_CONTENTS) == 0)
1293 /* Allocate memory for the section contents. Zero the memory
1294 for the benefit of .rela.plt, which has 4 unused entries
1295 at the beginning, and we don't want garbage. */
1296 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1297 if (s->contents == NULL)
1301 if (elf_hash_table (info)->dynamic_sections_created)
1303 /* Add some entries to the .dynamic section. We fill in the
1304 values later, in riscv_elf_finish_dynamic_sections, but we
1305 must add the entries now so that we get the correct size for
1306 the .dynamic section. The DT_DEBUG entry is filled in by the
1307 dynamic linker and used by the debugger. */
1308 #define add_dynamic_entry(TAG, VAL) \
1309 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1311 if (bfd_link_executable (info))
1313 if (!add_dynamic_entry (DT_DEBUG, 0))
1317 if (htab->elf.srelplt->size != 0)
1319 if (!add_dynamic_entry (DT_PLTGOT, 0)
1320 || !add_dynamic_entry (DT_PLTRELSZ, 0)
1321 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1322 || !add_dynamic_entry (DT_JMPREL, 0))
1326 if (!add_dynamic_entry (DT_RELA, 0)
1327 || !add_dynamic_entry (DT_RELASZ, 0)
1328 || !add_dynamic_entry (DT_RELAENT, sizeof (ElfNN_External_Rela)))
1331 /* If any dynamic relocs apply to a read-only section,
1332 then we need a DT_TEXTREL entry. */
1333 if ((info->flags & DF_TEXTREL) == 0)
1334 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
1336 if (info->flags & DF_TEXTREL)
1338 if (!add_dynamic_entry (DT_TEXTREL, 0))
1342 #undef add_dynamic_entry
1348 #define DTP_OFFSET 0x800
1350 /* Return the relocation value for a TLS dtp-relative reloc. */
1353 dtpoff (struct bfd_link_info *info, bfd_vma address)
1355 /* If tls_sec is NULL, we should have signalled an error already. */
1356 if (elf_hash_table (info)->tls_sec == NULL)
1358 return address - elf_hash_table (info)->tls_sec->vma - DTP_OFFSET;
1361 /* Return the relocation value for a static TLS tp-relative relocation. */
1364 tpoff (struct bfd_link_info *info, bfd_vma address)
1366 /* If tls_sec is NULL, we should have signalled an error already. */
1367 if (elf_hash_table (info)->tls_sec == NULL)
1369 return address - elf_hash_table (info)->tls_sec->vma - TP_OFFSET;
1372 /* Return the global pointer's value, or 0 if it is not in use. */
1375 riscv_global_pointer_value (struct bfd_link_info *info)
1377 struct bfd_link_hash_entry *h;
1379 h = bfd_link_hash_lookup (info->hash, RISCV_GP_SYMBOL, FALSE, FALSE, TRUE);
1380 if (h == NULL || h->type != bfd_link_hash_defined)
1383 return h->u.def.value + sec_addr (h->u.def.section);
1386 /* Emplace a static relocation. */
1388 static bfd_reloc_status_type
1389 perform_relocation (const reloc_howto_type *howto,
1390 const Elf_Internal_Rela *rel,
1392 asection *input_section,
1396 if (howto->pc_relative)
1397 value -= sec_addr (input_section) + rel->r_offset;
1398 value += rel->r_addend;
1400 switch (ELFNN_R_TYPE (rel->r_info))
1403 case R_RISCV_TPREL_HI20:
1404 case R_RISCV_PCREL_HI20:
1405 case R_RISCV_GOT_HI20:
1406 case R_RISCV_TLS_GOT_HI20:
1407 case R_RISCV_TLS_GD_HI20:
1408 if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)))
1409 return bfd_reloc_overflow;
1410 value = ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value));
1413 case R_RISCV_LO12_I:
1414 case R_RISCV_GPREL_I:
1415 case R_RISCV_TPREL_LO12_I:
1416 case R_RISCV_TPREL_I:
1417 case R_RISCV_PCREL_LO12_I:
1418 value = ENCODE_ITYPE_IMM (value);
1421 case R_RISCV_LO12_S:
1422 case R_RISCV_GPREL_S:
1423 case R_RISCV_TPREL_LO12_S:
1424 case R_RISCV_TPREL_S:
1425 case R_RISCV_PCREL_LO12_S:
1426 value = ENCODE_STYPE_IMM (value);
1430 case R_RISCV_CALL_PLT:
1431 if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)))
1432 return bfd_reloc_overflow;
1433 value = ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value))
1434 | (ENCODE_ITYPE_IMM (value) << 32);
1438 if (!VALID_UJTYPE_IMM (value))
1439 return bfd_reloc_overflow;
1440 value = ENCODE_UJTYPE_IMM (value);
1443 case R_RISCV_BRANCH:
1444 if (!VALID_SBTYPE_IMM (value))
1445 return bfd_reloc_overflow;
1446 value = ENCODE_SBTYPE_IMM (value);
1449 case R_RISCV_RVC_BRANCH:
1450 if (!VALID_RVC_B_IMM (value))
1451 return bfd_reloc_overflow;
1452 value = ENCODE_RVC_B_IMM (value);
1455 case R_RISCV_RVC_JUMP:
1456 if (!VALID_RVC_J_IMM (value))
1457 return bfd_reloc_overflow;
1458 value = ENCODE_RVC_J_IMM (value);
1461 case R_RISCV_RVC_LUI:
1462 if (!VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value)))
1463 return bfd_reloc_overflow;
1464 value = ENCODE_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value));
1482 case R_RISCV_32_PCREL:
1483 case R_RISCV_TLS_DTPREL32:
1484 case R_RISCV_TLS_DTPREL64:
1487 case R_RISCV_DELETE:
1488 return bfd_reloc_ok;
1491 return bfd_reloc_notsupported;
1494 bfd_vma word = bfd_get (howto->bitsize, input_bfd, contents + rel->r_offset);
1495 word = (word & ~howto->dst_mask) | (value & howto->dst_mask);
1496 bfd_put (howto->bitsize, input_bfd, word, contents + rel->r_offset);
1498 return bfd_reloc_ok;
1501 /* Remember all PC-relative high-part relocs we've encountered to help us
1502 later resolve the corresponding low-part relocs. */
1508 } riscv_pcrel_hi_reloc;
1510 typedef struct riscv_pcrel_lo_reloc
1512 asection * input_section;
1513 struct bfd_link_info * info;
1514 reloc_howto_type * howto;
1515 const Elf_Internal_Rela * reloc;
1518 bfd_byte * contents;
1519 struct riscv_pcrel_lo_reloc * next;
1520 } riscv_pcrel_lo_reloc;
1525 riscv_pcrel_lo_reloc *lo_relocs;
1526 } riscv_pcrel_relocs;
1529 riscv_pcrel_reloc_hash (const void *entry)
1531 const riscv_pcrel_hi_reloc *e = entry;
1532 return (hashval_t)(e->address >> 2);
1536 riscv_pcrel_reloc_eq (const void *entry1, const void *entry2)
1538 const riscv_pcrel_hi_reloc *e1 = entry1, *e2 = entry2;
1539 return e1->address == e2->address;
1543 riscv_init_pcrel_relocs (riscv_pcrel_relocs *p)
1546 p->lo_relocs = NULL;
1547 p->hi_relocs = htab_create (1024, riscv_pcrel_reloc_hash,
1548 riscv_pcrel_reloc_eq, free);
1549 return p->hi_relocs != NULL;
1553 riscv_free_pcrel_relocs (riscv_pcrel_relocs *p)
1555 riscv_pcrel_lo_reloc *cur = p->lo_relocs;
1559 riscv_pcrel_lo_reloc *next = cur->next;
1564 htab_delete (p->hi_relocs);
1568 riscv_zero_pcrel_hi_reloc (Elf_Internal_Rela *rel,
1569 struct bfd_link_info *info,
1573 const reloc_howto_type *howto,
1576 /* We may need to reference low addreses in PC-relative modes even when the
1577 * PC is far away from these addresses. For example, undefweak references
1578 * need to produce the address 0 when linked. As 0 is far from the arbitrary
1579 * addresses that we can link PC-relative programs at, the linker can't
1580 * actually relocate references to those symbols. In order to allow these
1581 * programs to work we simply convert the PC-relative auipc sequences to
1582 * 0-relative lui sequences. */
1583 if (bfd_link_pic (info))
1586 /* If it's possible to reference the symbol using auipc we do so, as that's
1587 * more in the spirit of the PC-relative relocations we're processing. */
1588 bfd_vma offset = addr - pc;
1589 if (ARCH_SIZE == 32 || VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (offset)))
1592 /* If it's impossible to reference this with a LUI-based offset then don't
1593 * bother to convert it at all so users still see the PC-relative relocation
1594 * in the truncation message. */
1595 if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (addr)))
1598 rel->r_info = ELFNN_R_INFO(addr, R_RISCV_HI20);
1600 bfd_vma insn = bfd_get(howto->bitsize, input_bfd, contents + rel->r_offset);
1601 insn = (insn & ~MASK_AUIPC) | MATCH_LUI;
1602 bfd_put(howto->bitsize, input_bfd, insn, contents + rel->r_offset);
1607 riscv_record_pcrel_hi_reloc (riscv_pcrel_relocs *p, bfd_vma addr,
1608 bfd_vma value, bfd_boolean absolute)
1610 bfd_vma offset = absolute ? value : value - addr;
1611 riscv_pcrel_hi_reloc entry = {addr, offset};
1612 riscv_pcrel_hi_reloc **slot =
1613 (riscv_pcrel_hi_reloc **) htab_find_slot (p->hi_relocs, &entry, INSERT);
1615 BFD_ASSERT (*slot == NULL);
1616 *slot = (riscv_pcrel_hi_reloc *) bfd_malloc (sizeof (riscv_pcrel_hi_reloc));
1624 riscv_record_pcrel_lo_reloc (riscv_pcrel_relocs *p,
1625 asection *input_section,
1626 struct bfd_link_info *info,
1627 reloc_howto_type *howto,
1628 const Elf_Internal_Rela *reloc,
1633 riscv_pcrel_lo_reloc *entry;
1634 entry = (riscv_pcrel_lo_reloc *) bfd_malloc (sizeof (riscv_pcrel_lo_reloc));
1637 *entry = (riscv_pcrel_lo_reloc) {input_section, info, howto, reloc, addr,
1638 name, contents, p->lo_relocs};
1639 p->lo_relocs = entry;
1644 riscv_resolve_pcrel_lo_relocs (riscv_pcrel_relocs *p)
1646 riscv_pcrel_lo_reloc *r;
1648 for (r = p->lo_relocs; r != NULL; r = r->next)
1650 bfd *input_bfd = r->input_section->owner;
1652 riscv_pcrel_hi_reloc search = {r->addr, 0};
1653 riscv_pcrel_hi_reloc *entry = htab_find (p->hi_relocs, &search);
1655 /* Check for overflow into bit 11 when adding reloc addend. */
1656 || (! (entry->value & 0x800)
1657 && ((entry->value + r->reloc->r_addend) & 0x800)))
1659 char *string = (entry == NULL
1660 ? "%pcrel_lo missing matching %pcrel_hi"
1661 : "%pcrel_lo overflow with an addend");
1662 (*r->info->callbacks->reloc_dangerous)
1663 (r->info, string, input_bfd, r->input_section, r->reloc->r_offset);
1667 perform_relocation (r->howto, r->reloc, entry->value, r->input_section,
1668 input_bfd, r->contents);
1674 /* Relocate a RISC-V ELF section.
1676 The RELOCATE_SECTION function is called by the new ELF backend linker
1677 to handle the relocations for a section.
1679 The relocs are always passed as Rela structures.
1681 This function is responsible for adjusting the section contents as
1682 necessary, and (if generating a relocatable output file) adjusting
1683 the reloc addend as necessary.
1685 This function does not have to worry about setting the reloc
1686 address or the reloc symbol index.
1688 LOCAL_SYMS is a pointer to the swapped in local symbols.
1690 LOCAL_SECTIONS is an array giving the section in the input file
1691 corresponding to the st_shndx field of each local symbol.
1693 The global hash table entry for the global symbols can be found
1694 via elf_sym_hashes (input_bfd).
1696 When generating relocatable output, this function must handle
1697 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
1698 going to be the section symbol corresponding to the output
1699 section, which means that the addend must be adjusted
1703 riscv_elf_relocate_section (bfd *output_bfd,
1704 struct bfd_link_info *info,
1706 asection *input_section,
1708 Elf_Internal_Rela *relocs,
1709 Elf_Internal_Sym *local_syms,
1710 asection **local_sections)
1712 Elf_Internal_Rela *rel;
1713 Elf_Internal_Rela *relend;
1714 riscv_pcrel_relocs pcrel_relocs;
1715 bfd_boolean ret = FALSE;
1716 asection *sreloc = elf_section_data (input_section)->sreloc;
1717 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
1718 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_bfd);
1719 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
1720 bfd_vma *local_got_offsets = elf_local_got_offsets (input_bfd);
1721 bfd_boolean absolute;
1723 if (!riscv_init_pcrel_relocs (&pcrel_relocs))
1726 relend = relocs + input_section->reloc_count;
1727 for (rel = relocs; rel < relend; rel++)
1729 unsigned long r_symndx;
1730 struct elf_link_hash_entry *h;
1731 Elf_Internal_Sym *sym;
1734 bfd_reloc_status_type r = bfd_reloc_ok;
1736 bfd_vma off, ie_off;
1737 bfd_boolean unresolved_reloc, is_ie = FALSE;
1738 bfd_vma pc = sec_addr (input_section) + rel->r_offset;
1739 int r_type = ELFNN_R_TYPE (rel->r_info), tls_type;
1740 reloc_howto_type *howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
1741 const char *msg = NULL;
1742 bfd_boolean resolved_to_zero;
1745 || r_type == R_RISCV_GNU_VTINHERIT || r_type == R_RISCV_GNU_VTENTRY)
1748 /* This is a final link. */
1749 r_symndx = ELFNN_R_SYM (rel->r_info);
1753 unresolved_reloc = FALSE;
1754 if (r_symndx < symtab_hdr->sh_info)
1756 sym = local_syms + r_symndx;
1757 sec = local_sections[r_symndx];
1758 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1762 bfd_boolean warned, ignored;
1764 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1765 r_symndx, symtab_hdr, sym_hashes,
1767 unresolved_reloc, warned, ignored);
1770 /* To avoid generating warning messages about truncated
1771 relocations, set the relocation's address to be the same as
1772 the start of this section. */
1773 if (input_section->output_section != NULL)
1774 relocation = input_section->output_section->vma;
1780 if (sec != NULL && discarded_section (sec))
1781 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1782 rel, 1, relend, howto, 0, contents);
1784 if (bfd_link_relocatable (info))
1788 name = h->root.root.string;
1791 name = (bfd_elf_string_from_elf_section
1792 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1793 if (name == NULL || *name == '\0')
1794 name = bfd_section_name (input_bfd, sec);
1797 resolved_to_zero = (h != NULL
1798 && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
1804 case R_RISCV_TPREL_ADD:
1806 case R_RISCV_JUMP_SLOT:
1807 case R_RISCV_RELATIVE:
1808 /* These require nothing of us at all. */
1812 case R_RISCV_BRANCH:
1813 case R_RISCV_RVC_BRANCH:
1814 case R_RISCV_RVC_LUI:
1815 case R_RISCV_LO12_I:
1816 case R_RISCV_LO12_S:
1821 case R_RISCV_32_PCREL:
1822 case R_RISCV_DELETE:
1823 /* These require no special handling beyond perform_relocation. */
1826 case R_RISCV_GOT_HI20:
1829 bfd_boolean dyn, pic;
1831 off = h->got.offset;
1832 BFD_ASSERT (off != (bfd_vma) -1);
1833 dyn = elf_hash_table (info)->dynamic_sections_created;
1834 pic = bfd_link_pic (info);
1836 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
1837 || (pic && SYMBOL_REFERENCES_LOCAL (info, h)))
1839 /* This is actually a static link, or it is a
1840 -Bsymbolic link and the symbol is defined
1841 locally, or the symbol was forced to be local
1842 because of a version file. We must initialize
1843 this entry in the global offset table. Since the
1844 offset must always be a multiple of the word size,
1845 we use the least significant bit to record whether
1846 we have initialized it already.
1848 When doing a dynamic link, we create a .rela.got
1849 relocation entry to initialize the value. This
1850 is done in the finish_dynamic_symbol routine. */
1855 bfd_put_NN (output_bfd, relocation,
1856 htab->elf.sgot->contents + off);
1861 unresolved_reloc = FALSE;
1865 BFD_ASSERT (local_got_offsets != NULL
1866 && local_got_offsets[r_symndx] != (bfd_vma) -1);
1868 off = local_got_offsets[r_symndx];
1870 /* The offset must always be a multiple of the word size.
1871 So, we can use the least significant bit to record
1872 whether we have already processed this entry. */
1877 if (bfd_link_pic (info))
1880 Elf_Internal_Rela outrel;
1882 /* We need to generate a R_RISCV_RELATIVE reloc
1883 for the dynamic linker. */
1884 s = htab->elf.srelgot;
1885 BFD_ASSERT (s != NULL);
1887 outrel.r_offset = sec_addr (htab->elf.sgot) + off;
1889 ELFNN_R_INFO (0, R_RISCV_RELATIVE);
1890 outrel.r_addend = relocation;
1892 riscv_elf_append_rela (output_bfd, s, &outrel);
1895 bfd_put_NN (output_bfd, relocation,
1896 htab->elf.sgot->contents + off);
1897 local_got_offsets[r_symndx] |= 1;
1900 relocation = sec_addr (htab->elf.sgot) + off;
1901 absolute = riscv_zero_pcrel_hi_reloc (rel,
1908 r_type = ELFNN_R_TYPE (rel->r_info);
1909 howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
1911 r = bfd_reloc_notsupported;
1912 else if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
1913 relocation, absolute))
1914 r = bfd_reloc_overflow;
1922 bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1923 contents + rel->r_offset);
1924 relocation = old_value + relocation;
1934 bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1935 contents + rel->r_offset);
1936 relocation = old_value - relocation;
1941 /* Handle a call to an undefined weak function. This won't be
1942 relaxed, so we have to handle it here. */
1943 if (h != NULL && h->root.type == bfd_link_hash_undefweak
1944 && h->plt.offset == MINUS_ONE)
1946 /* We can use x0 as the base register. */
1947 bfd_vma insn = bfd_get_32 (input_bfd,
1948 contents + rel->r_offset + 4);
1949 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1950 bfd_put_32 (input_bfd, insn, contents + rel->r_offset + 4);
1951 /* Set the relocation value so that we get 0 after the pc
1952 relative adjustment. */
1953 relocation = sec_addr (input_section) + rel->r_offset;
1957 case R_RISCV_CALL_PLT:
1959 case R_RISCV_RVC_JUMP:
1960 if (bfd_link_pic (info) && h != NULL && h->plt.offset != MINUS_ONE)
1962 /* Refer to the PLT entry. */
1963 relocation = sec_addr (htab->elf.splt) + h->plt.offset;
1964 unresolved_reloc = FALSE;
1968 case R_RISCV_TPREL_HI20:
1969 relocation = tpoff (info, relocation);
1972 case R_RISCV_TPREL_LO12_I:
1973 case R_RISCV_TPREL_LO12_S:
1974 relocation = tpoff (info, relocation);
1977 case R_RISCV_TPREL_I:
1978 case R_RISCV_TPREL_S:
1979 relocation = tpoff (info, relocation);
1980 if (VALID_ITYPE_IMM (relocation + rel->r_addend))
1982 /* We can use tp as the base register. */
1983 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
1984 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1985 insn |= X_TP << OP_SH_RS1;
1986 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
1989 r = bfd_reloc_overflow;
1992 case R_RISCV_GPREL_I:
1993 case R_RISCV_GPREL_S:
1995 bfd_vma gp = riscv_global_pointer_value (info);
1996 bfd_boolean x0_base = VALID_ITYPE_IMM (relocation + rel->r_addend);
1997 if (x0_base || VALID_ITYPE_IMM (relocation + rel->r_addend - gp))
1999 /* We can use x0 or gp as the base register. */
2000 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2001 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
2004 rel->r_addend -= gp;
2005 insn |= X_GP << OP_SH_RS1;
2007 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
2010 r = bfd_reloc_overflow;
2014 case R_RISCV_PCREL_HI20:
2015 absolute = riscv_zero_pcrel_hi_reloc (rel,
2022 r_type = ELFNN_R_TYPE (rel->r_info);
2023 howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
2025 r = bfd_reloc_notsupported;
2026 else if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2027 relocation + rel->r_addend,
2029 r = bfd_reloc_overflow;
2032 case R_RISCV_PCREL_LO12_I:
2033 case R_RISCV_PCREL_LO12_S:
2034 /* We don't allow section symbols plus addends as the auipc address,
2035 because then riscv_relax_delete_bytes would have to search through
2036 all relocs to update these addends. This is also ambiguous, as
2037 we do allow offsets to be added to the target address, which are
2038 not to be used to find the auipc address. */
2039 if ((ELF_ST_TYPE (sym->st_info) == STT_SECTION) && rel->r_addend)
2041 r = bfd_reloc_dangerous;
2045 if (riscv_record_pcrel_lo_reloc (&pcrel_relocs, input_section, info,
2046 howto, rel, relocation, name,
2049 r = bfd_reloc_overflow;
2052 case R_RISCV_TLS_DTPREL32:
2053 case R_RISCV_TLS_DTPREL64:
2054 relocation = dtpoff (info, relocation);
2059 if ((input_section->flags & SEC_ALLOC) == 0)
2062 if ((bfd_link_pic (info)
2064 || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2065 && !resolved_to_zero)
2066 || h->root.type != bfd_link_hash_undefweak)
2067 && (! howto->pc_relative
2068 || !SYMBOL_CALLS_LOCAL (info, h)))
2069 || (!bfd_link_pic (info)
2075 || h->root.type == bfd_link_hash_undefweak
2076 || h->root.type == bfd_link_hash_undefined)))
2078 Elf_Internal_Rela outrel;
2079 bfd_boolean skip_static_relocation, skip_dynamic_relocation;
2081 /* When generating a shared object, these relocations
2082 are copied into the output file to be resolved at run
2086 _bfd_elf_section_offset (output_bfd, info, input_section,
2088 skip_static_relocation = outrel.r_offset != (bfd_vma) -2;
2089 skip_dynamic_relocation = outrel.r_offset >= (bfd_vma) -2;
2090 outrel.r_offset += sec_addr (input_section);
2092 if (skip_dynamic_relocation)
2093 memset (&outrel, 0, sizeof outrel);
2094 else if (h != NULL && h->dynindx != -1
2095 && !(bfd_link_pic (info)
2096 && SYMBOLIC_BIND (info, h)
2099 outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
2100 outrel.r_addend = rel->r_addend;
2104 outrel.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2105 outrel.r_addend = relocation + rel->r_addend;
2108 riscv_elf_append_rela (output_bfd, sreloc, &outrel);
2109 if (skip_static_relocation)
2114 case R_RISCV_TLS_GOT_HI20:
2118 case R_RISCV_TLS_GD_HI20:
2121 off = h->got.offset;
2126 off = local_got_offsets[r_symndx];
2127 local_got_offsets[r_symndx] |= 1;
2130 tls_type = _bfd_riscv_elf_tls_type (input_bfd, h, r_symndx);
2131 BFD_ASSERT (tls_type & (GOT_TLS_IE | GOT_TLS_GD));
2132 /* If this symbol is referenced by both GD and IE TLS, the IE
2133 reference's GOT slot follows the GD reference's slots. */
2135 if ((tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_IE))
2136 ie_off = 2 * GOT_ENTRY_SIZE;
2142 Elf_Internal_Rela outrel;
2144 bfd_boolean need_relocs = FALSE;
2146 if (htab->elf.srelgot == NULL)
2151 bfd_boolean dyn, pic;
2152 dyn = htab->elf.dynamic_sections_created;
2153 pic = bfd_link_pic (info);
2155 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
2156 && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
2160 /* The GOT entries have not been initialized yet. Do it
2161 now, and emit any relocations. */
2162 if ((bfd_link_pic (info) || indx != 0)
2164 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2165 || h->root.type != bfd_link_hash_undefweak))
2168 if (tls_type & GOT_TLS_GD)
2172 outrel.r_offset = sec_addr (htab->elf.sgot) + off;
2173 outrel.r_addend = 0;
2174 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPMODNN);
2175 bfd_put_NN (output_bfd, 0,
2176 htab->elf.sgot->contents + off);
2177 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2180 BFD_ASSERT (! unresolved_reloc);
2181 bfd_put_NN (output_bfd,
2182 dtpoff (info, relocation),
2183 (htab->elf.sgot->contents + off +
2184 RISCV_ELF_WORD_BYTES));
2188 bfd_put_NN (output_bfd, 0,
2189 (htab->elf.sgot->contents + off +
2190 RISCV_ELF_WORD_BYTES));
2191 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPRELNN);
2192 outrel.r_offset += RISCV_ELF_WORD_BYTES;
2193 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2198 /* If we are not emitting relocations for a
2199 general dynamic reference, then we must be in a
2200 static link or an executable link with the
2201 symbol binding locally. Mark it as belonging
2202 to module 1, the executable. */
2203 bfd_put_NN (output_bfd, 1,
2204 htab->elf.sgot->contents + off);
2205 bfd_put_NN (output_bfd,
2206 dtpoff (info, relocation),
2207 (htab->elf.sgot->contents + off +
2208 RISCV_ELF_WORD_BYTES));
2212 if (tls_type & GOT_TLS_IE)
2216 bfd_put_NN (output_bfd, 0,
2217 htab->elf.sgot->contents + off + ie_off);
2218 outrel.r_offset = sec_addr (htab->elf.sgot)
2220 outrel.r_addend = 0;
2222 outrel.r_addend = tpoff (info, relocation);
2223 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_TPRELNN);
2224 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2228 bfd_put_NN (output_bfd, tpoff (info, relocation),
2229 htab->elf.sgot->contents + off + ie_off);
2234 BFD_ASSERT (off < (bfd_vma) -2);
2235 relocation = sec_addr (htab->elf.sgot) + off + (is_ie ? ie_off : 0);
2236 if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2238 r = bfd_reloc_overflow;
2239 unresolved_reloc = FALSE;
2243 r = bfd_reloc_notsupported;
2246 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2247 because such sections are not SEC_ALLOC and thus ld.so will
2248 not process them. */
2249 if (unresolved_reloc
2250 && !((input_section->flags & SEC_DEBUGGING) != 0
2252 && _bfd_elf_section_offset (output_bfd, info, input_section,
2253 rel->r_offset) != (bfd_vma) -1)
2255 (*_bfd_error_handler)
2256 (_("%pB(%pA+%#" PRIx64 "): "
2257 "unresolvable %s relocation against symbol `%s'"),
2260 (uint64_t) rel->r_offset,
2262 h->root.root.string);
2266 if (r == bfd_reloc_ok)
2267 r = perform_relocation (howto, rel, relocation, input_section,
2268 input_bfd, contents);
2275 case bfd_reloc_overflow:
2276 info->callbacks->reloc_overflow
2277 (info, (h ? &h->root : NULL), name, howto->name,
2278 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
2281 case bfd_reloc_undefined:
2282 info->callbacks->undefined_symbol
2283 (info, name, input_bfd, input_section, rel->r_offset,
2287 case bfd_reloc_outofrange:
2288 msg = _("%X%P: internal error: out of range error\n");
2291 case bfd_reloc_notsupported:
2292 msg = _("%X%P: internal error: unsupported relocation error\n");
2295 case bfd_reloc_dangerous:
2296 info->callbacks->reloc_dangerous
2297 (info, "%pcrel_lo section symbol with an addend", input_bfd,
2298 input_section, rel->r_offset);
2302 msg = _("%X%P: internal error: unknown error\n");
2307 info->callbacks->einfo (msg);
2309 /* We already reported the error via a callback, so don't try to report
2310 it again by returning false. That leads to spurious errors. */
2315 ret = riscv_resolve_pcrel_lo_relocs (&pcrel_relocs);
2317 riscv_free_pcrel_relocs (&pcrel_relocs);
2321 /* Finish up dynamic symbol handling. We set the contents of various
2322 dynamic sections here. */
2325 riscv_elf_finish_dynamic_symbol (bfd *output_bfd,
2326 struct bfd_link_info *info,
2327 struct elf_link_hash_entry *h,
2328 Elf_Internal_Sym *sym)
2330 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2331 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2333 if (h->plt.offset != (bfd_vma) -1)
2335 /* We've decided to create a PLT entry for this symbol. */
2337 bfd_vma i, header_address, plt_idx, got_address;
2338 uint32_t plt_entry[PLT_ENTRY_INSNS];
2339 Elf_Internal_Rela rela;
2341 BFD_ASSERT (h->dynindx != -1);
2343 /* Calculate the address of the PLT header. */
2344 header_address = sec_addr (htab->elf.splt);
2346 /* Calculate the index of the entry. */
2347 plt_idx = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
2349 /* Calculate the address of the .got.plt entry. */
2350 got_address = riscv_elf_got_plt_val (plt_idx, info);
2352 /* Find out where the .plt entry should go. */
2353 loc = htab->elf.splt->contents + h->plt.offset;
2355 /* Fill in the PLT entry itself. */
2356 riscv_make_plt_entry (got_address, header_address + h->plt.offset,
2358 for (i = 0; i < PLT_ENTRY_INSNS; i++)
2359 bfd_put_32 (output_bfd, plt_entry[i], loc + 4*i);
2361 /* Fill in the initial value of the .got.plt entry. */
2362 loc = htab->elf.sgotplt->contents
2363 + (got_address - sec_addr (htab->elf.sgotplt));
2364 bfd_put_NN (output_bfd, sec_addr (htab->elf.splt), loc);
2366 /* Fill in the entry in the .rela.plt section. */
2367 rela.r_offset = got_address;
2369 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_JUMP_SLOT);
2371 loc = htab->elf.srelplt->contents + plt_idx * sizeof (ElfNN_External_Rela);
2372 bed->s->swap_reloca_out (output_bfd, &rela, loc);
2374 if (!h->def_regular)
2376 /* Mark the symbol as undefined, rather than as defined in
2377 the .plt section. Leave the value alone. */
2378 sym->st_shndx = SHN_UNDEF;
2379 /* If the symbol is weak, we do need to clear the value.
2380 Otherwise, the PLT entry would provide a definition for
2381 the symbol even if the symbol wasn't defined anywhere,
2382 and so the symbol would never be NULL. */
2383 if (!h->ref_regular_nonweak)
2388 if (h->got.offset != (bfd_vma) -1
2389 && !(riscv_elf_hash_entry (h)->tls_type & (GOT_TLS_GD | GOT_TLS_IE))
2390 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
2394 Elf_Internal_Rela rela;
2396 /* This symbol has an entry in the GOT. Set it up. */
2398 sgot = htab->elf.sgot;
2399 srela = htab->elf.srelgot;
2400 BFD_ASSERT (sgot != NULL && srela != NULL);
2402 rela.r_offset = sec_addr (sgot) + (h->got.offset &~ (bfd_vma) 1);
2404 /* If this is a local symbol reference, we just want to emit a RELATIVE
2405 reloc. This can happen if it is a -Bsymbolic link, or a pie link, or
2406 the symbol was forced to be local because of a version file.
2407 The entry in the global offset table will already have been
2408 initialized in the relocate_section function. */
2409 if (bfd_link_pic (info)
2410 && SYMBOL_REFERENCES_LOCAL (info, h))
2412 BFD_ASSERT((h->got.offset & 1) != 0);
2413 asection *sec = h->root.u.def.section;
2414 rela.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2415 rela.r_addend = (h->root.u.def.value
2416 + sec->output_section->vma
2417 + sec->output_offset);
2421 BFD_ASSERT((h->got.offset & 1) == 0);
2422 BFD_ASSERT (h->dynindx != -1);
2423 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_NN);
2427 bfd_put_NN (output_bfd, 0,
2428 sgot->contents + (h->got.offset & ~(bfd_vma) 1));
2429 riscv_elf_append_rela (output_bfd, srela, &rela);
2434 Elf_Internal_Rela rela;
2437 /* This symbols needs a copy reloc. Set it up. */
2438 BFD_ASSERT (h->dynindx != -1);
2440 rela.r_offset = sec_addr (h->root.u.def.section) + h->root.u.def.value;
2441 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_COPY);
2443 if (h->root.u.def.section == htab->elf.sdynrelro)
2444 s = htab->elf.sreldynrelro;
2446 s = htab->elf.srelbss;
2447 riscv_elf_append_rela (output_bfd, s, &rela);
2450 /* Mark some specially defined symbols as absolute. */
2451 if (h == htab->elf.hdynamic
2452 || (h == htab->elf.hgot || h == htab->elf.hplt))
2453 sym->st_shndx = SHN_ABS;
2458 /* Finish up the dynamic sections. */
2461 riscv_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
2462 bfd *dynobj, asection *sdyn)
2464 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2465 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2466 size_t dynsize = bed->s->sizeof_dyn;
2467 bfd_byte *dyncon, *dynconend;
2469 dynconend = sdyn->contents + sdyn->size;
2470 for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
2472 Elf_Internal_Dyn dyn;
2475 bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
2480 s = htab->elf.sgotplt;
2481 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2484 s = htab->elf.srelplt;
2485 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2488 s = htab->elf.srelplt;
2489 dyn.d_un.d_val = s->size;
2495 bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
2501 riscv_elf_finish_dynamic_sections (bfd *output_bfd,
2502 struct bfd_link_info *info)
2506 struct riscv_elf_link_hash_table *htab;
2508 htab = riscv_elf_hash_table (info);
2509 BFD_ASSERT (htab != NULL);
2510 dynobj = htab->elf.dynobj;
2512 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
2514 if (elf_hash_table (info)->dynamic_sections_created)
2519 splt = htab->elf.splt;
2520 BFD_ASSERT (splt != NULL && sdyn != NULL);
2522 ret = riscv_finish_dyn (output_bfd, info, dynobj, sdyn);
2527 /* Fill in the head and tail entries in the procedure linkage table. */
2531 uint32_t plt_header[PLT_HEADER_INSNS];
2532 riscv_make_plt_header (sec_addr (htab->elf.sgotplt),
2533 sec_addr (splt), plt_header);
2535 for (i = 0; i < PLT_HEADER_INSNS; i++)
2536 bfd_put_32 (output_bfd, plt_header[i], splt->contents + 4*i);
2538 elf_section_data (splt->output_section)->this_hdr.sh_entsize
2543 if (htab->elf.sgotplt)
2545 asection *output_section = htab->elf.sgotplt->output_section;
2547 if (bfd_is_abs_section (output_section))
2549 (*_bfd_error_handler)
2550 (_("discarded output section: `%pA'"), htab->elf.sgotplt);
2554 if (htab->elf.sgotplt->size > 0)
2556 /* Write the first two entries in .got.plt, needed for the dynamic
2558 bfd_put_NN (output_bfd, (bfd_vma) -1, htab->elf.sgotplt->contents);
2559 bfd_put_NN (output_bfd, (bfd_vma) 0,
2560 htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
2563 elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2568 asection *output_section = htab->elf.sgot->output_section;
2570 if (htab->elf.sgot->size > 0)
2572 /* Set the first entry in the global offset table to the address of
2573 the dynamic section. */
2574 bfd_vma val = sdyn ? sec_addr (sdyn) : 0;
2575 bfd_put_NN (output_bfd, val, htab->elf.sgot->contents);
2578 elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2584 /* Return address for Ith PLT stub in section PLT, for relocation REL
2585 or (bfd_vma) -1 if it should not be included. */
2588 riscv_elf_plt_sym_val (bfd_vma i, const asection *plt,
2589 const arelent *rel ATTRIBUTE_UNUSED)
2591 return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
2594 static enum elf_reloc_type_class
2595 riscv_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2596 const asection *rel_sec ATTRIBUTE_UNUSED,
2597 const Elf_Internal_Rela *rela)
2599 switch (ELFNN_R_TYPE (rela->r_info))
2601 case R_RISCV_RELATIVE:
2602 return reloc_class_relative;
2603 case R_RISCV_JUMP_SLOT:
2604 return reloc_class_plt;
2606 return reloc_class_copy;
2608 return reloc_class_normal;
2612 /* Merge backend specific data from an object file to the output
2613 object file when linking. */
2616 _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2618 bfd *obfd = info->output_bfd;
2619 flagword new_flags = elf_elfheader (ibfd)->e_flags;
2620 flagword old_flags = elf_elfheader (obfd)->e_flags;
2622 if (!is_riscv_elf (ibfd) || !is_riscv_elf (obfd))
2625 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
2627 (*_bfd_error_handler)
2628 (_("%pB: ABI is incompatible with that of the selected emulation:\n"
2629 " target emulation `%s' does not match `%s'"),
2630 ibfd, bfd_get_target (ibfd), bfd_get_target (obfd));
2634 if (!_bfd_elf_merge_object_attributes (ibfd, info))
2637 if (! elf_flags_init (obfd))
2639 elf_flags_init (obfd) = TRUE;
2640 elf_elfheader (obfd)->e_flags = new_flags;
2644 /* Disallow linking different float ABIs. */
2645 if ((old_flags ^ new_flags) & EF_RISCV_FLOAT_ABI)
2647 (*_bfd_error_handler)
2648 (_("%pB: can't link hard-float modules with soft-float modules"), ibfd);
2652 /* Disallow linking RVE and non-RVE. */
2653 if ((old_flags ^ new_flags) & EF_RISCV_RVE)
2655 (*_bfd_error_handler)
2656 (_("%pB: can't link RVE with other target"), ibfd);
2660 /* Allow linking RVC and non-RVC, and keep the RVC flag. */
2661 elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC;
2666 bfd_set_error (bfd_error_bad_value);
2670 /* Delete some bytes from a section while relaxing. */
2673 riscv_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, size_t count,
2674 struct bfd_link_info *link_info)
2676 unsigned int i, symcount;
2677 bfd_vma toaddr = sec->size;
2678 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
2679 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2680 unsigned int sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2681 struct bfd_elf_section_data *data = elf_section_data (sec);
2682 bfd_byte *contents = data->this_hdr.contents;
2684 /* Actually delete the bytes. */
2686 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
2688 /* Adjust the location of all of the relocs. Note that we need not
2689 adjust the addends, since all PC-relative references must be against
2690 symbols, which we will adjust below. */
2691 for (i = 0; i < sec->reloc_count; i++)
2692 if (data->relocs[i].r_offset > addr && data->relocs[i].r_offset < toaddr)
2693 data->relocs[i].r_offset -= count;
2695 /* Adjust the local symbols defined in this section. */
2696 for (i = 0; i < symtab_hdr->sh_info; i++)
2698 Elf_Internal_Sym *sym = (Elf_Internal_Sym *) symtab_hdr->contents + i;
2699 if (sym->st_shndx == sec_shndx)
2701 /* If the symbol is in the range of memory we just moved, we
2702 have to adjust its value. */
2703 if (sym->st_value > addr && sym->st_value <= toaddr)
2704 sym->st_value -= count;
2706 /* If the symbol *spans* the bytes we just deleted (i.e. its
2707 *end* is in the moved bytes but its *start* isn't), then we
2708 must adjust its size.
2710 This test needs to use the original value of st_value, otherwise
2711 we might accidentally decrease size when deleting bytes right
2712 before the symbol. But since deleted relocs can't span across
2713 symbols, we can't have both a st_value and a st_size decrease,
2714 so it is simpler to just use an else. */
2715 else if (sym->st_value <= addr
2716 && sym->st_value + sym->st_size > addr
2717 && sym->st_value + sym->st_size <= toaddr)
2718 sym->st_size -= count;
2722 /* Now adjust the global symbols defined in this section. */
2723 symcount = ((symtab_hdr->sh_size / sizeof (ElfNN_External_Sym))
2724 - symtab_hdr->sh_info);
2726 for (i = 0; i < symcount; i++)
2728 struct elf_link_hash_entry *sym_hash = sym_hashes[i];
2730 /* The '--wrap SYMBOL' option is causing a pain when the object file,
2731 containing the definition of __wrap_SYMBOL, includes a direct
2732 call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
2733 the same symbol (which is __wrap_SYMBOL), but still exist as two
2734 different symbols in 'sym_hashes', we don't want to adjust
2735 the global symbol __wrap_SYMBOL twice. */
2736 /* The same problem occurs with symbols that are versioned_hidden, as
2737 foo becomes an alias for foo@BAR, and hence they need the same
2739 if (link_info->wrap_hash != NULL
2740 || sym_hash->versioned == versioned_hidden)
2742 struct elf_link_hash_entry **cur_sym_hashes;
2744 /* Loop only over the symbols which have already been checked. */
2745 for (cur_sym_hashes = sym_hashes; cur_sym_hashes < &sym_hashes[i];
2748 /* If the current symbol is identical to 'sym_hash', that means
2749 the symbol was already adjusted (or at least checked). */
2750 if (*cur_sym_hashes == sym_hash)
2753 /* Don't adjust the symbol again. */
2754 if (cur_sym_hashes < &sym_hashes[i])
2758 if ((sym_hash->root.type == bfd_link_hash_defined
2759 || sym_hash->root.type == bfd_link_hash_defweak)
2760 && sym_hash->root.u.def.section == sec)
2762 /* As above, adjust the value if needed. */
2763 if (sym_hash->root.u.def.value > addr
2764 && sym_hash->root.u.def.value <= toaddr)
2765 sym_hash->root.u.def.value -= count;
2767 /* As above, adjust the size if needed. */
2768 else if (sym_hash->root.u.def.value <= addr
2769 && sym_hash->root.u.def.value + sym_hash->size > addr
2770 && sym_hash->root.u.def.value + sym_hash->size <= toaddr)
2771 sym_hash->size -= count;
2778 /* A second format for recording PC-relative hi relocations. This stores the
2779 information required to relax them to GP-relative addresses. */
2781 typedef struct riscv_pcgp_hi_reloc riscv_pcgp_hi_reloc;
2782 struct riscv_pcgp_hi_reloc
2789 riscv_pcgp_hi_reloc *next;
2792 typedef struct riscv_pcgp_lo_reloc riscv_pcgp_lo_reloc;
2793 struct riscv_pcgp_lo_reloc
2796 riscv_pcgp_lo_reloc *next;
2801 riscv_pcgp_hi_reloc *hi;
2802 riscv_pcgp_lo_reloc *lo;
2803 } riscv_pcgp_relocs;
2806 riscv_init_pcgp_relocs (riscv_pcgp_relocs *p)
2814 riscv_free_pcgp_relocs (riscv_pcgp_relocs *p,
2815 bfd *abfd ATTRIBUTE_UNUSED,
2816 asection *sec ATTRIBUTE_UNUSED)
2818 riscv_pcgp_hi_reloc *c;
2819 riscv_pcgp_lo_reloc *l;
2821 for (c = p->hi; c != NULL;)
2823 riscv_pcgp_hi_reloc *next = c->next;
2828 for (l = p->lo; l != NULL;)
2830 riscv_pcgp_lo_reloc *next = l->next;
2837 riscv_record_pcgp_hi_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off,
2838 bfd_vma hi_addend, bfd_vma hi_addr,
2839 unsigned hi_sym, asection *sym_sec)
2841 riscv_pcgp_hi_reloc *new = bfd_malloc (sizeof(*new));
2844 new->hi_sec_off = hi_sec_off;
2845 new->hi_addend = hi_addend;
2846 new->hi_addr = hi_addr;
2847 new->hi_sym = hi_sym;
2848 new->sym_sec = sym_sec;
2854 static riscv_pcgp_hi_reloc *
2855 riscv_find_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2857 riscv_pcgp_hi_reloc *c;
2859 for (c = p->hi; c != NULL; c = c->next)
2860 if (c->hi_sec_off == hi_sec_off)
2866 riscv_delete_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2868 bfd_boolean out = FALSE;
2869 riscv_pcgp_hi_reloc *c;
2871 for (c = p->hi; c != NULL; c = c->next)
2872 if (c->hi_sec_off == hi_sec_off)
2879 riscv_use_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2881 bfd_boolean out = FALSE;
2882 riscv_pcgp_hi_reloc *c;
2884 for (c = p->hi; c != NULL; c = c->next)
2885 if (c->hi_sec_off == hi_sec_off)
2892 riscv_record_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2894 riscv_pcgp_lo_reloc *new = bfd_malloc (sizeof(*new));
2897 new->hi_sec_off = hi_sec_off;
2904 riscv_find_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2906 riscv_pcgp_lo_reloc *c;
2908 for (c = p->lo; c != NULL; c = c->next)
2909 if (c->hi_sec_off == hi_sec_off)
2915 riscv_delete_pcgp_lo_reloc (riscv_pcgp_relocs *p ATTRIBUTE_UNUSED,
2916 bfd_vma lo_sec_off ATTRIBUTE_UNUSED,
2917 size_t bytes ATTRIBUTE_UNUSED)
2922 typedef bfd_boolean (*relax_func_t) (bfd *, asection *, asection *,
2923 struct bfd_link_info *,
2924 Elf_Internal_Rela *,
2925 bfd_vma, bfd_vma, bfd_vma, bfd_boolean *,
2926 riscv_pcgp_relocs *);
2928 /* Relax AUIPC + JALR into JAL. */
2931 _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec,
2932 struct bfd_link_info *link_info,
2933 Elf_Internal_Rela *rel,
2935 bfd_vma max_alignment,
2936 bfd_vma reserve_size ATTRIBUTE_UNUSED,
2938 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
2940 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2941 bfd_signed_vma foff = symval - (sec_addr (sec) + rel->r_offset);
2942 bfd_boolean near_zero = (symval + RISCV_IMM_REACH/2) < RISCV_IMM_REACH;
2943 bfd_vma auipc, jalr;
2944 int rd, r_type, len = 4, rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
2946 /* If the call crosses section boundaries, an alignment directive could
2947 cause the PC-relative offset to later increase. */
2948 if (VALID_UJTYPE_IMM (foff) && sym_sec->output_section != sec->output_section)
2949 foff += (foff < 0 ? -max_alignment : max_alignment);
2951 /* See if this function call can be shortened. */
2952 if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero))
2955 /* Shorten the function call. */
2956 BFD_ASSERT (rel->r_offset + 8 <= sec->size);
2958 auipc = bfd_get_32 (abfd, contents + rel->r_offset);
2959 jalr = bfd_get_32 (abfd, contents + rel->r_offset + 4);
2960 rd = (jalr >> OP_SH_RD) & OP_MASK_RD;
2961 rvc = rvc && VALID_RVC_J_IMM (foff) && ARCH_SIZE == 32;
2963 if (rvc && (rd == 0 || rd == X_RA))
2965 /* Relax to C.J[AL] rd, addr. */
2966 r_type = R_RISCV_RVC_JUMP;
2967 auipc = rd == 0 ? MATCH_C_J : MATCH_C_JAL;
2970 else if (VALID_UJTYPE_IMM (foff))
2972 /* Relax to JAL rd, addr. */
2973 r_type = R_RISCV_JAL;
2974 auipc = MATCH_JAL | (rd << OP_SH_RD);
2976 else /* near_zero */
2978 /* Relax to JALR rd, x0, addr. */
2979 r_type = R_RISCV_LO12_I;
2980 auipc = MATCH_JALR | (rd << OP_SH_RD);
2983 /* Replace the R_RISCV_CALL reloc. */
2984 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), r_type);
2985 /* Replace the AUIPC. */
2986 bfd_put (8 * len, abfd, auipc, contents + rel->r_offset);
2988 /* Delete unnecessary JALR. */
2990 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + len, 8 - len,
2994 /* Traverse all output sections and return the max alignment. */
2997 _bfd_riscv_get_max_alignment (asection *sec)
2999 unsigned int max_alignment_power = 0;
3002 for (o = sec->output_section->owner->sections; o != NULL; o = o->next)
3004 if (o->alignment_power > max_alignment_power)
3005 max_alignment_power = o->alignment_power;
3008 return (bfd_vma) 1 << max_alignment_power;
3011 /* Relax non-PIC global variable references. */
3014 _bfd_riscv_relax_lui (bfd *abfd,
3017 struct bfd_link_info *link_info,
3018 Elf_Internal_Rela *rel,
3020 bfd_vma max_alignment,
3021 bfd_vma reserve_size,
3023 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
3025 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
3026 bfd_vma gp = riscv_global_pointer_value (link_info);
3027 int use_rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
3029 /* Mergeable symbols and code might later move out of range. */
3030 if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
3033 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3037 /* If gp and the symbol are in the same output section, then
3038 consider only that section's alignment. */
3039 struct bfd_link_hash_entry *h =
3040 bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE,
3042 if (h->u.def.section->output_section == sym_sec->output_section)
3043 max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
3046 /* Is the reference in range of x0 or gp?
3047 Valid gp range conservatively because of alignment issue. */
3048 if (VALID_ITYPE_IMM (symval)
3050 && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
3052 && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
3054 unsigned sym = ELFNN_R_SYM (rel->r_info);
3055 switch (ELFNN_R_TYPE (rel->r_info))
3057 case R_RISCV_LO12_I:
3058 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
3061 case R_RISCV_LO12_S:
3062 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
3066 /* We can delete the unnecessary LUI and reloc. */
3067 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3069 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4,
3077 /* Can we relax LUI to C.LUI? Alignment might move the section forward;
3078 account for this assuming page alignment at worst. */
3080 && ELFNN_R_TYPE (rel->r_info) == R_RISCV_HI20
3081 && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval))
3082 && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval + ELF_MAXPAGESIZE)))
3084 /* Replace LUI with C.LUI if legal (i.e., rd != x0 and rd != x2/sp). */
3085 bfd_vma lui = bfd_get_32 (abfd, contents + rel->r_offset);
3086 unsigned rd = ((unsigned)lui >> OP_SH_RD) & OP_MASK_RD;
3087 if (rd == 0 || rd == X_SP)
3090 lui = (lui & (OP_MASK_RD << OP_SH_RD)) | MATCH_C_LUI;
3091 bfd_put_32 (abfd, lui, contents + rel->r_offset);
3093 /* Replace the R_RISCV_HI20 reloc. */
3094 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_RVC_LUI);
3097 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + 2, 2,
3104 /* Relax non-PIC TLS references. */
3107 _bfd_riscv_relax_tls_le (bfd *abfd,
3109 asection *sym_sec ATTRIBUTE_UNUSED,
3110 struct bfd_link_info *link_info,
3111 Elf_Internal_Rela *rel,
3113 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3114 bfd_vma reserve_size ATTRIBUTE_UNUSED,
3116 riscv_pcgp_relocs *prcel_relocs ATTRIBUTE_UNUSED)
3118 /* See if this symbol is in range of tp. */
3119 if (RISCV_CONST_HIGH_PART (tpoff (link_info, symval)) != 0)
3122 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3123 switch (ELFNN_R_TYPE (rel->r_info))
3125 case R_RISCV_TPREL_LO12_I:
3126 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_I);
3129 case R_RISCV_TPREL_LO12_S:
3130 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_S);
3133 case R_RISCV_TPREL_HI20:
3134 case R_RISCV_TPREL_ADD:
3135 /* We can delete the unnecessary instruction and reloc. */
3136 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3138 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4, link_info);
3145 /* Implement R_RISCV_ALIGN by deleting excess alignment NOPs. */
3148 _bfd_riscv_relax_align (bfd *abfd, asection *sec,
3150 struct bfd_link_info *link_info,
3151 Elf_Internal_Rela *rel,
3153 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3154 bfd_vma reserve_size ATTRIBUTE_UNUSED,
3155 bfd_boolean *again ATTRIBUTE_UNUSED,
3156 riscv_pcgp_relocs *pcrel_relocs ATTRIBUTE_UNUSED)
3158 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
3159 bfd_vma alignment = 1, pos;
3160 while (alignment <= rel->r_addend)
3163 symval -= rel->r_addend;
3164 bfd_vma aligned_addr = ((symval - 1) & ~(alignment - 1)) + alignment;
3165 bfd_vma nop_bytes = aligned_addr - symval;
3167 /* Once we've handled an R_RISCV_ALIGN, we can't relax anything else. */
3168 sec->sec_flg0 = TRUE;
3170 /* Make sure there are enough NOPs to actually achieve the alignment. */
3171 if (rel->r_addend < nop_bytes)
3174 (_("%pB(%pA+%#" PRIx64 "): %" PRId64 " bytes required for alignment "
3175 "to %" PRId64 "-byte boundary, but only %" PRId64 " present"),
3176 abfd, sym_sec, (uint64_t) rel->r_offset,
3177 (int64_t) nop_bytes, (int64_t) alignment, (int64_t) rel->r_addend);
3178 bfd_set_error (bfd_error_bad_value);
3182 /* Delete the reloc. */
3183 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3185 /* If the number of NOPs is already correct, there's nothing to do. */
3186 if (nop_bytes == rel->r_addend)
3189 /* Write as many RISC-V NOPs as we need. */
3190 for (pos = 0; pos < (nop_bytes & -4); pos += 4)
3191 bfd_put_32 (abfd, RISCV_NOP, contents + rel->r_offset + pos);
3193 /* Write a final RVC NOP if need be. */
3194 if (nop_bytes % 4 != 0)
3195 bfd_put_16 (abfd, RVC_NOP, contents + rel->r_offset + pos);
3197 /* Delete the excess bytes. */
3198 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + nop_bytes,
3199 rel->r_addend - nop_bytes, link_info);
3202 /* Relax PC-relative references to GP-relative references. */
3205 _bfd_riscv_relax_pc (bfd *abfd,
3208 struct bfd_link_info *link_info,
3209 Elf_Internal_Rela *rel,
3211 bfd_vma max_alignment,
3212 bfd_vma reserve_size,
3213 bfd_boolean *again ATTRIBUTE_UNUSED,
3214 riscv_pcgp_relocs *pcgp_relocs)
3216 bfd_vma gp = riscv_global_pointer_value (link_info);
3218 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3220 /* Chain the _LO relocs to their cooresponding _HI reloc to compute the
3221 * actual target address. */
3222 riscv_pcgp_hi_reloc hi_reloc;
3223 memset (&hi_reloc, 0, sizeof (hi_reloc));
3224 switch (ELFNN_R_TYPE (rel->r_info))
3226 case R_RISCV_PCREL_LO12_I:
3227 case R_RISCV_PCREL_LO12_S:
3229 /* If the %lo has an addend, it isn't for the label pointing at the
3230 hi part instruction, but rather for the symbol pointed at by the
3231 hi part instruction. So we must subtract it here for the lookup.
3232 It is still used below in the final symbol address. */
3233 bfd_vma hi_sec_off = symval - sec_addr (sym_sec) - rel->r_addend;
3234 riscv_pcgp_hi_reloc *hi = riscv_find_pcgp_hi_reloc (pcgp_relocs,
3238 riscv_record_pcgp_lo_reloc (pcgp_relocs, hi_sec_off);
3243 symval = hi_reloc.hi_addr;
3244 sym_sec = hi_reloc.sym_sec;
3245 if (!riscv_use_pcgp_hi_reloc(pcgp_relocs, hi->hi_sec_off))
3247 (_("%pB(%pA+%#" PRIx64 "): Unable to clear RISCV_PCREL_HI20 reloc "
3248 "for corresponding RISCV_PCREL_LO12 reloc"),
3249 abfd, sec, (uint64_t) rel->r_offset);
3253 case R_RISCV_PCREL_HI20:
3254 /* Mergeable symbols and code might later move out of range. */
3255 if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
3258 /* If the cooresponding lo relocation has already been seen then it's not
3259 * safe to relax this relocation. */
3260 if (riscv_find_pcgp_lo_reloc (pcgp_relocs, rel->r_offset))
3271 /* If gp and the symbol are in the same output section, then
3272 consider only that section's alignment. */
3273 struct bfd_link_hash_entry *h =
3274 bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE, TRUE);
3275 if (h->u.def.section->output_section == sym_sec->output_section)
3276 max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
3279 /* Is the reference in range of x0 or gp?
3280 Valid gp range conservatively because of alignment issue. */
3281 if (VALID_ITYPE_IMM (symval)
3283 && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
3285 && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
3287 unsigned sym = hi_reloc.hi_sym;
3288 switch (ELFNN_R_TYPE (rel->r_info))
3290 case R_RISCV_PCREL_LO12_I:
3291 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
3292 rel->r_addend += hi_reloc.hi_addend;
3293 return riscv_delete_pcgp_lo_reloc (pcgp_relocs, rel->r_offset, 4);
3295 case R_RISCV_PCREL_LO12_S:
3296 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
3297 rel->r_addend += hi_reloc.hi_addend;
3298 return riscv_delete_pcgp_lo_reloc (pcgp_relocs, rel->r_offset, 4);
3300 case R_RISCV_PCREL_HI20:
3301 riscv_record_pcgp_hi_reloc (pcgp_relocs,
3305 ELFNN_R_SYM(rel->r_info),
3307 /* We can delete the unnecessary AUIPC and reloc. */
3308 rel->r_info = ELFNN_R_INFO (0, R_RISCV_DELETE);
3310 return riscv_delete_pcgp_hi_reloc (pcgp_relocs, rel->r_offset);
3320 /* Relax PC-relative references to GP-relative references. */
3323 _bfd_riscv_relax_delete (bfd *abfd,
3325 asection *sym_sec ATTRIBUTE_UNUSED,
3326 struct bfd_link_info *link_info,
3327 Elf_Internal_Rela *rel,
3328 bfd_vma symval ATTRIBUTE_UNUSED,
3329 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3330 bfd_vma reserve_size ATTRIBUTE_UNUSED,
3331 bfd_boolean *again ATTRIBUTE_UNUSED,
3332 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
3334 if (!riscv_relax_delete_bytes(abfd, sec, rel->r_offset, rel->r_addend,
3337 rel->r_info = ELFNN_R_INFO(0, R_RISCV_NONE);
3341 /* Relax a section. Pass 0 shortens code sequences unless disabled. Pass 1
3342 deletes the bytes that pass 0 made obselete. Pass 2, which cannot be
3343 disabled, handles code alignment directives. */
3346 _bfd_riscv_relax_section (bfd *abfd, asection *sec,
3347 struct bfd_link_info *info,
3350 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
3351 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
3352 struct bfd_elf_section_data *data = elf_section_data (sec);
3353 Elf_Internal_Rela *relocs;
3354 bfd_boolean ret = FALSE;
3356 bfd_vma max_alignment, reserve_size = 0;
3357 riscv_pcgp_relocs pcgp_relocs;
3361 if (bfd_link_relocatable (info)
3363 || (sec->flags & SEC_RELOC) == 0
3364 || sec->reloc_count == 0
3365 || (info->disable_target_specific_optimizations
3366 && info->relax_pass == 0))
3369 riscv_init_pcgp_relocs (&pcgp_relocs);
3371 /* Read this BFD's relocs if we haven't done so already. */
3373 relocs = data->relocs;
3374 else if (!(relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
3375 info->keep_memory)))
3380 max_alignment = htab->max_alignment;
3381 if (max_alignment == (bfd_vma) -1)
3383 max_alignment = _bfd_riscv_get_max_alignment (sec);
3384 htab->max_alignment = max_alignment;
3388 max_alignment = _bfd_riscv_get_max_alignment (sec);
3390 /* Examine and consider relaxing each reloc. */
3391 for (i = 0; i < sec->reloc_count; i++)
3394 Elf_Internal_Rela *rel = relocs + i;
3395 relax_func_t relax_func;
3396 int type = ELFNN_R_TYPE (rel->r_info);
3400 if (info->relax_pass == 0)
3402 if (type == R_RISCV_CALL || type == R_RISCV_CALL_PLT)
3403 relax_func = _bfd_riscv_relax_call;
3404 else if (type == R_RISCV_HI20
3405 || type == R_RISCV_LO12_I
3406 || type == R_RISCV_LO12_S)
3407 relax_func = _bfd_riscv_relax_lui;
3408 else if (!bfd_link_pic(info)
3409 && (type == R_RISCV_PCREL_HI20
3410 || type == R_RISCV_PCREL_LO12_I
3411 || type == R_RISCV_PCREL_LO12_S))
3412 relax_func = _bfd_riscv_relax_pc;
3413 else if (type == R_RISCV_TPREL_HI20
3414 || type == R_RISCV_TPREL_ADD
3415 || type == R_RISCV_TPREL_LO12_I
3416 || type == R_RISCV_TPREL_LO12_S)
3417 relax_func = _bfd_riscv_relax_tls_le;
3421 /* Only relax this reloc if it is paired with R_RISCV_RELAX. */
3422 if (i == sec->reloc_count - 1
3423 || ELFNN_R_TYPE ((rel + 1)->r_info) != R_RISCV_RELAX
3424 || rel->r_offset != (rel + 1)->r_offset)
3427 /* Skip over the R_RISCV_RELAX. */
3430 else if (info->relax_pass == 1 && type == R_RISCV_DELETE)
3431 relax_func = _bfd_riscv_relax_delete;
3432 else if (info->relax_pass == 2 && type == R_RISCV_ALIGN)
3433 relax_func = _bfd_riscv_relax_align;
3437 data->relocs = relocs;
3439 /* Read this BFD's contents if we haven't done so already. */
3440 if (!data->this_hdr.contents
3441 && !bfd_malloc_and_get_section (abfd, sec, &data->this_hdr.contents))
3444 /* Read this BFD's symbols if we haven't done so already. */
3445 if (symtab_hdr->sh_info != 0
3446 && !symtab_hdr->contents
3447 && !(symtab_hdr->contents =
3448 (unsigned char *) bfd_elf_get_elf_syms (abfd, symtab_hdr,
3449 symtab_hdr->sh_info,
3450 0, NULL, NULL, NULL)))
3453 /* Get the value of the symbol referred to by the reloc. */
3454 if (ELFNN_R_SYM (rel->r_info) < symtab_hdr->sh_info)
3456 /* A local symbol. */
3457 Elf_Internal_Sym *isym = ((Elf_Internal_Sym *) symtab_hdr->contents
3458 + ELFNN_R_SYM (rel->r_info));
3459 reserve_size = (isym->st_size - rel->r_addend) > isym->st_size
3460 ? 0 : isym->st_size - rel->r_addend;
3462 if (isym->st_shndx == SHN_UNDEF)
3463 sym_sec = sec, symval = sec_addr (sec) + rel->r_offset;
3466 BFD_ASSERT (isym->st_shndx < elf_numsections (abfd));
3467 sym_sec = elf_elfsections (abfd)[isym->st_shndx]->bfd_section;
3469 /* The purpose of this code is unknown. It breaks linker scripts
3470 for embedded development that place sections at address zero.
3471 This code is believed to be unnecessary. Disabling it but not
3472 yet removing it, in case something breaks. */
3473 if (sec_addr (sym_sec) == 0)
3476 symval = sec_addr (sym_sec) + isym->st_value;
3482 struct elf_link_hash_entry *h;
3484 indx = ELFNN_R_SYM (rel->r_info) - symtab_hdr->sh_info;
3485 h = elf_sym_hashes (abfd)[indx];
3487 while (h->root.type == bfd_link_hash_indirect
3488 || h->root.type == bfd_link_hash_warning)
3489 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3491 if (h->plt.offset != MINUS_ONE)
3492 symval = sec_addr (htab->elf.splt) + h->plt.offset;
3493 else if (h->root.u.def.section->output_section == NULL
3494 || (h->root.type != bfd_link_hash_defined
3495 && h->root.type != bfd_link_hash_defweak))
3498 symval = sec_addr (h->root.u.def.section) + h->root.u.def.value;
3500 if (h->type != STT_FUNC)
3502 (h->size - rel->r_addend) > h->size ? 0 : h->size - rel->r_addend;
3503 sym_sec = h->root.u.def.section;
3506 symval += rel->r_addend;
3508 if (!relax_func (abfd, sec, sym_sec, info, rel, symval,
3509 max_alignment, reserve_size, again,
3517 if (relocs != data->relocs)
3519 riscv_free_pcgp_relocs(&pcgp_relocs, abfd, sec);
3525 # define PRSTATUS_SIZE 0 /* FIXME */
3526 # define PRSTATUS_OFFSET_PR_CURSIG 12
3527 # define PRSTATUS_OFFSET_PR_PID 24
3528 # define PRSTATUS_OFFSET_PR_REG 72
3529 # define ELF_GREGSET_T_SIZE 128
3530 # define PRPSINFO_SIZE 128
3531 # define PRPSINFO_OFFSET_PR_PID 16
3532 # define PRPSINFO_OFFSET_PR_FNAME 32
3533 # define PRPSINFO_OFFSET_PR_PSARGS 48
3535 # define PRSTATUS_SIZE 376
3536 # define PRSTATUS_OFFSET_PR_CURSIG 12
3537 # define PRSTATUS_OFFSET_PR_PID 32
3538 # define PRSTATUS_OFFSET_PR_REG 112
3539 # define ELF_GREGSET_T_SIZE 256
3540 # define PRPSINFO_SIZE 136
3541 # define PRPSINFO_OFFSET_PR_PID 24
3542 # define PRPSINFO_OFFSET_PR_FNAME 40
3543 # define PRPSINFO_OFFSET_PR_PSARGS 56
3546 /* Support for core dump NOTE sections. */
3549 riscv_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3551 switch (note->descsz)
3556 case PRSTATUS_SIZE: /* sizeof(struct elf_prstatus) on Linux/RISC-V. */
3558 elf_tdata (abfd)->core->signal
3559 = bfd_get_16 (abfd, note->descdata + PRSTATUS_OFFSET_PR_CURSIG);
3562 elf_tdata (abfd)->core->lwpid
3563 = bfd_get_32 (abfd, note->descdata + PRSTATUS_OFFSET_PR_PID);
3567 /* Make a ".reg/999" section. */
3568 return _bfd_elfcore_make_pseudosection (abfd, ".reg", ELF_GREGSET_T_SIZE,
3569 note->descpos + PRSTATUS_OFFSET_PR_REG);
3573 riscv_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3575 switch (note->descsz)
3580 case PRPSINFO_SIZE: /* sizeof(struct elf_prpsinfo) on Linux/RISC-V. */
3582 elf_tdata (abfd)->core->pid
3583 = bfd_get_32 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PID);
3586 elf_tdata (abfd)->core->program = _bfd_elfcore_strndup
3587 (abfd, note->descdata + PRPSINFO_OFFSET_PR_FNAME, 16);
3590 elf_tdata (abfd)->core->command = _bfd_elfcore_strndup
3591 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PSARGS, 80);
3595 /* Note that for some reason, a spurious space is tacked
3596 onto the end of the args in some (at least one anyway)
3597 implementations, so strip it off if it exists. */
3600 char *command = elf_tdata (abfd)->core->command;
3601 int n = strlen (command);
3603 if (0 < n && command[n - 1] == ' ')
3604 command[n - 1] = '\0';
3610 /* Set the right mach type. */
3612 riscv_elf_object_p (bfd *abfd)
3614 /* There are only two mach types in RISCV currently. */
3615 if (strcmp (abfd->xvec->name, "elf32-littleriscv") == 0)
3616 bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv32);
3618 bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv64);
3624 #define TARGET_LITTLE_SYM riscv_elfNN_vec
3625 #define TARGET_LITTLE_NAME "elfNN-littleriscv"
3627 #define elf_backend_reloc_type_class riscv_reloc_type_class
3629 #define bfd_elfNN_bfd_reloc_name_lookup riscv_reloc_name_lookup
3630 #define bfd_elfNN_bfd_link_hash_table_create riscv_elf_link_hash_table_create
3631 #define bfd_elfNN_bfd_reloc_type_lookup riscv_reloc_type_lookup
3632 #define bfd_elfNN_bfd_merge_private_bfd_data \
3633 _bfd_riscv_elf_merge_private_bfd_data
3635 #define elf_backend_copy_indirect_symbol riscv_elf_copy_indirect_symbol
3636 #define elf_backend_create_dynamic_sections riscv_elf_create_dynamic_sections
3637 #define elf_backend_check_relocs riscv_elf_check_relocs
3638 #define elf_backend_adjust_dynamic_symbol riscv_elf_adjust_dynamic_symbol
3639 #define elf_backend_size_dynamic_sections riscv_elf_size_dynamic_sections
3640 #define elf_backend_relocate_section riscv_elf_relocate_section
3641 #define elf_backend_finish_dynamic_symbol riscv_elf_finish_dynamic_symbol
3642 #define elf_backend_finish_dynamic_sections riscv_elf_finish_dynamic_sections
3643 #define elf_backend_gc_mark_hook riscv_elf_gc_mark_hook
3644 #define elf_backend_plt_sym_val riscv_elf_plt_sym_val
3645 #define elf_backend_grok_prstatus riscv_elf_grok_prstatus
3646 #define elf_backend_grok_psinfo riscv_elf_grok_psinfo
3647 #define elf_backend_object_p riscv_elf_object_p
3648 #define elf_info_to_howto_rel NULL
3649 #define elf_info_to_howto riscv_info_to_howto_rela
3650 #define bfd_elfNN_bfd_relax_section _bfd_riscv_relax_section
3652 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
3654 #define elf_backend_can_gc_sections 1
3655 #define elf_backend_can_refcount 1
3656 #define elf_backend_want_got_plt 1
3657 #define elf_backend_plt_readonly 1
3658 #define elf_backend_plt_alignment 4
3659 #define elf_backend_want_plt_sym 1
3660 #define elf_backend_got_header_size (ARCH_SIZE / 8)
3661 #define elf_backend_want_dynrelro 1
3662 #define elf_backend_rela_normal 1
3663 #define elf_backend_default_execstack 0
3665 #include "elfNN-target.h"