(Ada) Fix resolving of homonym components in tagged types
[binutils-gdb.git] / bfd / elfnn-riscv.c
blob4be3eceda88ac33e7f384f50e90ce15394bad947
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. */
25 #include "sysdep.h"
26 #include "bfd.h"
27 #include "libbfd.h"
28 #include "bfdlink.h"
29 #include "genlink.h"
30 #include "elf-bfd.h"
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)
38 #define ARCH_SIZE NN
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
47 section. */
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;
67 #define GOT_UNKNOWN 0
68 #define GOT_NORMAL 1
69 #define GOT_TLS_GD 2
70 #define GOT_TLS_IE 4
71 #define GOT_TLS_LE 8
72 char tls_type;
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. */
109 asection *sdyntdata;
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)
124 static bfd_boolean
125 riscv_info_to_howto_rela (bfd *abfd,
126 arelent *cache_ptr,
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;
133 static void
134 riscv_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
136 const struct elf_backend_data *bed;
137 bfd_byte *loc;
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);
144 /* PLT/GOT stuff. */
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)
157 static bfd_vma
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);
164 #if ARCH_SIZE == 32
165 # define MATCH_LREG MATCH_LW
166 #else
167 # define MATCH_LREG MATCH_LD
168 #endif
170 /* Generate a PLT header. */
172 static void
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
185 jr t3 */
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. */
199 static void
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)
204 jalr t1, t3
205 nop */
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
220 subclass. */
221 if (entry == NULL)
223 entry =
224 bfd_hash_allocate (table,
225 sizeof (struct riscv_elf_link_hash_entry));
226 if (entry == NULL)
227 return entry;
230 /* Call the allocation method of the superclass. */
231 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
232 if (entry != NULL)
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;
241 return entry;
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);
253 if (ret == NULL)
254 return NULL;
256 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
257 sizeof (struct riscv_elf_link_hash_entry),
258 RISCV_ELF_DATA))
260 free (ret);
261 return NULL;
264 ret->max_alignment = (bfd_vma) -1;
265 return &ret->elf.root;
268 /* Create the .got section. */
270 static bfd_boolean
271 riscv_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
273 flagword flags;
274 asection *s, *s_got;
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)
281 return TRUE;
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
289 | SEC_READONLY));
290 if (s == NULL
291 || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
292 return FALSE;
293 htab->srelgot = s;
295 s = s_got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
296 if (s == NULL
297 || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
298 return FALSE;
299 htab->sgot = s;
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);
307 if (s == NULL
308 || !bfd_set_section_alignment (abfd, s,
309 bed->s->log_file_align))
310 return FALSE;
311 htab->sgotplt = s;
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
322 table. */
323 h = _bfd_elf_define_linkage_sym (abfd, info, s_got,
324 "_GLOBAL_OFFSET_TABLE_");
325 elf_hash_table (info)->hgot = h;
326 if (h == NULL)
327 return FALSE;
330 return TRUE;
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
335 hash table. */
337 static bfd_boolean
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))
347 return FALSE;
349 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
350 return FALSE;
352 if (!bfd_link_pic (info))
354 htab->sdyntdata =
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)))
362 abort ();
364 return TRUE;
367 /* Copy the extra info we tack onto an elf_link_hash_entry. */
369 static void
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;
397 *pp = p->next;
398 break;
400 if (q == NULL)
401 pp = &p->next;
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);
419 static bfd_boolean
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>");
431 return FALSE;
433 return TRUE;
436 static bfd_boolean
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))
446 return FALSE;
449 if (h != NULL)
451 h->got.refcount += 1;
452 return TRUE;
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)))
460 return FALSE;
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;
466 return TRUE;
469 static bfd_boolean
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);
480 return FALSE;
482 /* Look through the relocs for a section during the first phase, and
483 allocate space in the global offset table or procedure linkage
484 table. */
486 static bfd_boolean
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))
497 return TRUE;
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++)
508 unsigned int r_type;
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"),
518 abfd, r_symndx);
519 return FALSE;
522 if (r_symndx < symtab_hdr->sh_info)
523 h = NULL;
524 else
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;
532 switch (r_type)
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))
537 return FALSE;
538 break;
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))
545 return FALSE;
546 break;
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))
551 return FALSE;
552 break;
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. */
561 if (h != NULL)
563 h->needs_plt = 1;
564 h->plt.refcount += 1;
566 break;
568 case R_RISCV_CALL:
569 case R_RISCV_JAL:
570 case R_RISCV_BRANCH:
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))
576 break;
577 goto static_reloc;
579 case R_RISCV_TPREL_HI20:
580 if (!bfd_link_executable (info))
581 return bad_static_reloc (abfd, r_type, h);
582 if (h != NULL)
583 riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
584 goto static_reloc;
586 case R_RISCV_HI20:
587 if (bfd_link_pic (info))
588 return bad_static_reloc (abfd, r_type, h);
589 /* Fall through. */
591 case R_RISCV_COPY:
592 case R_RISCV_JUMP_SLOT:
593 case R_RISCV_RELATIVE:
594 case R_RISCV_64:
595 case R_RISCV_32:
596 /* Fall through. */
598 static_reloc:
599 /* This reloc might not bind locally. */
600 if (h != NULL)
601 h->non_got_ref = 1;
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
625 symbol local.
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
630 symbol. */
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)
636 || (h != NULL
637 && (! info->symbolic
638 || h->root.type == bfd_link_hash_defweak
639 || !h->def_regular))))
640 || (!bfd_link_pic (info)
641 && (sec->flags & SEC_ALLOC) != 0
642 && h != NULL
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. */
652 if (sreloc == NULL)
654 sreloc = _bfd_elf_make_dynamic_reloc_section
655 (sec, htab->elf.dynobj, RISCV_ELF_LOG_WORD_BYTES,
656 abfd, /*rela?*/ TRUE);
658 if (sreloc == NULL)
659 return FALSE;
662 /* If this is a global symbol, we count the number of
663 relocations we need for this symbol. */
664 if (h != NULL)
665 head = &((struct riscv_elf_link_hash_entry *) h)->dyn_relocs;
666 else
668 /* Track dynamic relocs needed for local syms too.
669 We really need local syms available to do this
670 easily. Oh well. */
672 asection *s;
673 void *vpp;
674 Elf_Internal_Sym *isym;
676 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
677 abfd, r_symndx);
678 if (isym == NULL)
679 return FALSE;
681 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
682 if (s == NULL)
683 s = sec;
685 vpp = &elf_section_data (s)->local_dynrel;
686 head = (struct elf_dyn_relocs **) vpp;
689 p = *head;
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));
695 if (p == NULL)
696 return FALSE;
697 p->next = *head;
698 *head = p;
699 p->sec = sec;
700 p->count = 0;
701 p->pc_count = 0;
704 p->count += 1;
705 p->pc_count += r == NULL ? 0 : r->pc_relative;
708 break;
710 case R_RISCV_GNU_VTINHERIT:
711 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
712 return FALSE;
713 break;
715 case R_RISCV_GNU_VTENTRY:
716 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
717 return FALSE;
718 break;
720 default:
721 break;
725 return TRUE;
728 static asection *
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)
735 if (h != NULL)
736 switch (ELFNN_R_TYPE (rel->r_info))
738 case R_RISCV_GNU_VTINHERIT:
739 case R_RISCV_GNU_VTENTRY:
740 return NULL;
743 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
746 /* Find dynamic relocs for H that apply to read-only sections. */
748 static asection *
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)
758 return p->sec;
760 return NULL;
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
767 understand. */
769 static bfd_boolean
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;
775 bfd *dynobj;
776 asection *s, *srel;
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
785 && (h->needs_plt
786 || h->type == STT_GNU_IFUNC
787 || h->is_weakalias
788 || (h->def_dynamic
789 && h->ref_regular
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;
807 h->needs_plt = 0;
810 return TRUE;
812 else
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. */
818 if (h->is_weakalias)
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;
824 return TRUE;
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))
835 return TRUE;
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. */
839 if (!h->non_got_ref)
840 return TRUE;
842 /* If -z nocopyreloc was given, we won't generate them either. */
843 if (info->nocopyreloc)
845 h->non_got_ref = 0;
846 return TRUE;
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))
853 h->non_got_ref = 0;
854 return TRUE;
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)
874 s = htab->sdyntdata;
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;
882 else
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);
890 h->needs_copy = 1;
893 return _bfd_elf_adjust_dynamic_copy (info, h, s);
896 /* Allocate space in .plt, .got and associated reloc sections for
897 dynamic relocs. */
899 static bfd_boolean
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)
908 return TRUE;
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. */
919 if (h->dynindx == -1
920 && !h->forced_local)
922 if (! bfd_elf_link_record_dynamic_symbol (info, h))
923 return FALSE;
926 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
928 asection *s = htab->elf.splt;
930 if (s->size == 0)
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)
950 && !h->def_regular)
952 h->root.u.def.section = s;
953 h->root.u.def.value = h->plt.offset;
956 else
958 h->plt.offset = (bfd_vma) -1;
959 h->needs_plt = 0;
962 else
964 h->plt.offset = (bfd_vma) -1;
965 h->needs_plt = 0;
968 if (h->got.refcount > 0)
970 asection *s;
971 bfd_boolean dyn;
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. */
976 if (h->dynindx == -1
977 && !h->forced_local)
979 if (! bfd_elf_link_record_dynamic_symbol (info, h))
980 return FALSE;
983 s = htab->elf.sgot;
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);
1002 else
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);
1010 else
1011 h->got.offset = (bfd_vma) -1;
1013 eh = (struct riscv_elf_link_hash_entry *) h;
1014 if (eh->dyn_relocs == NULL)
1015 return TRUE;
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;
1032 p->pc_count = 0;
1033 if (p->count == 0)
1034 *pp = p->next;
1035 else
1036 pp = &p->next;
1040 /* Also discard relocs on undefined weak syms with non-default
1041 visibility. */
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
1050 symbol in PIEs. */
1051 else if (h->dynindx == -1
1052 && !h->forced_local)
1054 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1055 return FALSE;
1059 else
1061 /* For the non-shared case, discard space for relocs against
1062 symbols which turn out to need copy relocs or are not
1063 dynamic. */
1065 if (!h->non_got_ref
1066 && ((h->def_dynamic
1067 && !h->def_regular)
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))
1078 return FALSE;
1081 /* If that succeeded, we know we'll be keeping all the
1082 relocs. */
1083 if (h->dynindx != -1)
1084 goto keep;
1087 eh->dyn_relocs = NULL;
1089 keep: ;
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);
1099 return TRUE;
1102 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
1103 read-only sections. */
1105 static bfd_boolean
1106 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
1108 asection *sec;
1110 if (h->root.type == bfd_link_hash_indirect)
1111 return TRUE;
1113 sec = readonly_dynrelocs (h);
1114 if (sec != NULL)
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. */
1124 return FALSE;
1126 return TRUE;
1129 static bfd_boolean
1130 riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1132 struct riscv_elf_link_hash_table *htab;
1133 bfd *dynobj;
1134 asection *s;
1135 bfd *ibfd;
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
1155 relocs. */
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;
1163 asection *srel;
1165 if (! is_riscv_elf (ibfd))
1166 continue;
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
1180 the relocs too. */
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);
1193 if (!local_got)
1194 continue;
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);
1200 s = htab->elf.sgot;
1201 srel = htab->elf.srelgot;
1202 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1204 if (*local_got > 0)
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);
1214 else
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_. */
1232 if ((got == NULL
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
1245 memory for them. */
1246 for (s = dynobj->sections; s != NULL; s = s->next)
1248 if ((s->flags & SEC_LINKER_CREATED) == 0)
1249 continue;
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
1258 comment below. */
1260 else if (strncmp (s->name, ".rela", 5) == 0)
1262 if (s->size != 0)
1264 /* We use the reloc_count field as a counter if we need
1265 to copy relocs into the output file. */
1266 s->reloc_count = 0;
1269 else
1271 /* It's not one of our sections. */
1272 continue;
1275 if (s->size == 0)
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;
1287 continue;
1290 if ((s->flags & SEC_HAS_CONTENTS) == 0)
1291 continue;
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)
1298 return FALSE;
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))
1314 return FALSE;
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))
1323 return FALSE;
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)))
1329 return FALSE;
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))
1339 return FALSE;
1342 #undef add_dynamic_entry
1344 return TRUE;
1347 #define TP_OFFSET 0
1348 #define DTP_OFFSET 0x800
1350 /* Return the relocation value for a TLS dtp-relative reloc. */
1352 static bfd_vma
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)
1357 return 0;
1358 return address - elf_hash_table (info)->tls_sec->vma - DTP_OFFSET;
1361 /* Return the relocation value for a static TLS tp-relative relocation. */
1363 static bfd_vma
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)
1368 return 0;
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. */
1374 static bfd_vma
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)
1381 return 0;
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,
1391 bfd_vma value,
1392 asection *input_section,
1393 bfd *input_bfd,
1394 bfd_byte *contents)
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))
1402 case R_RISCV_HI20:
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));
1411 break;
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);
1419 break;
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);
1427 break;
1429 case R_RISCV_CALL:
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);
1435 break;
1437 case R_RISCV_JAL:
1438 if (!VALID_UJTYPE_IMM (value))
1439 return bfd_reloc_overflow;
1440 value = ENCODE_UJTYPE_IMM (value);
1441 break;
1443 case R_RISCV_BRANCH:
1444 if (!VALID_SBTYPE_IMM (value))
1445 return bfd_reloc_overflow;
1446 value = ENCODE_SBTYPE_IMM (value);
1447 break;
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);
1453 break;
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);
1459 break;
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));
1465 break;
1467 case R_RISCV_32:
1468 case R_RISCV_64:
1469 case R_RISCV_ADD8:
1470 case R_RISCV_ADD16:
1471 case R_RISCV_ADD32:
1472 case R_RISCV_ADD64:
1473 case R_RISCV_SUB6:
1474 case R_RISCV_SUB8:
1475 case R_RISCV_SUB16:
1476 case R_RISCV_SUB32:
1477 case R_RISCV_SUB64:
1478 case R_RISCV_SET6:
1479 case R_RISCV_SET8:
1480 case R_RISCV_SET16:
1481 case R_RISCV_SET32:
1482 case R_RISCV_32_PCREL:
1483 case R_RISCV_TLS_DTPREL32:
1484 case R_RISCV_TLS_DTPREL64:
1485 break;
1487 case R_RISCV_DELETE:
1488 return bfd_reloc_ok;
1490 default:
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. */
1504 typedef struct
1506 bfd_vma address;
1507 bfd_vma value;
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;
1516 bfd_vma addr;
1517 const char * name;
1518 bfd_byte * contents;
1519 struct riscv_pcrel_lo_reloc * next;
1520 } riscv_pcrel_lo_reloc;
1522 typedef struct
1524 htab_t hi_relocs;
1525 riscv_pcrel_lo_reloc *lo_relocs;
1526 } riscv_pcrel_relocs;
1528 static hashval_t
1529 riscv_pcrel_reloc_hash (const void *entry)
1531 const riscv_pcrel_hi_reloc *e = entry;
1532 return (hashval_t)(e->address >> 2);
1535 static bfd_boolean
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;
1542 static bfd_boolean
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;
1552 static void
1553 riscv_free_pcrel_relocs (riscv_pcrel_relocs *p)
1555 riscv_pcrel_lo_reloc *cur = p->lo_relocs;
1557 while (cur != NULL)
1559 riscv_pcrel_lo_reloc *next = cur->next;
1560 free (cur);
1561 cur = next;
1564 htab_delete (p->hi_relocs);
1567 static bfd_boolean
1568 riscv_zero_pcrel_hi_reloc (Elf_Internal_Rela *rel,
1569 struct bfd_link_info *info,
1570 bfd_vma pc,
1571 bfd_vma addr,
1572 bfd_byte *contents,
1573 const reloc_howto_type *howto,
1574 bfd *input_bfd)
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))
1584 return FALSE;
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)))
1590 return FALSE;
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)))
1596 return FALSE;
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);
1603 return TRUE;
1606 static bfd_boolean
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));
1617 if (*slot == NULL)
1618 return FALSE;
1619 **slot = entry;
1620 return TRUE;
1623 static bfd_boolean
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,
1629 bfd_vma addr,
1630 const char *name,
1631 bfd_byte *contents)
1633 riscv_pcrel_lo_reloc *entry;
1634 entry = (riscv_pcrel_lo_reloc *) bfd_malloc (sizeof (riscv_pcrel_lo_reloc));
1635 if (entry == NULL)
1636 return FALSE;
1637 *entry = (riscv_pcrel_lo_reloc) {input_section, info, howto, reloc, addr,
1638 name, contents, p->lo_relocs};
1639 p->lo_relocs = entry;
1640 return TRUE;
1643 static bfd_boolean
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);
1654 if (entry == NULL)
1656 ((*r->info->callbacks->reloc_overflow)
1657 (r->info, NULL, r->name, r->howto->name, (bfd_vma) 0,
1658 input_bfd, r->input_section, r->reloc->r_offset));
1659 return TRUE;
1662 perform_relocation (r->howto, r->reloc, entry->value, r->input_section,
1663 input_bfd, r->contents);
1666 return TRUE;
1669 /* Relocate a RISC-V ELF section.
1671 The RELOCATE_SECTION function is called by the new ELF backend linker
1672 to handle the relocations for a section.
1674 The relocs are always passed as Rela structures.
1676 This function is responsible for adjusting the section contents as
1677 necessary, and (if generating a relocatable output file) adjusting
1678 the reloc addend as necessary.
1680 This function does not have to worry about setting the reloc
1681 address or the reloc symbol index.
1683 LOCAL_SYMS is a pointer to the swapped in local symbols.
1685 LOCAL_SECTIONS is an array giving the section in the input file
1686 corresponding to the st_shndx field of each local symbol.
1688 The global hash table entry for the global symbols can be found
1689 via elf_sym_hashes (input_bfd).
1691 When generating relocatable output, this function must handle
1692 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
1693 going to be the section symbol corresponding to the output
1694 section, which means that the addend must be adjusted
1695 accordingly. */
1697 static bfd_boolean
1698 riscv_elf_relocate_section (bfd *output_bfd,
1699 struct bfd_link_info *info,
1700 bfd *input_bfd,
1701 asection *input_section,
1702 bfd_byte *contents,
1703 Elf_Internal_Rela *relocs,
1704 Elf_Internal_Sym *local_syms,
1705 asection **local_sections)
1707 Elf_Internal_Rela *rel;
1708 Elf_Internal_Rela *relend;
1709 riscv_pcrel_relocs pcrel_relocs;
1710 bfd_boolean ret = FALSE;
1711 asection *sreloc = elf_section_data (input_section)->sreloc;
1712 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
1713 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_bfd);
1714 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
1715 bfd_vma *local_got_offsets = elf_local_got_offsets (input_bfd);
1716 bfd_boolean absolute;
1718 if (!riscv_init_pcrel_relocs (&pcrel_relocs))
1719 return FALSE;
1721 relend = relocs + input_section->reloc_count;
1722 for (rel = relocs; rel < relend; rel++)
1724 unsigned long r_symndx;
1725 struct elf_link_hash_entry *h;
1726 Elf_Internal_Sym *sym;
1727 asection *sec;
1728 bfd_vma relocation;
1729 bfd_reloc_status_type r = bfd_reloc_ok;
1730 const char *name;
1731 bfd_vma off, ie_off;
1732 bfd_boolean unresolved_reloc, is_ie = FALSE;
1733 bfd_vma pc = sec_addr (input_section) + rel->r_offset;
1734 int r_type = ELFNN_R_TYPE (rel->r_info), tls_type;
1735 reloc_howto_type *howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
1736 const char *msg = NULL;
1737 bfd_boolean resolved_to_zero;
1739 if (howto == NULL
1740 || r_type == R_RISCV_GNU_VTINHERIT || r_type == R_RISCV_GNU_VTENTRY)
1741 continue;
1743 /* This is a final link. */
1744 r_symndx = ELFNN_R_SYM (rel->r_info);
1745 h = NULL;
1746 sym = NULL;
1747 sec = NULL;
1748 unresolved_reloc = FALSE;
1749 if (r_symndx < symtab_hdr->sh_info)
1751 sym = local_syms + r_symndx;
1752 sec = local_sections[r_symndx];
1753 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1755 else
1757 bfd_boolean warned, ignored;
1759 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1760 r_symndx, symtab_hdr, sym_hashes,
1761 h, sec, relocation,
1762 unresolved_reloc, warned, ignored);
1763 if (warned)
1765 /* To avoid generating warning messages about truncated
1766 relocations, set the relocation's address to be the same as
1767 the start of this section. */
1768 if (input_section->output_section != NULL)
1769 relocation = input_section->output_section->vma;
1770 else
1771 relocation = 0;
1775 if (sec != NULL && discarded_section (sec))
1776 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1777 rel, 1, relend, howto, 0, contents);
1779 if (bfd_link_relocatable (info))
1780 continue;
1782 if (h != NULL)
1783 name = h->root.root.string;
1784 else
1786 name = (bfd_elf_string_from_elf_section
1787 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1788 if (name == NULL || *name == '\0')
1789 name = bfd_section_name (input_bfd, sec);
1792 resolved_to_zero = (h != NULL
1793 && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
1795 switch (r_type)
1797 case R_RISCV_NONE:
1798 case R_RISCV_RELAX:
1799 case R_RISCV_TPREL_ADD:
1800 case R_RISCV_COPY:
1801 case R_RISCV_JUMP_SLOT:
1802 case R_RISCV_RELATIVE:
1803 /* These require nothing of us at all. */
1804 continue;
1806 case R_RISCV_HI20:
1807 case R_RISCV_BRANCH:
1808 case R_RISCV_RVC_BRANCH:
1809 case R_RISCV_RVC_LUI:
1810 case R_RISCV_LO12_I:
1811 case R_RISCV_LO12_S:
1812 case R_RISCV_SET6:
1813 case R_RISCV_SET8:
1814 case R_RISCV_SET16:
1815 case R_RISCV_SET32:
1816 case R_RISCV_32_PCREL:
1817 case R_RISCV_DELETE:
1818 /* These require no special handling beyond perform_relocation. */
1819 break;
1821 case R_RISCV_GOT_HI20:
1822 if (h != NULL)
1824 bfd_boolean dyn, pic;
1826 off = h->got.offset;
1827 BFD_ASSERT (off != (bfd_vma) -1);
1828 dyn = elf_hash_table (info)->dynamic_sections_created;
1829 pic = bfd_link_pic (info);
1831 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
1832 || (pic && SYMBOL_REFERENCES_LOCAL (info, h)))
1834 /* This is actually a static link, or it is a
1835 -Bsymbolic link and the symbol is defined
1836 locally, or the symbol was forced to be local
1837 because of a version file. We must initialize
1838 this entry in the global offset table. Since the
1839 offset must always be a multiple of the word size,
1840 we use the least significant bit to record whether
1841 we have initialized it already.
1843 When doing a dynamic link, we create a .rela.got
1844 relocation entry to initialize the value. This
1845 is done in the finish_dynamic_symbol routine. */
1846 if ((off & 1) != 0)
1847 off &= ~1;
1848 else
1850 bfd_put_NN (output_bfd, relocation,
1851 htab->elf.sgot->contents + off);
1852 h->got.offset |= 1;
1855 else
1856 unresolved_reloc = FALSE;
1858 else
1860 BFD_ASSERT (local_got_offsets != NULL
1861 && local_got_offsets[r_symndx] != (bfd_vma) -1);
1863 off = local_got_offsets[r_symndx];
1865 /* The offset must always be a multiple of the word size.
1866 So, we can use the least significant bit to record
1867 whether we have already processed this entry. */
1868 if ((off & 1) != 0)
1869 off &= ~1;
1870 else
1872 if (bfd_link_pic (info))
1874 asection *s;
1875 Elf_Internal_Rela outrel;
1877 /* We need to generate a R_RISCV_RELATIVE reloc
1878 for the dynamic linker. */
1879 s = htab->elf.srelgot;
1880 BFD_ASSERT (s != NULL);
1882 outrel.r_offset = sec_addr (htab->elf.sgot) + off;
1883 outrel.r_info =
1884 ELFNN_R_INFO (0, R_RISCV_RELATIVE);
1885 outrel.r_addend = relocation;
1886 relocation = 0;
1887 riscv_elf_append_rela (output_bfd, s, &outrel);
1890 bfd_put_NN (output_bfd, relocation,
1891 htab->elf.sgot->contents + off);
1892 local_got_offsets[r_symndx] |= 1;
1895 relocation = sec_addr (htab->elf.sgot) + off;
1896 absolute = riscv_zero_pcrel_hi_reloc (rel,
1897 info,
1899 relocation,
1900 contents,
1901 howto,
1902 input_bfd);
1903 r_type = ELFNN_R_TYPE (rel->r_info);
1904 howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
1905 if (howto == NULL)
1906 r = bfd_reloc_notsupported;
1907 else if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
1908 relocation, absolute))
1909 r = bfd_reloc_overflow;
1910 break;
1912 case R_RISCV_ADD8:
1913 case R_RISCV_ADD16:
1914 case R_RISCV_ADD32:
1915 case R_RISCV_ADD64:
1917 bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1918 contents + rel->r_offset);
1919 relocation = old_value + relocation;
1921 break;
1923 case R_RISCV_SUB6:
1924 case R_RISCV_SUB8:
1925 case R_RISCV_SUB16:
1926 case R_RISCV_SUB32:
1927 case R_RISCV_SUB64:
1929 bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1930 contents + rel->r_offset);
1931 relocation = old_value - relocation;
1933 break;
1935 case R_RISCV_CALL:
1936 /* Handle a call to an undefined weak function. This won't be
1937 relaxed, so we have to handle it here. */
1938 if (h != NULL && h->root.type == bfd_link_hash_undefweak
1939 && h->plt.offset == MINUS_ONE)
1941 /* We can use x0 as the base register. */
1942 bfd_vma insn = bfd_get_32 (input_bfd,
1943 contents + rel->r_offset + 4);
1944 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1945 bfd_put_32 (input_bfd, insn, contents + rel->r_offset + 4);
1946 /* Set the relocation value so that we get 0 after the pc
1947 relative adjustment. */
1948 relocation = sec_addr (input_section) + rel->r_offset;
1950 /* Fall through. */
1952 case R_RISCV_CALL_PLT:
1953 case R_RISCV_JAL:
1954 case R_RISCV_RVC_JUMP:
1955 if (bfd_link_pic (info) && h != NULL && h->plt.offset != MINUS_ONE)
1957 /* Refer to the PLT entry. */
1958 relocation = sec_addr (htab->elf.splt) + h->plt.offset;
1959 unresolved_reloc = FALSE;
1961 break;
1963 case R_RISCV_TPREL_HI20:
1964 relocation = tpoff (info, relocation);
1965 break;
1967 case R_RISCV_TPREL_LO12_I:
1968 case R_RISCV_TPREL_LO12_S:
1969 relocation = tpoff (info, relocation);
1970 break;
1972 case R_RISCV_TPREL_I:
1973 case R_RISCV_TPREL_S:
1974 relocation = tpoff (info, relocation);
1975 if (VALID_ITYPE_IMM (relocation + rel->r_addend))
1977 /* We can use tp as the base register. */
1978 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
1979 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1980 insn |= X_TP << OP_SH_RS1;
1981 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
1983 else
1984 r = bfd_reloc_overflow;
1985 break;
1987 case R_RISCV_GPREL_I:
1988 case R_RISCV_GPREL_S:
1990 bfd_vma gp = riscv_global_pointer_value (info);
1991 bfd_boolean x0_base = VALID_ITYPE_IMM (relocation + rel->r_addend);
1992 if (x0_base || VALID_ITYPE_IMM (relocation + rel->r_addend - gp))
1994 /* We can use x0 or gp as the base register. */
1995 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
1996 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1997 if (!x0_base)
1999 rel->r_addend -= gp;
2000 insn |= X_GP << OP_SH_RS1;
2002 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
2004 else
2005 r = bfd_reloc_overflow;
2006 break;
2009 case R_RISCV_PCREL_HI20:
2010 absolute = riscv_zero_pcrel_hi_reloc (rel,
2011 info,
2013 relocation,
2014 contents,
2015 howto,
2016 input_bfd);
2017 r_type = ELFNN_R_TYPE (rel->r_info);
2018 howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
2019 if (howto == NULL)
2020 r = bfd_reloc_notsupported;
2021 else if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2022 relocation + rel->r_addend,
2023 absolute))
2024 r = bfd_reloc_overflow;
2025 break;
2027 case R_RISCV_PCREL_LO12_I:
2028 case R_RISCV_PCREL_LO12_S:
2029 /* Addends are not allowed, because then riscv_relax_delete_bytes
2030 would have to search through all relocs to update the addends.
2031 Also, riscv_resolve_pcrel_lo_relocs does not support addends
2032 when searching for a matching hi reloc. */
2033 if (rel->r_addend)
2035 r = bfd_reloc_dangerous;
2036 break;
2039 if (riscv_record_pcrel_lo_reloc (&pcrel_relocs, input_section, info,
2040 howto, rel, relocation, name,
2041 contents))
2042 continue;
2043 r = bfd_reloc_overflow;
2044 break;
2046 case R_RISCV_TLS_DTPREL32:
2047 case R_RISCV_TLS_DTPREL64:
2048 relocation = dtpoff (info, relocation);
2049 break;
2051 case R_RISCV_32:
2052 case R_RISCV_64:
2053 if ((input_section->flags & SEC_ALLOC) == 0)
2054 break;
2056 if ((bfd_link_pic (info)
2057 && (h == NULL
2058 || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2059 && !resolved_to_zero)
2060 || h->root.type != bfd_link_hash_undefweak)
2061 && (! howto->pc_relative
2062 || !SYMBOL_CALLS_LOCAL (info, h)))
2063 || (!bfd_link_pic (info)
2064 && h != NULL
2065 && h->dynindx != -1
2066 && !h->non_got_ref
2067 && ((h->def_dynamic
2068 && !h->def_regular)
2069 || h->root.type == bfd_link_hash_undefweak
2070 || h->root.type == bfd_link_hash_undefined)))
2072 Elf_Internal_Rela outrel;
2073 bfd_boolean skip_static_relocation, skip_dynamic_relocation;
2075 /* When generating a shared object, these relocations
2076 are copied into the output file to be resolved at run
2077 time. */
2079 outrel.r_offset =
2080 _bfd_elf_section_offset (output_bfd, info, input_section,
2081 rel->r_offset);
2082 skip_static_relocation = outrel.r_offset != (bfd_vma) -2;
2083 skip_dynamic_relocation = outrel.r_offset >= (bfd_vma) -2;
2084 outrel.r_offset += sec_addr (input_section);
2086 if (skip_dynamic_relocation)
2087 memset (&outrel, 0, sizeof outrel);
2088 else if (h != NULL && h->dynindx != -1
2089 && !(bfd_link_pic (info)
2090 && SYMBOLIC_BIND (info, h)
2091 && h->def_regular))
2093 outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
2094 outrel.r_addend = rel->r_addend;
2096 else
2098 outrel.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2099 outrel.r_addend = relocation + rel->r_addend;
2102 riscv_elf_append_rela (output_bfd, sreloc, &outrel);
2103 if (skip_static_relocation)
2104 continue;
2106 break;
2108 case R_RISCV_TLS_GOT_HI20:
2109 is_ie = TRUE;
2110 /* Fall through. */
2112 case R_RISCV_TLS_GD_HI20:
2113 if (h != NULL)
2115 off = h->got.offset;
2116 h->got.offset |= 1;
2118 else
2120 off = local_got_offsets[r_symndx];
2121 local_got_offsets[r_symndx] |= 1;
2124 tls_type = _bfd_riscv_elf_tls_type (input_bfd, h, r_symndx);
2125 BFD_ASSERT (tls_type & (GOT_TLS_IE | GOT_TLS_GD));
2126 /* If this symbol is referenced by both GD and IE TLS, the IE
2127 reference's GOT slot follows the GD reference's slots. */
2128 ie_off = 0;
2129 if ((tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_IE))
2130 ie_off = 2 * GOT_ENTRY_SIZE;
2132 if ((off & 1) != 0)
2133 off &= ~1;
2134 else
2136 Elf_Internal_Rela outrel;
2137 int indx = 0;
2138 bfd_boolean need_relocs = FALSE;
2140 if (htab->elf.srelgot == NULL)
2141 abort ();
2143 if (h != NULL)
2145 bfd_boolean dyn, pic;
2146 dyn = htab->elf.dynamic_sections_created;
2147 pic = bfd_link_pic (info);
2149 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
2150 && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
2151 indx = h->dynindx;
2154 /* The GOT entries have not been initialized yet. Do it
2155 now, and emit any relocations. */
2156 if ((bfd_link_pic (info) || indx != 0)
2157 && (h == NULL
2158 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2159 || h->root.type != bfd_link_hash_undefweak))
2160 need_relocs = TRUE;
2162 if (tls_type & GOT_TLS_GD)
2164 if (need_relocs)
2166 outrel.r_offset = sec_addr (htab->elf.sgot) + off;
2167 outrel.r_addend = 0;
2168 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPMODNN);
2169 bfd_put_NN (output_bfd, 0,
2170 htab->elf.sgot->contents + off);
2171 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2172 if (indx == 0)
2174 BFD_ASSERT (! unresolved_reloc);
2175 bfd_put_NN (output_bfd,
2176 dtpoff (info, relocation),
2177 (htab->elf.sgot->contents + off +
2178 RISCV_ELF_WORD_BYTES));
2180 else
2182 bfd_put_NN (output_bfd, 0,
2183 (htab->elf.sgot->contents + off +
2184 RISCV_ELF_WORD_BYTES));
2185 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPRELNN);
2186 outrel.r_offset += RISCV_ELF_WORD_BYTES;
2187 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2190 else
2192 /* If we are not emitting relocations for a
2193 general dynamic reference, then we must be in a
2194 static link or an executable link with the
2195 symbol binding locally. Mark it as belonging
2196 to module 1, the executable. */
2197 bfd_put_NN (output_bfd, 1,
2198 htab->elf.sgot->contents + off);
2199 bfd_put_NN (output_bfd,
2200 dtpoff (info, relocation),
2201 (htab->elf.sgot->contents + off +
2202 RISCV_ELF_WORD_BYTES));
2206 if (tls_type & GOT_TLS_IE)
2208 if (need_relocs)
2210 bfd_put_NN (output_bfd, 0,
2211 htab->elf.sgot->contents + off + ie_off);
2212 outrel.r_offset = sec_addr (htab->elf.sgot)
2213 + off + ie_off;
2214 outrel.r_addend = 0;
2215 if (indx == 0)
2216 outrel.r_addend = tpoff (info, relocation);
2217 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_TPRELNN);
2218 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2220 else
2222 bfd_put_NN (output_bfd, tpoff (info, relocation),
2223 htab->elf.sgot->contents + off + ie_off);
2228 BFD_ASSERT (off < (bfd_vma) -2);
2229 relocation = sec_addr (htab->elf.sgot) + off + (is_ie ? ie_off : 0);
2230 if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2231 relocation, FALSE))
2232 r = bfd_reloc_overflow;
2233 unresolved_reloc = FALSE;
2234 break;
2236 default:
2237 r = bfd_reloc_notsupported;
2240 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2241 because such sections are not SEC_ALLOC and thus ld.so will
2242 not process them. */
2243 if (unresolved_reloc
2244 && !((input_section->flags & SEC_DEBUGGING) != 0
2245 && h->def_dynamic)
2246 && _bfd_elf_section_offset (output_bfd, info, input_section,
2247 rel->r_offset) != (bfd_vma) -1)
2249 (*_bfd_error_handler)
2250 (_("%pB(%pA+%#" PRIx64 "): "
2251 "unresolvable %s relocation against symbol `%s'"),
2252 input_bfd,
2253 input_section,
2254 (uint64_t) rel->r_offset,
2255 howto->name,
2256 h->root.root.string);
2257 continue;
2260 if (r == bfd_reloc_ok)
2261 r = perform_relocation (howto, rel, relocation, input_section,
2262 input_bfd, contents);
2264 switch (r)
2266 case bfd_reloc_ok:
2267 continue;
2269 case bfd_reloc_overflow:
2270 info->callbacks->reloc_overflow
2271 (info, (h ? &h->root : NULL), name, howto->name,
2272 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
2273 break;
2275 case bfd_reloc_undefined:
2276 info->callbacks->undefined_symbol
2277 (info, name, input_bfd, input_section, rel->r_offset,
2278 TRUE);
2279 break;
2281 case bfd_reloc_outofrange:
2282 msg = _("%X%P: internal error: out of range error\n");
2283 break;
2285 case bfd_reloc_notsupported:
2286 msg = _("%X%P: internal error: unsupported relocation error\n");
2287 break;
2289 case bfd_reloc_dangerous:
2290 info->callbacks->reloc_dangerous
2291 (info, "%pcrel_lo with addend", input_bfd, input_section,
2292 rel->r_offset);
2293 break;
2295 default:
2296 msg = _("%X%P: internal error: unknown error\n");
2297 break;
2300 if (msg)
2301 info->callbacks->einfo (msg);
2303 /* We already reported the error via a callback, so don't try to report
2304 it again by returning false. That leads to spurious errors. */
2305 ret = TRUE;
2306 goto out;
2309 ret = riscv_resolve_pcrel_lo_relocs (&pcrel_relocs);
2310 out:
2311 riscv_free_pcrel_relocs (&pcrel_relocs);
2312 return ret;
2315 /* Finish up dynamic symbol handling. We set the contents of various
2316 dynamic sections here. */
2318 static bfd_boolean
2319 riscv_elf_finish_dynamic_symbol (bfd *output_bfd,
2320 struct bfd_link_info *info,
2321 struct elf_link_hash_entry *h,
2322 Elf_Internal_Sym *sym)
2324 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2325 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2327 if (h->plt.offset != (bfd_vma) -1)
2329 /* We've decided to create a PLT entry for this symbol. */
2330 bfd_byte *loc;
2331 bfd_vma i, header_address, plt_idx, got_address;
2332 uint32_t plt_entry[PLT_ENTRY_INSNS];
2333 Elf_Internal_Rela rela;
2335 BFD_ASSERT (h->dynindx != -1);
2337 /* Calculate the address of the PLT header. */
2338 header_address = sec_addr (htab->elf.splt);
2340 /* Calculate the index of the entry. */
2341 plt_idx = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
2343 /* Calculate the address of the .got.plt entry. */
2344 got_address = riscv_elf_got_plt_val (plt_idx, info);
2346 /* Find out where the .plt entry should go. */
2347 loc = htab->elf.splt->contents + h->plt.offset;
2349 /* Fill in the PLT entry itself. */
2350 riscv_make_plt_entry (got_address, header_address + h->plt.offset,
2351 plt_entry);
2352 for (i = 0; i < PLT_ENTRY_INSNS; i++)
2353 bfd_put_32 (output_bfd, plt_entry[i], loc + 4*i);
2355 /* Fill in the initial value of the .got.plt entry. */
2356 loc = htab->elf.sgotplt->contents
2357 + (got_address - sec_addr (htab->elf.sgotplt));
2358 bfd_put_NN (output_bfd, sec_addr (htab->elf.splt), loc);
2360 /* Fill in the entry in the .rela.plt section. */
2361 rela.r_offset = got_address;
2362 rela.r_addend = 0;
2363 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_JUMP_SLOT);
2365 loc = htab->elf.srelplt->contents + plt_idx * sizeof (ElfNN_External_Rela);
2366 bed->s->swap_reloca_out (output_bfd, &rela, loc);
2368 if (!h->def_regular)
2370 /* Mark the symbol as undefined, rather than as defined in
2371 the .plt section. Leave the value alone. */
2372 sym->st_shndx = SHN_UNDEF;
2373 /* If the symbol is weak, we do need to clear the value.
2374 Otherwise, the PLT entry would provide a definition for
2375 the symbol even if the symbol wasn't defined anywhere,
2376 and so the symbol would never be NULL. */
2377 if (!h->ref_regular_nonweak)
2378 sym->st_value = 0;
2382 if (h->got.offset != (bfd_vma) -1
2383 && !(riscv_elf_hash_entry (h)->tls_type & (GOT_TLS_GD | GOT_TLS_IE))
2384 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
2386 asection *sgot;
2387 asection *srela;
2388 Elf_Internal_Rela rela;
2390 /* This symbol has an entry in the GOT. Set it up. */
2392 sgot = htab->elf.sgot;
2393 srela = htab->elf.srelgot;
2394 BFD_ASSERT (sgot != NULL && srela != NULL);
2396 rela.r_offset = sec_addr (sgot) + (h->got.offset &~ (bfd_vma) 1);
2398 /* If this is a local symbol reference, we just want to emit a RELATIVE
2399 reloc. This can happen if it is a -Bsymbolic link, or a pie link, or
2400 the symbol was forced to be local because of a version file.
2401 The entry in the global offset table will already have been
2402 initialized in the relocate_section function. */
2403 if (bfd_link_pic (info)
2404 && SYMBOL_REFERENCES_LOCAL (info, h))
2406 BFD_ASSERT((h->got.offset & 1) != 0);
2407 asection *sec = h->root.u.def.section;
2408 rela.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2409 rela.r_addend = (h->root.u.def.value
2410 + sec->output_section->vma
2411 + sec->output_offset);
2413 else
2415 BFD_ASSERT((h->got.offset & 1) == 0);
2416 BFD_ASSERT (h->dynindx != -1);
2417 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_NN);
2418 rela.r_addend = 0;
2421 bfd_put_NN (output_bfd, 0,
2422 sgot->contents + (h->got.offset & ~(bfd_vma) 1));
2423 riscv_elf_append_rela (output_bfd, srela, &rela);
2426 if (h->needs_copy)
2428 Elf_Internal_Rela rela;
2429 asection *s;
2431 /* This symbols needs a copy reloc. Set it up. */
2432 BFD_ASSERT (h->dynindx != -1);
2434 rela.r_offset = sec_addr (h->root.u.def.section) + h->root.u.def.value;
2435 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_COPY);
2436 rela.r_addend = 0;
2437 if (h->root.u.def.section == htab->elf.sdynrelro)
2438 s = htab->elf.sreldynrelro;
2439 else
2440 s = htab->elf.srelbss;
2441 riscv_elf_append_rela (output_bfd, s, &rela);
2444 /* Mark some specially defined symbols as absolute. */
2445 if (h == htab->elf.hdynamic
2446 || (h == htab->elf.hgot || h == htab->elf.hplt))
2447 sym->st_shndx = SHN_ABS;
2449 return TRUE;
2452 /* Finish up the dynamic sections. */
2454 static bfd_boolean
2455 riscv_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
2456 bfd *dynobj, asection *sdyn)
2458 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2459 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2460 size_t dynsize = bed->s->sizeof_dyn;
2461 bfd_byte *dyncon, *dynconend;
2463 dynconend = sdyn->contents + sdyn->size;
2464 for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
2466 Elf_Internal_Dyn dyn;
2467 asection *s;
2469 bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
2471 switch (dyn.d_tag)
2473 case DT_PLTGOT:
2474 s = htab->elf.sgotplt;
2475 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2476 break;
2477 case DT_JMPREL:
2478 s = htab->elf.srelplt;
2479 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2480 break;
2481 case DT_PLTRELSZ:
2482 s = htab->elf.srelplt;
2483 dyn.d_un.d_val = s->size;
2484 break;
2485 default:
2486 continue;
2489 bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
2491 return TRUE;
2494 static bfd_boolean
2495 riscv_elf_finish_dynamic_sections (bfd *output_bfd,
2496 struct bfd_link_info *info)
2498 bfd *dynobj;
2499 asection *sdyn;
2500 struct riscv_elf_link_hash_table *htab;
2502 htab = riscv_elf_hash_table (info);
2503 BFD_ASSERT (htab != NULL);
2504 dynobj = htab->elf.dynobj;
2506 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
2508 if (elf_hash_table (info)->dynamic_sections_created)
2510 asection *splt;
2511 bfd_boolean ret;
2513 splt = htab->elf.splt;
2514 BFD_ASSERT (splt != NULL && sdyn != NULL);
2516 ret = riscv_finish_dyn (output_bfd, info, dynobj, sdyn);
2518 if (!ret)
2519 return ret;
2521 /* Fill in the head and tail entries in the procedure linkage table. */
2522 if (splt->size > 0)
2524 int i;
2525 uint32_t plt_header[PLT_HEADER_INSNS];
2526 riscv_make_plt_header (sec_addr (htab->elf.sgotplt),
2527 sec_addr (splt), plt_header);
2529 for (i = 0; i < PLT_HEADER_INSNS; i++)
2530 bfd_put_32 (output_bfd, plt_header[i], splt->contents + 4*i);
2532 elf_section_data (splt->output_section)->this_hdr.sh_entsize
2533 = PLT_ENTRY_SIZE;
2537 if (htab->elf.sgotplt)
2539 asection *output_section = htab->elf.sgotplt->output_section;
2541 if (bfd_is_abs_section (output_section))
2543 (*_bfd_error_handler)
2544 (_("discarded output section: `%pA'"), htab->elf.sgotplt);
2545 return FALSE;
2548 if (htab->elf.sgotplt->size > 0)
2550 /* Write the first two entries in .got.plt, needed for the dynamic
2551 linker. */
2552 bfd_put_NN (output_bfd, (bfd_vma) -1, htab->elf.sgotplt->contents);
2553 bfd_put_NN (output_bfd, (bfd_vma) 0,
2554 htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
2557 elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2560 if (htab->elf.sgot)
2562 asection *output_section = htab->elf.sgot->output_section;
2564 if (htab->elf.sgot->size > 0)
2566 /* Set the first entry in the global offset table to the address of
2567 the dynamic section. */
2568 bfd_vma val = sdyn ? sec_addr (sdyn) : 0;
2569 bfd_put_NN (output_bfd, val, htab->elf.sgot->contents);
2572 elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2575 return TRUE;
2578 /* Return address for Ith PLT stub in section PLT, for relocation REL
2579 or (bfd_vma) -1 if it should not be included. */
2581 static bfd_vma
2582 riscv_elf_plt_sym_val (bfd_vma i, const asection *plt,
2583 const arelent *rel ATTRIBUTE_UNUSED)
2585 return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
2588 static enum elf_reloc_type_class
2589 riscv_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2590 const asection *rel_sec ATTRIBUTE_UNUSED,
2591 const Elf_Internal_Rela *rela)
2593 switch (ELFNN_R_TYPE (rela->r_info))
2595 case R_RISCV_RELATIVE:
2596 return reloc_class_relative;
2597 case R_RISCV_JUMP_SLOT:
2598 return reloc_class_plt;
2599 case R_RISCV_COPY:
2600 return reloc_class_copy;
2601 default:
2602 return reloc_class_normal;
2606 /* Merge backend specific data from an object file to the output
2607 object file when linking. */
2609 static bfd_boolean
2610 _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2612 bfd *obfd = info->output_bfd;
2613 flagword new_flags = elf_elfheader (ibfd)->e_flags;
2614 flagword old_flags = elf_elfheader (obfd)->e_flags;
2616 if (!is_riscv_elf (ibfd) || !is_riscv_elf (obfd))
2617 return TRUE;
2619 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
2621 (*_bfd_error_handler)
2622 (_("%pB: ABI is incompatible with that of the selected emulation:\n"
2623 " target emulation `%s' does not match `%s'"),
2624 ibfd, bfd_get_target (ibfd), bfd_get_target (obfd));
2625 return FALSE;
2628 if (!_bfd_elf_merge_object_attributes (ibfd, info))
2629 return FALSE;
2631 if (! elf_flags_init (obfd))
2633 elf_flags_init (obfd) = TRUE;
2634 elf_elfheader (obfd)->e_flags = new_flags;
2635 return TRUE;
2638 /* Disallow linking different float ABIs. */
2639 if ((old_flags ^ new_flags) & EF_RISCV_FLOAT_ABI)
2641 (*_bfd_error_handler)
2642 (_("%pB: can't link hard-float modules with soft-float modules"), ibfd);
2643 goto fail;
2646 /* Disallow linking RVE and non-RVE. */
2647 if ((old_flags ^ new_flags) & EF_RISCV_RVE)
2649 (*_bfd_error_handler)
2650 (_("%pB: can't link RVE with other target"), ibfd);
2651 goto fail;
2654 /* Allow linking RVC and non-RVC, and keep the RVC flag. */
2655 elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC;
2657 return TRUE;
2659 fail:
2660 bfd_set_error (bfd_error_bad_value);
2661 return FALSE;
2664 /* Delete some bytes from a section while relaxing. */
2666 static bfd_boolean
2667 riscv_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, size_t count,
2668 struct bfd_link_info *link_info)
2670 unsigned int i, symcount;
2671 bfd_vma toaddr = sec->size;
2672 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
2673 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2674 unsigned int sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2675 struct bfd_elf_section_data *data = elf_section_data (sec);
2676 bfd_byte *contents = data->this_hdr.contents;
2678 /* Actually delete the bytes. */
2679 sec->size -= count;
2680 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
2682 /* Adjust the location of all of the relocs. Note that we need not
2683 adjust the addends, since all PC-relative references must be against
2684 symbols, which we will adjust below. */
2685 for (i = 0; i < sec->reloc_count; i++)
2686 if (data->relocs[i].r_offset > addr && data->relocs[i].r_offset < toaddr)
2687 data->relocs[i].r_offset -= count;
2689 /* Adjust the local symbols defined in this section. */
2690 for (i = 0; i < symtab_hdr->sh_info; i++)
2692 Elf_Internal_Sym *sym = (Elf_Internal_Sym *) symtab_hdr->contents + i;
2693 if (sym->st_shndx == sec_shndx)
2695 /* If the symbol is in the range of memory we just moved, we
2696 have to adjust its value. */
2697 if (sym->st_value > addr && sym->st_value <= toaddr)
2698 sym->st_value -= count;
2700 /* If the symbol *spans* the bytes we just deleted (i.e. its
2701 *end* is in the moved bytes but its *start* isn't), then we
2702 must adjust its size.
2704 This test needs to use the original value of st_value, otherwise
2705 we might accidentally decrease size when deleting bytes right
2706 before the symbol. But since deleted relocs can't span across
2707 symbols, we can't have both a st_value and a st_size decrease,
2708 so it is simpler to just use an else. */
2709 else if (sym->st_value <= addr
2710 && sym->st_value + sym->st_size > addr
2711 && sym->st_value + sym->st_size <= toaddr)
2712 sym->st_size -= count;
2716 /* Now adjust the global symbols defined in this section. */
2717 symcount = ((symtab_hdr->sh_size / sizeof (ElfNN_External_Sym))
2718 - symtab_hdr->sh_info);
2720 for (i = 0; i < symcount; i++)
2722 struct elf_link_hash_entry *sym_hash = sym_hashes[i];
2724 /* The '--wrap SYMBOL' option is causing a pain when the object file,
2725 containing the definition of __wrap_SYMBOL, includes a direct
2726 call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
2727 the same symbol (which is __wrap_SYMBOL), but still exist as two
2728 different symbols in 'sym_hashes', we don't want to adjust
2729 the global symbol __wrap_SYMBOL twice. */
2730 /* The same problem occurs with symbols that are versioned_hidden, as
2731 foo becomes an alias for foo@BAR, and hence they need the same
2732 treatment. */
2733 if (link_info->wrap_hash != NULL
2734 || sym_hash->versioned == versioned_hidden)
2736 struct elf_link_hash_entry **cur_sym_hashes;
2738 /* Loop only over the symbols which have already been checked. */
2739 for (cur_sym_hashes = sym_hashes; cur_sym_hashes < &sym_hashes[i];
2740 cur_sym_hashes++)
2742 /* If the current symbol is identical to 'sym_hash', that means
2743 the symbol was already adjusted (or at least checked). */
2744 if (*cur_sym_hashes == sym_hash)
2745 break;
2747 /* Don't adjust the symbol again. */
2748 if (cur_sym_hashes < &sym_hashes[i])
2749 continue;
2752 if ((sym_hash->root.type == bfd_link_hash_defined
2753 || sym_hash->root.type == bfd_link_hash_defweak)
2754 && sym_hash->root.u.def.section == sec)
2756 /* As above, adjust the value if needed. */
2757 if (sym_hash->root.u.def.value > addr
2758 && sym_hash->root.u.def.value <= toaddr)
2759 sym_hash->root.u.def.value -= count;
2761 /* As above, adjust the size if needed. */
2762 else if (sym_hash->root.u.def.value <= addr
2763 && sym_hash->root.u.def.value + sym_hash->size > addr
2764 && sym_hash->root.u.def.value + sym_hash->size <= toaddr)
2765 sym_hash->size -= count;
2769 return TRUE;
2772 /* A second format for recording PC-relative hi relocations. This stores the
2773 information required to relax them to GP-relative addresses. */
2775 typedef struct riscv_pcgp_hi_reloc riscv_pcgp_hi_reloc;
2776 struct riscv_pcgp_hi_reloc
2778 bfd_vma hi_sec_off;
2779 bfd_vma hi_addend;
2780 bfd_vma hi_addr;
2781 unsigned hi_sym;
2782 asection *sym_sec;
2783 riscv_pcgp_hi_reloc *next;
2786 typedef struct riscv_pcgp_lo_reloc riscv_pcgp_lo_reloc;
2787 struct riscv_pcgp_lo_reloc
2789 bfd_vma hi_sec_off;
2790 riscv_pcgp_lo_reloc *next;
2793 typedef struct
2795 riscv_pcgp_hi_reloc *hi;
2796 riscv_pcgp_lo_reloc *lo;
2797 } riscv_pcgp_relocs;
2799 static bfd_boolean
2800 riscv_init_pcgp_relocs (riscv_pcgp_relocs *p)
2802 p->hi = NULL;
2803 p->lo = NULL;
2804 return TRUE;
2807 static void
2808 riscv_free_pcgp_relocs (riscv_pcgp_relocs *p,
2809 bfd *abfd ATTRIBUTE_UNUSED,
2810 asection *sec ATTRIBUTE_UNUSED)
2812 riscv_pcgp_hi_reloc *c;
2813 riscv_pcgp_lo_reloc *l;
2815 for (c = p->hi; c != NULL;)
2817 riscv_pcgp_hi_reloc *next = c->next;
2818 free (c);
2819 c = next;
2822 for (l = p->lo; l != NULL;)
2824 riscv_pcgp_lo_reloc *next = l->next;
2825 free (l);
2826 l = next;
2830 static bfd_boolean
2831 riscv_record_pcgp_hi_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off,
2832 bfd_vma hi_addend, bfd_vma hi_addr,
2833 unsigned hi_sym, asection *sym_sec)
2835 riscv_pcgp_hi_reloc *new = bfd_malloc (sizeof(*new));
2836 if (!new)
2837 return FALSE;
2838 new->hi_sec_off = hi_sec_off;
2839 new->hi_addend = hi_addend;
2840 new->hi_addr = hi_addr;
2841 new->hi_sym = hi_sym;
2842 new->sym_sec = sym_sec;
2843 new->next = p->hi;
2844 p->hi = new;
2845 return TRUE;
2848 static riscv_pcgp_hi_reloc *
2849 riscv_find_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2851 riscv_pcgp_hi_reloc *c;
2853 for (c = p->hi; c != NULL; c = c->next)
2854 if (c->hi_sec_off == hi_sec_off)
2855 return c;
2856 return NULL;
2859 static bfd_boolean
2860 riscv_delete_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2862 bfd_boolean out = FALSE;
2863 riscv_pcgp_hi_reloc *c;
2865 for (c = p->hi; c != NULL; c = c->next)
2866 if (c->hi_sec_off == hi_sec_off)
2867 out = TRUE;
2869 return out;
2872 static bfd_boolean
2873 riscv_use_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2875 bfd_boolean out = FALSE;
2876 riscv_pcgp_hi_reloc *c;
2878 for (c = p->hi; c != NULL; c = c->next)
2879 if (c->hi_sec_off == hi_sec_off)
2880 out = TRUE;
2882 return out;
2885 static bfd_boolean
2886 riscv_record_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2888 riscv_pcgp_lo_reloc *new = bfd_malloc (sizeof(*new));
2889 if (!new)
2890 return FALSE;
2891 new->hi_sec_off = hi_sec_off;
2892 new->next = p->lo;
2893 p->lo = new;
2894 return TRUE;
2897 static bfd_boolean
2898 riscv_find_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2900 riscv_pcgp_lo_reloc *c;
2902 for (c = p->lo; c != NULL; c = c->next)
2903 if (c->hi_sec_off == hi_sec_off)
2904 return TRUE;
2905 return FALSE;
2908 static bfd_boolean
2909 riscv_delete_pcgp_lo_reloc (riscv_pcgp_relocs *p ATTRIBUTE_UNUSED,
2910 bfd_vma lo_sec_off ATTRIBUTE_UNUSED,
2911 size_t bytes ATTRIBUTE_UNUSED)
2913 return TRUE;
2916 typedef bfd_boolean (*relax_func_t) (bfd *, asection *, asection *,
2917 struct bfd_link_info *,
2918 Elf_Internal_Rela *,
2919 bfd_vma, bfd_vma, bfd_vma, bfd_boolean *,
2920 riscv_pcgp_relocs *);
2922 /* Relax AUIPC + JALR into JAL. */
2924 static bfd_boolean
2925 _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec,
2926 struct bfd_link_info *link_info,
2927 Elf_Internal_Rela *rel,
2928 bfd_vma symval,
2929 bfd_vma max_alignment,
2930 bfd_vma reserve_size ATTRIBUTE_UNUSED,
2931 bfd_boolean *again,
2932 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
2934 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2935 bfd_signed_vma foff = symval - (sec_addr (sec) + rel->r_offset);
2936 bfd_boolean near_zero = (symval + RISCV_IMM_REACH/2) < RISCV_IMM_REACH;
2937 bfd_vma auipc, jalr;
2938 int rd, r_type, len = 4, rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
2940 /* If the call crosses section boundaries, an alignment directive could
2941 cause the PC-relative offset to later increase. */
2942 if (VALID_UJTYPE_IMM (foff) && sym_sec->output_section != sec->output_section)
2943 foff += (foff < 0 ? -max_alignment : max_alignment);
2945 /* See if this function call can be shortened. */
2946 if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero))
2947 return TRUE;
2949 /* Shorten the function call. */
2950 BFD_ASSERT (rel->r_offset + 8 <= sec->size);
2952 auipc = bfd_get_32 (abfd, contents + rel->r_offset);
2953 jalr = bfd_get_32 (abfd, contents + rel->r_offset + 4);
2954 rd = (jalr >> OP_SH_RD) & OP_MASK_RD;
2955 rvc = rvc && VALID_RVC_J_IMM (foff) && ARCH_SIZE == 32;
2957 if (rvc && (rd == 0 || rd == X_RA))
2959 /* Relax to C.J[AL] rd, addr. */
2960 r_type = R_RISCV_RVC_JUMP;
2961 auipc = rd == 0 ? MATCH_C_J : MATCH_C_JAL;
2962 len = 2;
2964 else if (VALID_UJTYPE_IMM (foff))
2966 /* Relax to JAL rd, addr. */
2967 r_type = R_RISCV_JAL;
2968 auipc = MATCH_JAL | (rd << OP_SH_RD);
2970 else /* near_zero */
2972 /* Relax to JALR rd, x0, addr. */
2973 r_type = R_RISCV_LO12_I;
2974 auipc = MATCH_JALR | (rd << OP_SH_RD);
2977 /* Replace the R_RISCV_CALL reloc. */
2978 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), r_type);
2979 /* Replace the AUIPC. */
2980 bfd_put (8 * len, abfd, auipc, contents + rel->r_offset);
2982 /* Delete unnecessary JALR. */
2983 *again = TRUE;
2984 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + len, 8 - len,
2985 link_info);
2988 /* Traverse all output sections and return the max alignment. */
2990 static bfd_vma
2991 _bfd_riscv_get_max_alignment (asection *sec)
2993 unsigned int max_alignment_power = 0;
2994 asection *o;
2996 for (o = sec->output_section->owner->sections; o != NULL; o = o->next)
2998 if (o->alignment_power > max_alignment_power)
2999 max_alignment_power = o->alignment_power;
3002 return (bfd_vma) 1 << max_alignment_power;
3005 /* Relax non-PIC global variable references. */
3007 static bfd_boolean
3008 _bfd_riscv_relax_lui (bfd *abfd,
3009 asection *sec,
3010 asection *sym_sec,
3011 struct bfd_link_info *link_info,
3012 Elf_Internal_Rela *rel,
3013 bfd_vma symval,
3014 bfd_vma max_alignment,
3015 bfd_vma reserve_size,
3016 bfd_boolean *again,
3017 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
3019 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
3020 bfd_vma gp = riscv_global_pointer_value (link_info);
3021 int use_rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
3023 /* Mergeable symbols and code might later move out of range. */
3024 if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
3025 return TRUE;
3027 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3029 if (gp)
3031 /* If gp and the symbol are in the same output section, then
3032 consider only that section's alignment. */
3033 struct bfd_link_hash_entry *h =
3034 bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE,
3035 TRUE);
3036 if (h->u.def.section->output_section == sym_sec->output_section)
3037 max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
3040 /* Is the reference in range of x0 or gp?
3041 Valid gp range conservatively because of alignment issue. */
3042 if (VALID_ITYPE_IMM (symval)
3043 || (symval >= gp
3044 && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
3045 || (symval < gp
3046 && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
3048 unsigned sym = ELFNN_R_SYM (rel->r_info);
3049 switch (ELFNN_R_TYPE (rel->r_info))
3051 case R_RISCV_LO12_I:
3052 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
3053 return TRUE;
3055 case R_RISCV_LO12_S:
3056 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
3057 return TRUE;
3059 case R_RISCV_HI20:
3060 /* We can delete the unnecessary LUI and reloc. */
3061 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3062 *again = TRUE;
3063 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4,
3064 link_info);
3066 default:
3067 abort ();
3071 /* Can we relax LUI to C.LUI? Alignment might move the section forward;
3072 account for this assuming page alignment at worst. */
3073 if (use_rvc
3074 && ELFNN_R_TYPE (rel->r_info) == R_RISCV_HI20
3075 && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval))
3076 && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval + ELF_MAXPAGESIZE)))
3078 /* Replace LUI with C.LUI if legal (i.e., rd != x0 and rd != x2/sp). */
3079 bfd_vma lui = bfd_get_32 (abfd, contents + rel->r_offset);
3080 unsigned rd = ((unsigned)lui >> OP_SH_RD) & OP_MASK_RD;
3081 if (rd == 0 || rd == X_SP)
3082 return TRUE;
3084 lui = (lui & (OP_MASK_RD << OP_SH_RD)) | MATCH_C_LUI;
3085 bfd_put_32 (abfd, lui, contents + rel->r_offset);
3087 /* Replace the R_RISCV_HI20 reloc. */
3088 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_RVC_LUI);
3090 *again = TRUE;
3091 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + 2, 2,
3092 link_info);
3095 return TRUE;
3098 /* Relax non-PIC TLS references. */
3100 static bfd_boolean
3101 _bfd_riscv_relax_tls_le (bfd *abfd,
3102 asection *sec,
3103 asection *sym_sec ATTRIBUTE_UNUSED,
3104 struct bfd_link_info *link_info,
3105 Elf_Internal_Rela *rel,
3106 bfd_vma symval,
3107 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3108 bfd_vma reserve_size ATTRIBUTE_UNUSED,
3109 bfd_boolean *again,
3110 riscv_pcgp_relocs *prcel_relocs ATTRIBUTE_UNUSED)
3112 /* See if this symbol is in range of tp. */
3113 if (RISCV_CONST_HIGH_PART (tpoff (link_info, symval)) != 0)
3114 return TRUE;
3116 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3117 switch (ELFNN_R_TYPE (rel->r_info))
3119 case R_RISCV_TPREL_LO12_I:
3120 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_I);
3121 return TRUE;
3123 case R_RISCV_TPREL_LO12_S:
3124 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_S);
3125 return TRUE;
3127 case R_RISCV_TPREL_HI20:
3128 case R_RISCV_TPREL_ADD:
3129 /* We can delete the unnecessary instruction and reloc. */
3130 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3131 *again = TRUE;
3132 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4, link_info);
3134 default:
3135 abort ();
3139 /* Implement R_RISCV_ALIGN by deleting excess alignment NOPs. */
3141 static bfd_boolean
3142 _bfd_riscv_relax_align (bfd *abfd, asection *sec,
3143 asection *sym_sec,
3144 struct bfd_link_info *link_info,
3145 Elf_Internal_Rela *rel,
3146 bfd_vma symval,
3147 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3148 bfd_vma reserve_size ATTRIBUTE_UNUSED,
3149 bfd_boolean *again ATTRIBUTE_UNUSED,
3150 riscv_pcgp_relocs *pcrel_relocs ATTRIBUTE_UNUSED)
3152 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
3153 bfd_vma alignment = 1, pos;
3154 while (alignment <= rel->r_addend)
3155 alignment *= 2;
3157 symval -= rel->r_addend;
3158 bfd_vma aligned_addr = ((symval - 1) & ~(alignment - 1)) + alignment;
3159 bfd_vma nop_bytes = aligned_addr - symval;
3161 /* Once we've handled an R_RISCV_ALIGN, we can't relax anything else. */
3162 sec->sec_flg0 = TRUE;
3164 /* Make sure there are enough NOPs to actually achieve the alignment. */
3165 if (rel->r_addend < nop_bytes)
3167 _bfd_error_handler
3168 (_("%pB(%pA+%#" PRIx64 "): %" PRId64 " bytes required for alignment "
3169 "to %" PRId64 "-byte boundary, but only %" PRId64 " present"),
3170 abfd, sym_sec, (uint64_t) rel->r_offset,
3171 (int64_t) nop_bytes, (int64_t) alignment, (int64_t) rel->r_addend);
3172 bfd_set_error (bfd_error_bad_value);
3173 return FALSE;
3176 /* Delete the reloc. */
3177 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3179 /* If the number of NOPs is already correct, there's nothing to do. */
3180 if (nop_bytes == rel->r_addend)
3181 return TRUE;
3183 /* Write as many RISC-V NOPs as we need. */
3184 for (pos = 0; pos < (nop_bytes & -4); pos += 4)
3185 bfd_put_32 (abfd, RISCV_NOP, contents + rel->r_offset + pos);
3187 /* Write a final RVC NOP if need be. */
3188 if (nop_bytes % 4 != 0)
3189 bfd_put_16 (abfd, RVC_NOP, contents + rel->r_offset + pos);
3191 /* Delete the excess bytes. */
3192 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + nop_bytes,
3193 rel->r_addend - nop_bytes, link_info);
3196 /* Relax PC-relative references to GP-relative references. */
3198 static bfd_boolean
3199 _bfd_riscv_relax_pc (bfd *abfd,
3200 asection *sec,
3201 asection *sym_sec,
3202 struct bfd_link_info *link_info,
3203 Elf_Internal_Rela *rel,
3204 bfd_vma symval,
3205 bfd_vma max_alignment,
3206 bfd_vma reserve_size,
3207 bfd_boolean *again ATTRIBUTE_UNUSED,
3208 riscv_pcgp_relocs *pcgp_relocs)
3210 bfd_vma gp = riscv_global_pointer_value (link_info);
3212 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3214 /* Chain the _LO relocs to their cooresponding _HI reloc to compute the
3215 * actual target address. */
3216 riscv_pcgp_hi_reloc hi_reloc;
3217 memset (&hi_reloc, 0, sizeof (hi_reloc));
3218 switch (ELFNN_R_TYPE (rel->r_info))
3220 case R_RISCV_PCREL_LO12_I:
3221 case R_RISCV_PCREL_LO12_S:
3223 riscv_pcgp_hi_reloc *hi = riscv_find_pcgp_hi_reloc (pcgp_relocs,
3224 symval - sec_addr(sym_sec));
3225 if (hi == NULL)
3227 riscv_record_pcgp_lo_reloc (pcgp_relocs, symval - sec_addr(sym_sec));
3228 return TRUE;
3231 hi_reloc = *hi;
3232 symval = hi_reloc.hi_addr;
3233 sym_sec = hi_reloc.sym_sec;
3234 if (!riscv_use_pcgp_hi_reloc(pcgp_relocs, hi->hi_sec_off))
3235 _bfd_error_handler
3236 (_("%pB(%pA+%#" PRIx64 "): Unable to clear RISCV_PCREL_HI20 reloc "
3237 "for corresponding RISCV_PCREL_LO12 reloc"),
3238 abfd, sec, (uint64_t) rel->r_offset);
3240 break;
3242 case R_RISCV_PCREL_HI20:
3243 /* Mergeable symbols and code might later move out of range. */
3244 if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
3245 return TRUE;
3247 /* If the cooresponding lo relocation has already been seen then it's not
3248 * safe to relax this relocation. */
3249 if (riscv_find_pcgp_lo_reloc (pcgp_relocs, rel->r_offset))
3250 return TRUE;
3252 break;
3254 default:
3255 abort ();
3258 if (gp)
3260 /* If gp and the symbol are in the same output section, then
3261 consider only that section's alignment. */
3262 struct bfd_link_hash_entry *h =
3263 bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE, TRUE);
3264 if (h->u.def.section->output_section == sym_sec->output_section)
3265 max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
3268 /* Is the reference in range of x0 or gp?
3269 Valid gp range conservatively because of alignment issue. */
3270 if (VALID_ITYPE_IMM (symval)
3271 || (symval >= gp
3272 && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
3273 || (symval < gp
3274 && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
3276 unsigned sym = hi_reloc.hi_sym;
3277 switch (ELFNN_R_TYPE (rel->r_info))
3279 case R_RISCV_PCREL_LO12_I:
3280 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
3281 rel->r_addend += hi_reloc.hi_addend;
3282 return riscv_delete_pcgp_lo_reloc (pcgp_relocs, rel->r_offset, 4);
3284 case R_RISCV_PCREL_LO12_S:
3285 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
3286 rel->r_addend += hi_reloc.hi_addend;
3287 return riscv_delete_pcgp_lo_reloc (pcgp_relocs, rel->r_offset, 4);
3289 case R_RISCV_PCREL_HI20:
3290 riscv_record_pcgp_hi_reloc (pcgp_relocs,
3291 rel->r_offset,
3292 rel->r_addend,
3293 symval,
3294 ELFNN_R_SYM(rel->r_info),
3295 sym_sec);
3296 /* We can delete the unnecessary AUIPC and reloc. */
3297 rel->r_info = ELFNN_R_INFO (0, R_RISCV_DELETE);
3298 rel->r_addend = 4;
3299 return riscv_delete_pcgp_hi_reloc (pcgp_relocs, rel->r_offset);
3301 default:
3302 abort ();
3306 return TRUE;
3309 /* Relax PC-relative references to GP-relative references. */
3311 static bfd_boolean
3312 _bfd_riscv_relax_delete (bfd *abfd,
3313 asection *sec,
3314 asection *sym_sec ATTRIBUTE_UNUSED,
3315 struct bfd_link_info *link_info,
3316 Elf_Internal_Rela *rel,
3317 bfd_vma symval ATTRIBUTE_UNUSED,
3318 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3319 bfd_vma reserve_size ATTRIBUTE_UNUSED,
3320 bfd_boolean *again ATTRIBUTE_UNUSED,
3321 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
3323 if (!riscv_relax_delete_bytes(abfd, sec, rel->r_offset, rel->r_addend,
3324 link_info))
3325 return FALSE;
3326 rel->r_info = ELFNN_R_INFO(0, R_RISCV_NONE);
3327 return TRUE;
3330 /* Relax a section. Pass 0 shortens code sequences unless disabled. Pass 1
3331 deletes the bytes that pass 0 made obselete. Pass 2, which cannot be
3332 disabled, handles code alignment directives. */
3334 static bfd_boolean
3335 _bfd_riscv_relax_section (bfd *abfd, asection *sec,
3336 struct bfd_link_info *info,
3337 bfd_boolean *again)
3339 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
3340 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
3341 struct bfd_elf_section_data *data = elf_section_data (sec);
3342 Elf_Internal_Rela *relocs;
3343 bfd_boolean ret = FALSE;
3344 unsigned int i;
3345 bfd_vma max_alignment, reserve_size = 0;
3346 riscv_pcgp_relocs pcgp_relocs;
3348 *again = FALSE;
3350 if (bfd_link_relocatable (info)
3351 || sec->sec_flg0
3352 || (sec->flags & SEC_RELOC) == 0
3353 || sec->reloc_count == 0
3354 || (info->disable_target_specific_optimizations
3355 && info->relax_pass == 0))
3356 return TRUE;
3358 riscv_init_pcgp_relocs (&pcgp_relocs);
3360 /* Read this BFD's relocs if we haven't done so already. */
3361 if (data->relocs)
3362 relocs = data->relocs;
3363 else if (!(relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
3364 info->keep_memory)))
3365 goto fail;
3367 if (htab)
3369 max_alignment = htab->max_alignment;
3370 if (max_alignment == (bfd_vma) -1)
3372 max_alignment = _bfd_riscv_get_max_alignment (sec);
3373 htab->max_alignment = max_alignment;
3376 else
3377 max_alignment = _bfd_riscv_get_max_alignment (sec);
3379 /* Examine and consider relaxing each reloc. */
3380 for (i = 0; i < sec->reloc_count; i++)
3382 asection *sym_sec;
3383 Elf_Internal_Rela *rel = relocs + i;
3384 relax_func_t relax_func;
3385 int type = ELFNN_R_TYPE (rel->r_info);
3386 bfd_vma symval;
3388 relax_func = NULL;
3389 if (info->relax_pass == 0)
3391 if (type == R_RISCV_CALL || type == R_RISCV_CALL_PLT)
3392 relax_func = _bfd_riscv_relax_call;
3393 else if (type == R_RISCV_HI20
3394 || type == R_RISCV_LO12_I
3395 || type == R_RISCV_LO12_S)
3396 relax_func = _bfd_riscv_relax_lui;
3397 else if (!bfd_link_pic(info)
3398 && (type == R_RISCV_PCREL_HI20
3399 || type == R_RISCV_PCREL_LO12_I
3400 || type == R_RISCV_PCREL_LO12_S))
3401 relax_func = _bfd_riscv_relax_pc;
3402 else if (type == R_RISCV_TPREL_HI20
3403 || type == R_RISCV_TPREL_ADD
3404 || type == R_RISCV_TPREL_LO12_I
3405 || type == R_RISCV_TPREL_LO12_S)
3406 relax_func = _bfd_riscv_relax_tls_le;
3407 else
3408 continue;
3410 /* Only relax this reloc if it is paired with R_RISCV_RELAX. */
3411 if (i == sec->reloc_count - 1
3412 || ELFNN_R_TYPE ((rel + 1)->r_info) != R_RISCV_RELAX
3413 || rel->r_offset != (rel + 1)->r_offset)
3414 continue;
3416 /* Skip over the R_RISCV_RELAX. */
3417 i++;
3419 else if (info->relax_pass == 1 && type == R_RISCV_DELETE)
3420 relax_func = _bfd_riscv_relax_delete;
3421 else if (info->relax_pass == 2 && type == R_RISCV_ALIGN)
3422 relax_func = _bfd_riscv_relax_align;
3423 else
3424 continue;
3426 data->relocs = relocs;
3428 /* Read this BFD's contents if we haven't done so already. */
3429 if (!data->this_hdr.contents
3430 && !bfd_malloc_and_get_section (abfd, sec, &data->this_hdr.contents))
3431 goto fail;
3433 /* Read this BFD's symbols if we haven't done so already. */
3434 if (symtab_hdr->sh_info != 0
3435 && !symtab_hdr->contents
3436 && !(symtab_hdr->contents =
3437 (unsigned char *) bfd_elf_get_elf_syms (abfd, symtab_hdr,
3438 symtab_hdr->sh_info,
3439 0, NULL, NULL, NULL)))
3440 goto fail;
3442 /* Get the value of the symbol referred to by the reloc. */
3443 if (ELFNN_R_SYM (rel->r_info) < symtab_hdr->sh_info)
3445 /* A local symbol. */
3446 Elf_Internal_Sym *isym = ((Elf_Internal_Sym *) symtab_hdr->contents
3447 + ELFNN_R_SYM (rel->r_info));
3448 reserve_size = (isym->st_size - rel->r_addend) > isym->st_size
3449 ? 0 : isym->st_size - rel->r_addend;
3451 if (isym->st_shndx == SHN_UNDEF)
3452 sym_sec = sec, symval = sec_addr (sec) + rel->r_offset;
3453 else
3455 BFD_ASSERT (isym->st_shndx < elf_numsections (abfd));
3456 sym_sec = elf_elfsections (abfd)[isym->st_shndx]->bfd_section;
3457 #if 0
3458 /* The purpose of this code is unknown. It breaks linker scripts
3459 for embedded development that place sections at address zero.
3460 This code is believed to be unnecessary. Disabling it but not
3461 yet removing it, in case something breaks. */
3462 if (sec_addr (sym_sec) == 0)
3463 continue;
3464 #endif
3465 symval = sec_addr (sym_sec) + isym->st_value;
3468 else
3470 unsigned long indx;
3471 struct elf_link_hash_entry *h;
3473 indx = ELFNN_R_SYM (rel->r_info) - symtab_hdr->sh_info;
3474 h = elf_sym_hashes (abfd)[indx];
3476 while (h->root.type == bfd_link_hash_indirect
3477 || h->root.type == bfd_link_hash_warning)
3478 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3480 if (h->plt.offset != MINUS_ONE)
3481 symval = sec_addr (htab->elf.splt) + h->plt.offset;
3482 else if (h->root.u.def.section->output_section == NULL
3483 || (h->root.type != bfd_link_hash_defined
3484 && h->root.type != bfd_link_hash_defweak))
3485 continue;
3486 else
3487 symval = sec_addr (h->root.u.def.section) + h->root.u.def.value;
3489 if (h->type != STT_FUNC)
3490 reserve_size =
3491 (h->size - rel->r_addend) > h->size ? 0 : h->size - rel->r_addend;
3492 sym_sec = h->root.u.def.section;
3495 symval += rel->r_addend;
3497 if (!relax_func (abfd, sec, sym_sec, info, rel, symval,
3498 max_alignment, reserve_size, again,
3499 &pcgp_relocs))
3500 goto fail;
3503 ret = TRUE;
3505 fail:
3506 if (relocs != data->relocs)
3507 free (relocs);
3508 riscv_free_pcgp_relocs(&pcgp_relocs, abfd, sec);
3510 return ret;
3513 #if ARCH_SIZE == 32
3514 # define PRSTATUS_SIZE 0 /* FIXME */
3515 # define PRSTATUS_OFFSET_PR_CURSIG 12
3516 # define PRSTATUS_OFFSET_PR_PID 24
3517 # define PRSTATUS_OFFSET_PR_REG 72
3518 # define ELF_GREGSET_T_SIZE 128
3519 # define PRPSINFO_SIZE 128
3520 # define PRPSINFO_OFFSET_PR_PID 16
3521 # define PRPSINFO_OFFSET_PR_FNAME 32
3522 # define PRPSINFO_OFFSET_PR_PSARGS 48
3523 #else
3524 # define PRSTATUS_SIZE 376
3525 # define PRSTATUS_OFFSET_PR_CURSIG 12
3526 # define PRSTATUS_OFFSET_PR_PID 32
3527 # define PRSTATUS_OFFSET_PR_REG 112
3528 # define ELF_GREGSET_T_SIZE 256
3529 # define PRPSINFO_SIZE 136
3530 # define PRPSINFO_OFFSET_PR_PID 24
3531 # define PRPSINFO_OFFSET_PR_FNAME 40
3532 # define PRPSINFO_OFFSET_PR_PSARGS 56
3533 #endif
3535 /* Support for core dump NOTE sections. */
3537 static bfd_boolean
3538 riscv_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3540 switch (note->descsz)
3542 default:
3543 return FALSE;
3545 case PRSTATUS_SIZE: /* sizeof(struct elf_prstatus) on Linux/RISC-V. */
3546 /* pr_cursig */
3547 elf_tdata (abfd)->core->signal
3548 = bfd_get_16 (abfd, note->descdata + PRSTATUS_OFFSET_PR_CURSIG);
3550 /* pr_pid */
3551 elf_tdata (abfd)->core->lwpid
3552 = bfd_get_32 (abfd, note->descdata + PRSTATUS_OFFSET_PR_PID);
3553 break;
3556 /* Make a ".reg/999" section. */
3557 return _bfd_elfcore_make_pseudosection (abfd, ".reg", ELF_GREGSET_T_SIZE,
3558 note->descpos + PRSTATUS_OFFSET_PR_REG);
3561 static bfd_boolean
3562 riscv_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3564 switch (note->descsz)
3566 default:
3567 return FALSE;
3569 case PRPSINFO_SIZE: /* sizeof(struct elf_prpsinfo) on Linux/RISC-V. */
3570 /* pr_pid */
3571 elf_tdata (abfd)->core->pid
3572 = bfd_get_32 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PID);
3574 /* pr_fname */
3575 elf_tdata (abfd)->core->program = _bfd_elfcore_strndup
3576 (abfd, note->descdata + PRPSINFO_OFFSET_PR_FNAME, 16);
3578 /* pr_psargs */
3579 elf_tdata (abfd)->core->command = _bfd_elfcore_strndup
3580 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PSARGS, 80);
3581 break;
3584 /* Note that for some reason, a spurious space is tacked
3585 onto the end of the args in some (at least one anyway)
3586 implementations, so strip it off if it exists. */
3589 char *command = elf_tdata (abfd)->core->command;
3590 int n = strlen (command);
3592 if (0 < n && command[n - 1] == ' ')
3593 command[n - 1] = '\0';
3596 return TRUE;
3599 /* Set the right mach type. */
3600 static bfd_boolean
3601 riscv_elf_object_p (bfd *abfd)
3603 /* There are only two mach types in RISCV currently. */
3604 if (strcmp (abfd->xvec->name, "elf32-littleriscv") == 0)
3605 bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv32);
3606 else
3607 bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv64);
3609 return TRUE;
3613 #define TARGET_LITTLE_SYM riscv_elfNN_vec
3614 #define TARGET_LITTLE_NAME "elfNN-littleriscv"
3616 #define elf_backend_reloc_type_class riscv_reloc_type_class
3618 #define bfd_elfNN_bfd_reloc_name_lookup riscv_reloc_name_lookup
3619 #define bfd_elfNN_bfd_link_hash_table_create riscv_elf_link_hash_table_create
3620 #define bfd_elfNN_bfd_reloc_type_lookup riscv_reloc_type_lookup
3621 #define bfd_elfNN_bfd_merge_private_bfd_data \
3622 _bfd_riscv_elf_merge_private_bfd_data
3624 #define elf_backend_copy_indirect_symbol riscv_elf_copy_indirect_symbol
3625 #define elf_backend_create_dynamic_sections riscv_elf_create_dynamic_sections
3626 #define elf_backend_check_relocs riscv_elf_check_relocs
3627 #define elf_backend_adjust_dynamic_symbol riscv_elf_adjust_dynamic_symbol
3628 #define elf_backend_size_dynamic_sections riscv_elf_size_dynamic_sections
3629 #define elf_backend_relocate_section riscv_elf_relocate_section
3630 #define elf_backend_finish_dynamic_symbol riscv_elf_finish_dynamic_symbol
3631 #define elf_backend_finish_dynamic_sections riscv_elf_finish_dynamic_sections
3632 #define elf_backend_gc_mark_hook riscv_elf_gc_mark_hook
3633 #define elf_backend_plt_sym_val riscv_elf_plt_sym_val
3634 #define elf_backend_grok_prstatus riscv_elf_grok_prstatus
3635 #define elf_backend_grok_psinfo riscv_elf_grok_psinfo
3636 #define elf_backend_object_p riscv_elf_object_p
3637 #define elf_info_to_howto_rel NULL
3638 #define elf_info_to_howto riscv_info_to_howto_rela
3639 #define bfd_elfNN_bfd_relax_section _bfd_riscv_relax_section
3641 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
3643 #define elf_backend_can_gc_sections 1
3644 #define elf_backend_can_refcount 1
3645 #define elf_backend_want_got_plt 1
3646 #define elf_backend_plt_readonly 1
3647 #define elf_backend_plt_alignment 4
3648 #define elf_backend_want_plt_sym 1
3649 #define elf_backend_got_header_size (ARCH_SIZE / 8)
3650 #define elf_backend_want_dynrelro 1
3651 #define elf_backend_rela_normal 1
3652 #define elf_backend_default_execstack 0
3654 #include "elfNN-target.h"