gdb: Make infrun.c:resume function static
[external/binutils.git] / bfd / elfnn-riscv.c
1 /* RISC-V-specific support for NN-bit ELF.
2    Copyright (C) 2011-2018 Free Software Foundation, Inc.
3
4    Contributed by Andrew Waterman (andrew@sifive.com).
5    Based on TILE-Gx and MIPS targets.
6
7    This file is part of BFD, the Binary File Descriptor library.
8
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.
13
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.
18
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/>.  */
22
23 /* This file handles RISC-V ELF targets.  */
24
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"
34
35 /* Internal relocations used exclusively by the relaxation pass.  */
36 #define R_RISCV_DELETE (R_RISCV_max + 1)
37
38 #define ARCH_SIZE NN
39
40 #define MINUS_ONE ((bfd_vma)0 - 1)
41
42 #define RISCV_ELF_LOG_WORD_BYTES (ARCH_SIZE == 32 ? 2 : 3)
43
44 #define RISCV_ELF_WORD_BYTES (1 << RISCV_ELF_LOG_WORD_BYTES)
45
46 /* The name of the dynamic interpreter.  This is put in the .interp
47    section.  */
48
49 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld.so.1"
50 #define ELF32_DYNAMIC_INTERPRETER "/lib32/ld.so.1"
51
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
57
58 /* RISC-V ELF linker hash entry.  */
59
60 struct riscv_elf_link_hash_entry
61 {
62   struct elf_link_hash_entry elf;
63
64   /* Track dynamic relocs copied for this symbol.  */
65   struct elf_dyn_relocs *dyn_relocs;
66
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;
73 };
74
75 #define riscv_elf_hash_entry(ent) \
76   ((struct riscv_elf_link_hash_entry *)(ent))
77
78 struct _bfd_riscv_elf_obj_tdata
79 {
80   struct elf_obj_tdata root;
81
82   /* tls_type for each local got entry.  */
83   char *local_got_tls_type;
84 };
85
86 #define _bfd_riscv_elf_tdata(abfd) \
87   ((struct _bfd_riscv_elf_obj_tdata *) (abfd)->tdata.any)
88
89 #define _bfd_riscv_elf_local_got_tls_type(abfd) \
90   (_bfd_riscv_elf_tdata (abfd)->local_got_tls_type)
91
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]))
95
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)
100
101 #include "elf/common.h"
102 #include "elf/internal.h"
103
104 struct riscv_elf_link_hash_table
105 {
106   struct elf_link_hash_table elf;
107
108   /* Short-cuts to get to dynamic linker sections.  */
109   asection *sdyntdata;
110
111   /* Small local sym to section mapping cache.  */
112   struct sym_cache sym_cache;
113
114   /* The max alignment of output sections.  */
115   bfd_vma max_alignment;
116 };
117
118
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)
123
124 static bfd_boolean
125 riscv_info_to_howto_rela (bfd *abfd,
126                           arelent *cache_ptr,
127                           Elf_Internal_Rela *dst)
128 {
129   cache_ptr->howto = riscv_elf_rtype_to_howto (abfd, ELFNN_R_TYPE (dst->r_info));
130   return cache_ptr->howto != NULL;
131 }
132
133 static void
134 riscv_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
135 {
136   const struct elf_backend_data *bed;
137   bfd_byte *loc;
138
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);
142 }
143
144 /* PLT/GOT stuff.  */
145
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)
150
151 #define GOT_ENTRY_SIZE RISCV_ELF_WORD_BYTES
152
153 #define GOTPLT_HEADER_SIZE (2 * GOT_ENTRY_SIZE)
154
155 #define sec_addr(sec) ((sec)->output_section->vma + (sec)->output_offset)
156
157 static bfd_vma
158 riscv_elf_got_plt_val (bfd_vma plt_index, struct bfd_link_info *info)
159 {
160   return sec_addr (riscv_elf_hash_table (info)->elf.sgotplt)
161          + GOTPLT_HEADER_SIZE + (plt_index * GOT_ENTRY_SIZE);
162 }
163
164 #if ARCH_SIZE == 32
165 # define MATCH_LREG MATCH_LW
166 #else
167 # define MATCH_LREG MATCH_LD
168 #endif
169
170 /* Generate a PLT header.  */
171
172 static void
173 riscv_make_plt_header (bfd_vma gotplt_addr, bfd_vma addr, uint32_t *entry)
174 {
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);
177
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 */
186
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);
195 }
196
197 /* Generate a PLT entry.  */
198
199 static void
200 riscv_make_plt_entry (bfd_vma got, bfd_vma addr, uint32_t *entry)
201 {
202   /* auipc  t3, %hi(.got.plt entry)
203      l[w|d] t3, %lo(.got.plt entry)(t3)
204      jalr   t1, t3
205      nop */
206
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;
211 }
212
213 /* Create an entry in an RISC-V ELF linker hash table.  */
214
215 static struct bfd_hash_entry *
216 link_hash_newfunc (struct bfd_hash_entry *entry,
217                    struct bfd_hash_table *table, const char *string)
218 {
219   /* Allocate the structure if it has not already been allocated by a
220      subclass.  */
221   if (entry == NULL)
222     {
223       entry =
224         bfd_hash_allocate (table,
225                            sizeof (struct riscv_elf_link_hash_entry));
226       if (entry == NULL)
227         return entry;
228     }
229
230   /* Call the allocation method of the superclass.  */
231   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
232   if (entry != NULL)
233     {
234       struct riscv_elf_link_hash_entry *eh;
235
236       eh = (struct riscv_elf_link_hash_entry *) entry;
237       eh->dyn_relocs = NULL;
238       eh->tls_type = GOT_UNKNOWN;
239     }
240
241   return entry;
242 }
243
244 /* Create a RISC-V ELF linker hash table.  */
245
246 static struct bfd_link_hash_table *
247 riscv_elf_link_hash_table_create (bfd *abfd)
248 {
249   struct riscv_elf_link_hash_table *ret;
250   bfd_size_type amt = sizeof (struct riscv_elf_link_hash_table);
251
252   ret = (struct riscv_elf_link_hash_table *) bfd_zmalloc (amt);
253   if (ret == NULL)
254     return NULL;
255
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))
259     {
260       free (ret);
261       return NULL;
262     }
263
264   ret->max_alignment = (bfd_vma) -1;
265   return &ret->elf.root;
266 }
267
268 /* Create the .got section.  */
269
270 static bfd_boolean
271 riscv_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
272 {
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);
278
279   /* This function may be called more than once.  */
280   if (htab->sgot != NULL)
281     return TRUE;
282
283   flags = bed->dynamic_sec_flags;
284
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;
294
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;
300
301   /* The first bit of the global offset table is the header.  */
302   s->size += bed->got_header_size;
303
304   if (bed->want_got_plt)
305     {
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;
312
313       /* Reserve room for the header.  */
314       s->size += GOTPLT_HEADER_SIZE;
315     }
316
317   if (bed->want_got_sym)
318     {
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;
328     }
329
330   return TRUE;
331 }
332
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.  */
336
337 static bfd_boolean
338 riscv_elf_create_dynamic_sections (bfd *dynobj,
339                                    struct bfd_link_info *info)
340 {
341   struct riscv_elf_link_hash_table *htab;
342
343   htab = riscv_elf_hash_table (info);
344   BFD_ASSERT (htab != NULL);
345
346   if (!riscv_elf_create_got_section (dynobj, info))
347     return FALSE;
348
349   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
350     return FALSE;
351
352   if (!bfd_link_pic (info))
353     {
354       htab->sdyntdata =
355         bfd_make_section_anyway_with_flags (dynobj, ".tdata.dyn",
356                                             (SEC_ALLOC | SEC_THREAD_LOCAL
357                                              | SEC_LINKER_CREATED));
358     }
359
360   if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss
361       || (!bfd_link_pic (info) && (!htab->elf.srelbss || !htab->sdyntdata)))
362     abort ();
363
364   return TRUE;
365 }
366
367 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
368
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)
373 {
374   struct riscv_elf_link_hash_entry *edir, *eind;
375
376   edir = (struct riscv_elf_link_hash_entry *) dir;
377   eind = (struct riscv_elf_link_hash_entry *) ind;
378
379   if (eind->dyn_relocs != NULL)
380     {
381       if (edir->dyn_relocs != NULL)
382         {
383           struct elf_dyn_relocs **pp;
384           struct elf_dyn_relocs *p;
385
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; )
389             {
390               struct elf_dyn_relocs *q;
391
392               for (q = edir->dyn_relocs; q != NULL; q = q->next)
393                 if (q->sec == p->sec)
394                   {
395                     q->pc_count += p->pc_count;
396                     q->count += p->count;
397                     *pp = p->next;
398                     break;
399                   }
400               if (q == NULL)
401                 pp = &p->next;
402             }
403           *pp = edir->dyn_relocs;
404         }
405
406       edir->dyn_relocs = eind->dyn_relocs;
407       eind->dyn_relocs = NULL;
408     }
409
410   if (ind->root.type == bfd_link_hash_indirect
411       && dir->got.refcount <= 0)
412     {
413       edir->tls_type = eind->tls_type;
414       eind->tls_type = GOT_UNKNOWN;
415     }
416   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
417 }
418
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)
422 {
423   char *new_tls_type = &_bfd_riscv_elf_tls_type (abfd, h, symndx);
424
425   *new_tls_type |= tls_type;
426   if ((*new_tls_type & GOT_NORMAL) && (*new_tls_type & ~GOT_NORMAL))
427     {
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;
432     }
433   return TRUE;
434 }
435
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)
439 {
440   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
441   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
442
443   if (htab->elf.sgot == NULL)
444     {
445       if (!riscv_elf_create_got_section (htab->elf.dynobj, info))
446         return FALSE;
447     }
448
449   if (h != NULL)
450     {
451       h->got.refcount += 1;
452       return TRUE;
453     }
454
455   /* This is a global offset table entry for a local symbol.  */
456   if (elf_local_got_refcounts (abfd) == NULL)
457     {
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);
463     }
464   elf_local_got_refcounts (abfd) [symndx] += 1;
465
466   return TRUE;
467 }
468
469 static bfd_boolean
470 bad_static_reloc (bfd *abfd, unsigned r_type, struct elf_link_hash_entry *h)
471 {
472   reloc_howto_type * r = riscv_elf_rtype_to_howto (abfd, r_type);
473
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;
481 }
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.  */
485
486 static bfd_boolean
487 riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
488                         asection *sec, const Elf_Internal_Rela *relocs)
489 {
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;
495
496   if (bfd_link_relocatable (info))
497     return TRUE;
498
499   htab = riscv_elf_hash_table (info);
500   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
501   sym_hashes = elf_sym_hashes (abfd);
502
503   if (htab->elf.dynobj == NULL)
504     htab->elf.dynobj = abfd;
505
506   for (rel = relocs; rel < relocs + sec->reloc_count; rel++)
507     {
508       unsigned int r_type;
509       unsigned int r_symndx;
510       struct elf_link_hash_entry *h;
511
512       r_symndx = ELFNN_R_SYM (rel->r_info);
513       r_type = ELFNN_R_TYPE (rel->r_info);
514
515       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
516         {
517           (*_bfd_error_handler) (_("%pB: bad symbol index: %d"),
518                                  abfd, r_symndx);
519           return FALSE;
520         }
521
522       if (r_symndx < symtab_hdr->sh_info)
523         h = NULL;
524       else
525         {
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;
530         }
531
532       switch (r_type)
533         {
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;
539
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;
547
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;
553
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.  */
560
561           if (h != NULL)
562             {
563               h->needs_plt = 1;
564               h->plt.refcount += 1;
565             }
566           break;
567
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;
578
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;
585
586         case R_RISCV_HI20:
587           if (bfd_link_pic (info))
588             return bad_static_reloc (abfd, r_type, h);
589           /* Fall through.  */
590
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.  */
597
598         static_reloc:
599           /* This reloc might not bind locally.  */
600           if (h != NULL)
601             h->non_got_ref = 1;
602
603           if (h != NULL && !bfd_link_pic (info))
604             {
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;
608             }
609
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.
626
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);
632
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)))
645             {
646               struct elf_dyn_relocs *p;
647               struct elf_dyn_relocs **head;
648
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)
653                 {
654                   sreloc = _bfd_elf_make_dynamic_reloc_section
655                     (sec, htab->elf.dynobj, RISCV_ELF_LOG_WORD_BYTES,
656                     abfd, /*rela?*/ TRUE);
657
658                   if (sreloc == NULL)
659                     return FALSE;
660                 }
661
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
667                 {
668                   /* Track dynamic relocs needed for local syms too.
669                      We really need local syms available to do this
670                      easily.  Oh well.  */
671
672                   asection *s;
673                   void *vpp;
674                   Elf_Internal_Sym *isym;
675
676                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
677                                                 abfd, r_symndx);
678                   if (isym == NULL)
679                     return FALSE;
680
681                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
682                   if (s == NULL)
683                     s = sec;
684
685                   vpp = &elf_section_data (s)->local_dynrel;
686                   head = (struct elf_dyn_relocs **) vpp;
687                 }
688
689               p = *head;
690               if (p == NULL || p->sec != sec)
691                 {
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;
702                 }
703
704               p->count += 1;
705               p->pc_count += r == NULL ? 0 : r->pc_relative;
706             }
707
708           break;
709
710         case R_RISCV_GNU_VTINHERIT:
711           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
712             return FALSE;
713           break;
714
715         case R_RISCV_GNU_VTENTRY:
716           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
717             return FALSE;
718           break;
719
720         default:
721           break;
722         }
723     }
724
725   return TRUE;
726 }
727
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)
734 {
735   if (h != NULL)
736     switch (ELFNN_R_TYPE (rel->r_info))
737       {
738       case R_RISCV_GNU_VTINHERIT:
739       case R_RISCV_GNU_VTENTRY:
740         return NULL;
741       }
742
743   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
744 }
745
746 /* Find dynamic relocs for H that apply to read-only sections.  */
747
748 static asection *
749 readonly_dynrelocs (struct elf_link_hash_entry *h)
750 {
751   struct elf_dyn_relocs *p;
752
753   for (p = riscv_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
754     {
755       asection *s = p->sec->output_section;
756
757       if (s != NULL && (s->flags & SEC_READONLY) != 0)
758         return p->sec;
759     }
760   return NULL;
761 }
762
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.  */
768
769 static bfd_boolean
770 riscv_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
771                                  struct elf_link_hash_entry *h)
772 {
773   struct riscv_elf_link_hash_table *htab;
774   struct riscv_elf_link_hash_entry * eh;
775   bfd *dynobj;
776   asection *s, *srel;
777
778   htab = riscv_elf_hash_table (info);
779   BFD_ASSERT (htab != NULL);
780
781   dynobj = htab->elf.dynobj;
782
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)));
791
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)
796     {
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))
801         {
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;
808         }
809
810       return TRUE;
811     }
812   else
813     h->plt.offset = (bfd_vma) -1;
814
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)
819     {
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;
825     }
826
827   /* This is a reference to a symbol defined by a dynamic object which
828      is not a function.  */
829
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;
836
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;
841
842   /* If -z nocopyreloc was given, we won't generate them either.  */
843   if (info->nocopyreloc)
844     {
845       h->non_got_ref = 0;
846       return TRUE;
847     }
848
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))
852     {
853       h->non_got_ref = 0;
854       return TRUE;
855     }
856
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.  */
866
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)
873     {
874       s = htab->sdyntdata;
875       srel = htab->elf.srelbss;
876     }
877   else if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
878     {
879       s = htab->elf.sdynrelro;
880       srel = htab->elf.sreldynrelro;
881     }
882   else
883     {
884       s = htab->elf.sdynbss;
885       srel = htab->elf.srelbss;
886     }
887   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
888     {
889       srel->size += sizeof (ElfNN_External_Rela);
890       h->needs_copy = 1;
891     }
892
893   return _bfd_elf_adjust_dynamic_copy (info, h, s);
894 }
895
896 /* Allocate space in .plt, .got and associated reloc sections for
897    dynamic relocs.  */
898
899 static bfd_boolean
900 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
901 {
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;
906
907   if (h->root.type == bfd_link_hash_indirect)
908     return TRUE;
909
910   info = (struct bfd_link_info *) inf;
911   htab = riscv_elf_hash_table (info);
912   BFD_ASSERT (htab != NULL);
913
914   if (htab->elf.dynamic_sections_created
915       && h->plt.refcount > 0)
916     {
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)
921         {
922           if (! bfd_elf_link_record_dynamic_symbol (info, h))
923             return FALSE;
924         }
925
926       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
927         {
928           asection *s = htab->elf.splt;
929
930           if (s->size == 0)
931             s->size = PLT_HEADER_SIZE;
932
933           h->plt.offset = s->size;
934
935           /* Make room for this entry.  */
936           s->size += PLT_ENTRY_SIZE;
937
938           /* We also need to make an entry in the .got.plt section.  */
939           htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
940
941           /* We also need to make an entry in the .rela.plt section.  */
942           htab->elf.srelplt->size += sizeof (ElfNN_External_Rela);
943
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)
951             {
952               h->root.u.def.section = s;
953               h->root.u.def.value = h->plt.offset;
954             }
955         }
956       else
957         {
958           h->plt.offset = (bfd_vma) -1;
959           h->needs_plt = 0;
960         }
961     }
962   else
963     {
964       h->plt.offset = (bfd_vma) -1;
965       h->needs_plt = 0;
966     }
967
968   if (h->got.refcount > 0)
969     {
970       asection *s;
971       bfd_boolean dyn;
972       int tls_type = riscv_elf_hash_entry (h)->tls_type;
973
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)
978         {
979           if (! bfd_elf_link_record_dynamic_symbol (info, h))
980             return FALSE;
981         }
982
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))
987         {
988           /* TLS_GD needs two dynamic relocs and two GOT slots.  */
989           if (tls_type & GOT_TLS_GD)
990             {
991               s->size += 2 * RISCV_ELF_WORD_BYTES;
992               htab->elf.srelgot->size += 2 * sizeof (ElfNN_External_Rela);
993             }
994
995           /* TLS_IE needs one dynamic reloc and one GOT slot.  */
996           if (tls_type & GOT_TLS_IE)
997             {
998               s->size += RISCV_ELF_WORD_BYTES;
999               htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
1000             }
1001         }
1002       else
1003         {
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);
1008         }
1009     }
1010   else
1011     h->got.offset = (bfd_vma) -1;
1012
1013   eh = (struct riscv_elf_link_hash_entry *) h;
1014   if (eh->dyn_relocs == NULL)
1015     return TRUE;
1016
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.  */
1022
1023   if (bfd_link_pic (info))
1024     {
1025       if (SYMBOL_CALLS_LOCAL (info, h))
1026         {
1027           struct elf_dyn_relocs **pp;
1028
1029           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1030             {
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;
1037             }
1038         }
1039
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)
1044         {
1045           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1046               || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
1047             eh->dyn_relocs = NULL;
1048
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)
1053             {
1054               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1055                 return FALSE;
1056             }
1057         }
1058     }
1059   else
1060     {
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.  */
1064
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))))
1071         {
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)
1076             {
1077               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1078                 return FALSE;
1079             }
1080
1081           /* If that succeeded, we know we'll be keeping all the
1082              relocs.  */
1083           if (h->dynindx != -1)
1084             goto keep;
1085         }
1086
1087       eh->dyn_relocs = NULL;
1088
1089     keep: ;
1090     }
1091
1092   /* Finally, allocate space.  */
1093   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1094     {
1095       asection *sreloc = elf_section_data (p->sec)->sreloc;
1096       sreloc->size += p->count * sizeof (ElfNN_External_Rela);
1097     }
1098
1099   return TRUE;
1100 }
1101
1102 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
1103    read-only sections.  */
1104
1105 static bfd_boolean
1106 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
1107 {
1108   asection *sec;
1109
1110   if (h->root.type == bfd_link_hash_indirect)
1111     return TRUE;
1112
1113   sec = readonly_dynrelocs (h);
1114   if (sec != NULL)
1115     {
1116       struct bfd_link_info *info = (struct bfd_link_info *) info_p;
1117
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);
1122
1123       /* Not an error, just cut short the traversal.  */
1124       return FALSE;
1125     }
1126   return TRUE;
1127 }
1128
1129 static bfd_boolean
1130 riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1131 {
1132   struct riscv_elf_link_hash_table *htab;
1133   bfd *dynobj;
1134   asection *s;
1135   bfd *ibfd;
1136
1137   htab = riscv_elf_hash_table (info);
1138   BFD_ASSERT (htab != NULL);
1139   dynobj = htab->elf.dynobj;
1140   BFD_ASSERT (dynobj != NULL);
1141
1142   if (elf_hash_table (info)->dynamic_sections_created)
1143     {
1144       /* Set the contents of the .interp section to the interpreter.  */
1145       if (bfd_link_executable (info) && !info->nointerp)
1146         {
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;
1151         }
1152     }
1153
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)
1157     {
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;
1164
1165       if (! is_riscv_elf (ibfd))
1166         continue;
1167
1168       for (s = ibfd->sections; s != NULL; s = s->next)
1169         {
1170           struct elf_dyn_relocs *p;
1171
1172           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
1173             {
1174               if (!bfd_is_abs_section (p->sec)
1175                   && bfd_is_abs_section (p->sec->output_section))
1176                 {
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.  */
1181                 }
1182               else if (p->count != 0)
1183                 {
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;
1188                 }
1189             }
1190         }
1191
1192       local_got = elf_local_got_refcounts (ibfd);
1193       if (!local_got)
1194         continue;
1195
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)
1203         {
1204           if (*local_got > 0)
1205             {
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);
1213             }
1214           else
1215             *local_got = (bfd_vma) -1;
1216         }
1217     }
1218
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);
1222
1223   if (htab->elf.sgotplt)
1224     {
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);
1229
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;
1241     }
1242
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)
1247     {
1248       if ((s->flags & SEC_LINKER_CREATED) == 0)
1249         continue;
1250
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)
1256         {
1257           /* Strip this section if we don't need it; see the
1258              comment below.  */
1259         }
1260       else if (strncmp (s->name, ".rela", 5) == 0)
1261         {
1262           if (s->size != 0)
1263             {
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;
1267             }
1268         }
1269       else
1270         {
1271           /* It's not one of our sections.  */
1272           continue;
1273         }
1274
1275       if (s->size == 0)
1276         {
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;
1288         }
1289
1290       if ((s->flags & SEC_HAS_CONTENTS) == 0)
1291         continue;
1292
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;
1299     }
1300
1301   if (elf_hash_table (info)->dynamic_sections_created)
1302     {
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)
1310
1311       if (bfd_link_executable (info))
1312         {
1313           if (!add_dynamic_entry (DT_DEBUG, 0))
1314             return FALSE;
1315         }
1316
1317       if (htab->elf.srelplt->size != 0)
1318         {
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;
1324         }
1325
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;
1330
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);
1335
1336       if (info->flags & DF_TEXTREL)
1337         {
1338           if (!add_dynamic_entry (DT_TEXTREL, 0))
1339             return FALSE;
1340         }
1341     }
1342 #undef add_dynamic_entry
1343
1344   return TRUE;
1345 }
1346
1347 #define TP_OFFSET 0
1348 #define DTP_OFFSET 0x800
1349
1350 /* Return the relocation value for a TLS dtp-relative reloc.  */
1351
1352 static bfd_vma
1353 dtpoff (struct bfd_link_info *info, bfd_vma address)
1354 {
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;
1359 }
1360
1361 /* Return the relocation value for a static TLS tp-relative relocation.  */
1362
1363 static bfd_vma
1364 tpoff (struct bfd_link_info *info, bfd_vma address)
1365 {
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;
1370 }
1371
1372 /* Return the global pointer's value, or 0 if it is not in use.  */
1373
1374 static bfd_vma
1375 riscv_global_pointer_value (struct bfd_link_info *info)
1376 {
1377   struct bfd_link_hash_entry *h;
1378
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;
1382
1383   return h->u.def.value + sec_addr (h->u.def.section);
1384 }
1385
1386 /* Emplace a static relocation.  */
1387
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)
1395 {
1396   if (howto->pc_relative)
1397     value -= sec_addr (input_section) + rel->r_offset;
1398   value += rel->r_addend;
1399
1400   switch (ELFNN_R_TYPE (rel->r_info))
1401     {
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;
1412
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;
1420
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;
1428
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;
1436
1437     case R_RISCV_JAL:
1438       if (!VALID_UJTYPE_IMM (value))
1439         return bfd_reloc_overflow;
1440       value = ENCODE_UJTYPE_IMM (value);
1441       break;
1442
1443     case R_RISCV_BRANCH:
1444       if (!VALID_SBTYPE_IMM (value))
1445         return bfd_reloc_overflow;
1446       value = ENCODE_SBTYPE_IMM (value);
1447       break;
1448
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;
1454
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;
1460
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;
1466
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;
1486
1487     case R_RISCV_DELETE:
1488       return bfd_reloc_ok;
1489
1490     default:
1491       return bfd_reloc_notsupported;
1492     }
1493
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);
1497
1498   return bfd_reloc_ok;
1499 }
1500
1501 /* Remember all PC-relative high-part relocs we've encountered to help us
1502    later resolve the corresponding low-part relocs.  */
1503
1504 typedef struct
1505 {
1506   bfd_vma address;
1507   bfd_vma value;
1508 } riscv_pcrel_hi_reloc;
1509
1510 typedef struct riscv_pcrel_lo_reloc
1511 {
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;
1521
1522 typedef struct
1523 {
1524   htab_t hi_relocs;
1525   riscv_pcrel_lo_reloc *lo_relocs;
1526 } riscv_pcrel_relocs;
1527
1528 static hashval_t
1529 riscv_pcrel_reloc_hash (const void *entry)
1530 {
1531   const riscv_pcrel_hi_reloc *e = entry;
1532   return (hashval_t)(e->address >> 2);
1533 }
1534
1535 static bfd_boolean
1536 riscv_pcrel_reloc_eq (const void *entry1, const void *entry2)
1537 {
1538   const riscv_pcrel_hi_reloc *e1 = entry1, *e2 = entry2;
1539   return e1->address == e2->address;
1540 }
1541
1542 static bfd_boolean
1543 riscv_init_pcrel_relocs (riscv_pcrel_relocs *p)
1544 {
1545
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;
1550 }
1551
1552 static void
1553 riscv_free_pcrel_relocs (riscv_pcrel_relocs *p)
1554 {
1555   riscv_pcrel_lo_reloc *cur = p->lo_relocs;
1556
1557   while (cur != NULL)
1558     {
1559       riscv_pcrel_lo_reloc *next = cur->next;
1560       free (cur);
1561       cur = next;
1562     }
1563
1564   htab_delete (p->hi_relocs);
1565 }
1566
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)
1575 {
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;
1585
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;
1591
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;
1597
1598   rel->r_info = ELFNN_R_INFO(addr, R_RISCV_HI20);
1599
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;
1604 }
1605
1606 static bfd_boolean
1607 riscv_record_pcrel_hi_reloc (riscv_pcrel_relocs *p, bfd_vma addr,
1608                              bfd_vma value, bfd_boolean absolute)
1609 {
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);
1614
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;
1621 }
1622
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)
1632 {
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;
1641 }
1642
1643 static bfd_boolean
1644 riscv_resolve_pcrel_lo_relocs (riscv_pcrel_relocs *p)
1645 {
1646   riscv_pcrel_lo_reloc *r;
1647
1648   for (r = p->lo_relocs; r != NULL; r = r->next)
1649     {
1650       bfd *input_bfd = r->input_section->owner;
1651
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)
1655         {
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;
1660         }
1661
1662       perform_relocation (r->howto, r->reloc, entry->value, r->input_section,
1663                           input_bfd, r->contents);
1664     }
1665
1666   return TRUE;
1667 }
1668
1669 /* Relocate a RISC-V ELF section.
1670
1671    The RELOCATE_SECTION function is called by the new ELF backend linker
1672    to handle the relocations for a section.
1673
1674    The relocs are always passed as Rela structures.
1675
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.
1679
1680    This function does not have to worry about setting the reloc
1681    address or the reloc symbol index.
1682
1683    LOCAL_SYMS is a pointer to the swapped in local symbols.
1684
1685    LOCAL_SECTIONS is an array giving the section in the input file
1686    corresponding to the st_shndx field of each local symbol.
1687
1688    The global hash table entry for the global symbols can be found
1689    via elf_sym_hashes (input_bfd).
1690
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.  */
1696
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)
1706 {
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;
1717
1718   if (!riscv_init_pcrel_relocs (&pcrel_relocs))
1719     return FALSE;
1720
1721   relend = relocs + input_section->reloc_count;
1722   for (rel = relocs; rel < relend; rel++)
1723     {
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;
1738
1739       if (howto == NULL
1740           || r_type == R_RISCV_GNU_VTINHERIT || r_type == R_RISCV_GNU_VTENTRY)
1741         continue;
1742
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)
1750         {
1751           sym = local_syms + r_symndx;
1752           sec = local_sections[r_symndx];
1753           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1754         }
1755       else
1756         {
1757           bfd_boolean warned, ignored;
1758
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)
1764             {
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;
1772             }
1773         }
1774
1775       if (sec != NULL && discarded_section (sec))
1776         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1777                                          rel, 1, relend, howto, 0, contents);
1778
1779       if (bfd_link_relocatable (info))
1780         continue;
1781
1782       if (h != NULL)
1783         name = h->root.root.string;
1784       else
1785         {
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);
1790         }
1791
1792       resolved_to_zero = (h != NULL
1793                           && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
1794
1795       switch (r_type)
1796         {
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;
1805
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;
1820
1821         case R_RISCV_GOT_HI20:
1822           if (h != NULL)
1823             {
1824               bfd_boolean dyn, pic;
1825
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);
1830
1831               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
1832                   || (pic && SYMBOL_REFERENCES_LOCAL (info, h)))
1833                 {
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.
1842
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
1849                     {
1850                       bfd_put_NN (output_bfd, relocation,
1851                                   htab->elf.sgot->contents + off);
1852                       h->got.offset |= 1;
1853                     }
1854                 }
1855               else
1856                 unresolved_reloc = FALSE;
1857             }
1858           else
1859             {
1860               BFD_ASSERT (local_got_offsets != NULL
1861                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
1862
1863               off = local_got_offsets[r_symndx];
1864
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
1871                 {
1872                   if (bfd_link_pic (info))
1873                     {
1874                       asection *s;
1875                       Elf_Internal_Rela outrel;
1876
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);
1881
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);
1888                     }
1889
1890                   bfd_put_NN (output_bfd, relocation,
1891                               htab->elf.sgot->contents + off);
1892                   local_got_offsets[r_symndx] |= 1;
1893                 }
1894             }
1895           relocation = sec_addr (htab->elf.sgot) + off;
1896           absolute = riscv_zero_pcrel_hi_reloc (rel,
1897                                                 info,
1898                                                 pc,
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;
1911
1912         case R_RISCV_ADD8:
1913         case R_RISCV_ADD16:
1914         case R_RISCV_ADD32:
1915         case R_RISCV_ADD64:
1916           {
1917             bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1918                                          contents + rel->r_offset);
1919             relocation = old_value + relocation;
1920           }
1921           break;
1922
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:
1928           {
1929             bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1930                                          contents + rel->r_offset);
1931             relocation = old_value - relocation;
1932           }
1933           break;
1934
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)
1940             {
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;
1949             }
1950           /* Fall through.  */
1951
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)
1956             {
1957               /* Refer to the PLT entry.  */
1958               relocation = sec_addr (htab->elf.splt) + h->plt.offset;
1959               unresolved_reloc = FALSE;
1960             }
1961           break;
1962
1963         case R_RISCV_TPREL_HI20:
1964           relocation = tpoff (info, relocation);
1965           break;
1966
1967         case R_RISCV_TPREL_LO12_I:
1968         case R_RISCV_TPREL_LO12_S:
1969           relocation = tpoff (info, relocation);
1970           break;
1971
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))
1976             {
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);
1982             }
1983           else
1984             r = bfd_reloc_overflow;
1985           break;
1986
1987         case R_RISCV_GPREL_I:
1988         case R_RISCV_GPREL_S:
1989           {
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))
1993               {
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)
1998                   {
1999                     rel->r_addend -= gp;
2000                     insn |= X_GP << OP_SH_RS1;
2001                   }
2002                 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
2003               }
2004             else
2005               r = bfd_reloc_overflow;
2006             break;
2007           }
2008
2009         case R_RISCV_PCREL_HI20:
2010           absolute = riscv_zero_pcrel_hi_reloc (rel,
2011                                                 info,
2012                                                 pc,
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;
2026
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)
2034             {
2035               r = bfd_reloc_dangerous;
2036               break;
2037             }
2038
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;
2045
2046         case R_RISCV_TLS_DTPREL32:
2047         case R_RISCV_TLS_DTPREL64:
2048           relocation = dtpoff (info, relocation);
2049           break;
2050
2051         case R_RISCV_32:
2052         case R_RISCV_64:
2053           if ((input_section->flags & SEC_ALLOC) == 0)
2054             break;
2055
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)))
2071             {
2072               Elf_Internal_Rela outrel;
2073               bfd_boolean skip_static_relocation, skip_dynamic_relocation;
2074
2075               /* When generating a shared object, these relocations
2076                  are copied into the output file to be resolved at run
2077                  time.  */
2078
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);
2085
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))
2092                 {
2093                   outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
2094                   outrel.r_addend = rel->r_addend;
2095                 }
2096               else
2097                 {
2098                   outrel.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2099                   outrel.r_addend = relocation + rel->r_addend;
2100                 }
2101
2102               riscv_elf_append_rela (output_bfd, sreloc, &outrel);
2103               if (skip_static_relocation)
2104                 continue;
2105             }
2106           break;
2107
2108         case R_RISCV_TLS_GOT_HI20:
2109           is_ie = TRUE;
2110           /* Fall through.  */
2111
2112         case R_RISCV_TLS_GD_HI20:
2113           if (h != NULL)
2114             {
2115               off = h->got.offset;
2116               h->got.offset |= 1;
2117             }
2118           else
2119             {
2120               off = local_got_offsets[r_symndx];
2121               local_got_offsets[r_symndx] |= 1;
2122             }
2123
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;
2131
2132           if ((off & 1) != 0)
2133             off &= ~1;
2134           else
2135             {
2136               Elf_Internal_Rela outrel;
2137               int indx = 0;
2138               bfd_boolean need_relocs = FALSE;
2139
2140               if (htab->elf.srelgot == NULL)
2141                 abort ();
2142
2143               if (h != NULL)
2144                 {
2145                   bfd_boolean dyn, pic;
2146                   dyn = htab->elf.dynamic_sections_created;
2147                   pic = bfd_link_pic (info);
2148
2149                   if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
2150                       && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
2151                     indx = h->dynindx;
2152                 }
2153
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;
2161
2162               if (tls_type & GOT_TLS_GD)
2163                 {
2164                   if (need_relocs)
2165                     {
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)
2173                         {
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));
2179                         }
2180                       else
2181                         {
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);
2188                         }
2189                     }
2190                   else
2191                     {
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));
2203                    }
2204                 }
2205
2206               if (tls_type & GOT_TLS_IE)
2207                 {
2208                   if (need_relocs)
2209                     {
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);
2219                     }
2220                   else
2221                     {
2222                       bfd_put_NN (output_bfd, tpoff (info, relocation),
2223                                   htab->elf.sgot->contents + off + ie_off);
2224                     }
2225                 }
2226             }
2227
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;
2235
2236         default:
2237           r = bfd_reloc_notsupported;
2238         }
2239
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)
2248         {
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;
2258         }
2259
2260       if (r == bfd_reloc_ok)
2261         r = perform_relocation (howto, rel, relocation, input_section,
2262                                 input_bfd, contents);
2263
2264       switch (r)
2265         {
2266         case bfd_reloc_ok:
2267           continue;
2268
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;
2274
2275         case bfd_reloc_undefined:
2276           info->callbacks->undefined_symbol
2277             (info, name, input_bfd, input_section, rel->r_offset,
2278              TRUE);
2279           break;
2280
2281         case bfd_reloc_outofrange:
2282           msg = _("%X%P: internal error: out of range error\n");
2283           break;
2284
2285         case bfd_reloc_notsupported:
2286           msg = _("%X%P: internal error: unsupported relocation error\n");
2287           break;
2288
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;
2294
2295         default:
2296           msg = _("%X%P: internal error: unknown error\n");
2297           break;
2298         }
2299
2300       if (msg)
2301         info->callbacks->einfo (msg);
2302
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;
2307     }
2308
2309   ret = riscv_resolve_pcrel_lo_relocs (&pcrel_relocs);
2310 out:
2311   riscv_free_pcrel_relocs (&pcrel_relocs);
2312   return ret;
2313 }
2314
2315 /* Finish up dynamic symbol handling.  We set the contents of various
2316    dynamic sections here.  */
2317
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)
2323 {
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);
2326
2327   if (h->plt.offset != (bfd_vma) -1)
2328     {
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;
2334
2335       BFD_ASSERT (h->dynindx != -1);
2336
2337       /* Calculate the address of the PLT header.  */
2338       header_address = sec_addr (htab->elf.splt);
2339
2340       /* Calculate the index of the entry.  */
2341       plt_idx = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
2342
2343       /* Calculate the address of the .got.plt entry.  */
2344       got_address = riscv_elf_got_plt_val (plt_idx, info);
2345
2346       /* Find out where the .plt entry should go.  */
2347       loc = htab->elf.splt->contents + h->plt.offset;
2348
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);
2354
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);
2359
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);
2364
2365       loc = htab->elf.srelplt->contents + plt_idx * sizeof (ElfNN_External_Rela);
2366       bed->s->swap_reloca_out (output_bfd, &rela, loc);
2367
2368       if (!h->def_regular)
2369         {
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;
2379         }
2380     }
2381
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))
2385     {
2386       asection *sgot;
2387       asection *srela;
2388       Elf_Internal_Rela rela;
2389
2390       /* This symbol has an entry in the GOT.  Set it up.  */
2391
2392       sgot = htab->elf.sgot;
2393       srela = htab->elf.srelgot;
2394       BFD_ASSERT (sgot != NULL && srela != NULL);
2395
2396       rela.r_offset = sec_addr (sgot) + (h->got.offset &~ (bfd_vma) 1);
2397
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))
2405         {
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);
2412         }
2413       else
2414         {
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;
2419         }
2420
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);
2424     }
2425
2426   if (h->needs_copy)
2427     {
2428       Elf_Internal_Rela rela;
2429       asection *s;
2430
2431       /* This symbols needs a copy reloc.  Set it up.  */
2432       BFD_ASSERT (h->dynindx != -1);
2433
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);
2442     }
2443
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;
2448
2449   return TRUE;
2450 }
2451
2452 /* Finish up the dynamic sections.  */
2453
2454 static bfd_boolean
2455 riscv_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
2456                   bfd *dynobj, asection *sdyn)
2457 {
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;
2462
2463   dynconend = sdyn->contents + sdyn->size;
2464   for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
2465     {
2466       Elf_Internal_Dyn dyn;
2467       asection *s;
2468
2469       bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
2470
2471       switch (dyn.d_tag)
2472         {
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;
2487         }
2488
2489       bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
2490     }
2491   return TRUE;
2492 }
2493
2494 static bfd_boolean
2495 riscv_elf_finish_dynamic_sections (bfd *output_bfd,
2496                                    struct bfd_link_info *info)
2497 {
2498   bfd *dynobj;
2499   asection *sdyn;
2500   struct riscv_elf_link_hash_table *htab;
2501
2502   htab = riscv_elf_hash_table (info);
2503   BFD_ASSERT (htab != NULL);
2504   dynobj = htab->elf.dynobj;
2505
2506   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
2507
2508   if (elf_hash_table (info)->dynamic_sections_created)
2509     {
2510       asection *splt;
2511       bfd_boolean ret;
2512
2513       splt = htab->elf.splt;
2514       BFD_ASSERT (splt != NULL && sdyn != NULL);
2515
2516       ret = riscv_finish_dyn (output_bfd, info, dynobj, sdyn);
2517
2518       if (!ret)
2519         return ret;
2520
2521       /* Fill in the head and tail entries in the procedure linkage table.  */
2522       if (splt->size > 0)
2523         {
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);
2528
2529           for (i = 0; i < PLT_HEADER_INSNS; i++)
2530             bfd_put_32 (output_bfd, plt_header[i], splt->contents + 4*i);
2531
2532           elf_section_data (splt->output_section)->this_hdr.sh_entsize
2533             = PLT_ENTRY_SIZE;
2534         }
2535     }
2536
2537   if (htab->elf.sgotplt)
2538     {
2539       asection *output_section = htab->elf.sgotplt->output_section;
2540
2541       if (bfd_is_abs_section (output_section))
2542         {
2543           (*_bfd_error_handler)
2544             (_("discarded output section: `%pA'"), htab->elf.sgotplt);
2545           return FALSE;
2546         }
2547
2548       if (htab->elf.sgotplt->size > 0)
2549         {
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);
2555         }
2556
2557       elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2558     }
2559
2560   if (htab->elf.sgot)
2561     {
2562       asection *output_section = htab->elf.sgot->output_section;
2563
2564       if (htab->elf.sgot->size > 0)
2565         {
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);
2570         }
2571
2572       elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2573     }
2574
2575   return TRUE;
2576 }
2577
2578 /* Return address for Ith PLT stub in section PLT, for relocation REL
2579    or (bfd_vma) -1 if it should not be included.  */
2580
2581 static bfd_vma
2582 riscv_elf_plt_sym_val (bfd_vma i, const asection *plt,
2583                        const arelent *rel ATTRIBUTE_UNUSED)
2584 {
2585   return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
2586 }
2587
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)
2592 {
2593   switch (ELFNN_R_TYPE (rela->r_info))
2594     {
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;
2603     }
2604 }
2605
2606 /* Merge backend specific data from an object file to the output
2607    object file when linking.  */
2608
2609 static bfd_boolean
2610 _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2611 {
2612   bfd *obfd = info->output_bfd;
2613   flagword new_flags = elf_elfheader (ibfd)->e_flags;
2614   flagword old_flags = elf_elfheader (obfd)->e_flags;
2615
2616   if (!is_riscv_elf (ibfd) || !is_riscv_elf (obfd))
2617     return TRUE;
2618
2619   if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
2620     {
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;
2626     }
2627
2628   if (!_bfd_elf_merge_object_attributes (ibfd, info))
2629     return FALSE;
2630
2631   if (! elf_flags_init (obfd))
2632     {
2633       elf_flags_init (obfd) = TRUE;
2634       elf_elfheader (obfd)->e_flags = new_flags;
2635       return TRUE;
2636     }
2637
2638   /* Disallow linking different float ABIs.  */
2639   if ((old_flags ^ new_flags) & EF_RISCV_FLOAT_ABI)
2640     {
2641       (*_bfd_error_handler)
2642         (_("%pB: can't link hard-float modules with soft-float modules"), ibfd);
2643       goto fail;
2644     }
2645
2646   /* Disallow linking RVE and non-RVE.  */
2647   if ((old_flags ^ new_flags) & EF_RISCV_RVE)
2648     {
2649       (*_bfd_error_handler)
2650        (_("%pB: can't link RVE with other target"), ibfd);
2651       goto fail;
2652     }
2653
2654   /* Allow linking RVC and non-RVC, and keep the RVC flag.  */
2655   elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC;
2656
2657   return TRUE;
2658
2659 fail:
2660   bfd_set_error (bfd_error_bad_value);
2661   return FALSE;
2662 }
2663
2664 /* Delete some bytes from a section while relaxing.  */
2665
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)
2669 {
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;
2677
2678   /* Actually delete the bytes.  */
2679   sec->size -= count;
2680   memmove (contents + addr, contents + addr + count, toaddr - addr - count);
2681
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;
2688
2689   /* Adjust the local symbols defined in this section.  */
2690   for (i = 0; i < symtab_hdr->sh_info; i++)
2691     {
2692       Elf_Internal_Sym *sym = (Elf_Internal_Sym *) symtab_hdr->contents + i;
2693       if (sym->st_shndx == sec_shndx)
2694         {
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;
2699
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.
2703
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;
2713         }
2714     }
2715
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);
2719
2720   for (i = 0; i < symcount; i++)
2721     {
2722       struct elf_link_hash_entry *sym_hash = sym_hashes[i];
2723
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)
2735         {
2736           struct elf_link_hash_entry **cur_sym_hashes;
2737
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++)
2741             {
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;
2746             }
2747           /* Don't adjust the symbol again.  */
2748           if (cur_sym_hashes < &sym_hashes[i])
2749             continue;
2750         }
2751
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)
2755         {
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;
2760
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;
2766         }
2767     }
2768
2769   return TRUE;
2770 }
2771
2772 /* A second format for recording PC-relative hi relocations.  This stores the
2773    information required to relax them to GP-relative addresses.  */
2774
2775 typedef struct riscv_pcgp_hi_reloc riscv_pcgp_hi_reloc;
2776 struct riscv_pcgp_hi_reloc
2777 {
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;
2784 };
2785
2786 typedef struct riscv_pcgp_lo_reloc riscv_pcgp_lo_reloc;
2787 struct riscv_pcgp_lo_reloc
2788 {
2789   bfd_vma hi_sec_off;
2790   riscv_pcgp_lo_reloc *next;
2791 };
2792
2793 typedef struct
2794 {
2795   riscv_pcgp_hi_reloc *hi;
2796   riscv_pcgp_lo_reloc *lo;
2797 } riscv_pcgp_relocs;
2798
2799 static bfd_boolean
2800 riscv_init_pcgp_relocs (riscv_pcgp_relocs *p)
2801 {
2802   p->hi = NULL;
2803   p->lo = NULL;
2804   return TRUE;
2805 }
2806
2807 static void
2808 riscv_free_pcgp_relocs (riscv_pcgp_relocs *p,
2809                         bfd *abfd ATTRIBUTE_UNUSED,
2810                         asection *sec ATTRIBUTE_UNUSED)
2811 {
2812   riscv_pcgp_hi_reloc *c;
2813   riscv_pcgp_lo_reloc *l;
2814
2815   for (c = p->hi; c != NULL;)
2816     {
2817       riscv_pcgp_hi_reloc *next = c->next;
2818       free (c);
2819       c = next;
2820     }
2821
2822   for (l = p->lo; l != NULL;)
2823     {
2824       riscv_pcgp_lo_reloc *next = l->next;
2825       free (l);
2826       l = next;
2827     }
2828 }
2829
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)
2834 {
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;
2846 }
2847
2848 static riscv_pcgp_hi_reloc *
2849 riscv_find_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2850 {
2851   riscv_pcgp_hi_reloc *c;
2852
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;
2857 }
2858
2859 static bfd_boolean
2860 riscv_delete_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2861 {
2862   bfd_boolean out = FALSE;
2863   riscv_pcgp_hi_reloc *c;
2864
2865   for (c = p->hi; c != NULL; c = c->next)
2866       if (c->hi_sec_off == hi_sec_off)
2867         out = TRUE;
2868
2869   return out;
2870 }
2871
2872 static bfd_boolean
2873 riscv_use_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2874 {
2875   bfd_boolean out = FALSE;
2876   riscv_pcgp_hi_reloc *c;
2877
2878   for (c = p->hi; c != NULL; c = c->next)
2879     if (c->hi_sec_off == hi_sec_off)
2880       out = TRUE;
2881
2882   return out;
2883 }
2884
2885 static bfd_boolean
2886 riscv_record_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2887 {
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;
2895 }
2896
2897 static bfd_boolean
2898 riscv_find_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2899 {
2900   riscv_pcgp_lo_reloc *c;
2901
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;
2906 }
2907
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)
2912 {
2913   return TRUE;
2914 }
2915
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 *);
2921
2922 /* Relax AUIPC + JALR into JAL.  */
2923
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)
2933 {
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;
2939
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);
2944
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;
2948
2949   /* Shorten the function call.  */
2950   BFD_ASSERT (rel->r_offset + 8 <= sec->size);
2951
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;
2956
2957   if (rvc && (rd == 0 || rd == X_RA))
2958     {
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;
2963     }
2964   else if (VALID_UJTYPE_IMM (foff))
2965     {
2966       /* Relax to JAL rd, addr.  */
2967       r_type = R_RISCV_JAL;
2968       auipc = MATCH_JAL | (rd << OP_SH_RD);
2969     }
2970   else /* near_zero */
2971     {
2972       /* Relax to JALR rd, x0, addr.  */
2973       r_type = R_RISCV_LO12_I;
2974       auipc = MATCH_JALR | (rd << OP_SH_RD);
2975     }
2976
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);
2981
2982   /* Delete unnecessary JALR.  */
2983   *again = TRUE;
2984   return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + len, 8 - len,
2985                                    link_info);
2986 }
2987
2988 /* Traverse all output sections and return the max alignment.  */
2989
2990 static bfd_vma
2991 _bfd_riscv_get_max_alignment (asection *sec)
2992 {
2993   unsigned int max_alignment_power = 0;
2994   asection *o;
2995
2996   for (o = sec->output_section->owner->sections; o != NULL; o = o->next)
2997     {
2998       if (o->alignment_power > max_alignment_power)
2999         max_alignment_power = o->alignment_power;
3000     }
3001
3002   return (bfd_vma) 1 << max_alignment_power;
3003 }
3004
3005 /* Relax non-PIC global variable references.  */
3006
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)
3018 {
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;
3022
3023   /* Mergeable symbols and code might later move out of range.  */
3024   if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
3025     return TRUE;
3026
3027   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3028
3029   if (gp)
3030     {
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;
3038     }
3039
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)))
3047     {
3048       unsigned sym = ELFNN_R_SYM (rel->r_info);
3049       switch (ELFNN_R_TYPE (rel->r_info))
3050         {
3051         case R_RISCV_LO12_I:
3052           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
3053           return TRUE;
3054
3055         case R_RISCV_LO12_S:
3056           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
3057           return TRUE;
3058
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);
3065
3066         default:
3067           abort ();
3068         }
3069     }
3070
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)))
3077     {
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;
3083
3084       lui = (lui & (OP_MASK_RD << OP_SH_RD)) | MATCH_C_LUI;
3085       bfd_put_32 (abfd, lui, contents + rel->r_offset);
3086
3087       /* Replace the R_RISCV_HI20 reloc.  */
3088       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_RVC_LUI);
3089
3090       *again = TRUE;
3091       return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + 2, 2,
3092                                        link_info);
3093     }
3094
3095   return TRUE;
3096 }
3097
3098 /* Relax non-PIC TLS references.  */
3099
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)
3111 {
3112   /* See if this symbol is in range of tp.  */
3113   if (RISCV_CONST_HIGH_PART (tpoff (link_info, symval)) != 0)
3114     return TRUE;
3115
3116   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3117   switch (ELFNN_R_TYPE (rel->r_info))
3118     {
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;
3122
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;
3126
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);
3133
3134     default:
3135       abort ();
3136     }
3137 }
3138
3139 /* Implement R_RISCV_ALIGN by deleting excess alignment NOPs.  */
3140
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)
3151 {
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;
3156
3157   symval -= rel->r_addend;
3158   bfd_vma aligned_addr = ((symval - 1) & ~(alignment - 1)) + alignment;
3159   bfd_vma nop_bytes = aligned_addr - symval;
3160
3161   /* Once we've handled an R_RISCV_ALIGN, we can't relax anything else.  */
3162   sec->sec_flg0 = TRUE;
3163
3164   /* Make sure there are enough NOPs to actually achieve the alignment.  */
3165   if (rel->r_addend < nop_bytes)
3166     {
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;
3174     }
3175
3176   /* Delete the reloc.  */
3177   rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3178
3179   /* If the number of NOPs is already correct, there's nothing to do.  */
3180   if (nop_bytes == rel->r_addend)
3181     return TRUE;
3182
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);
3186
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);
3190
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);
3194 }
3195
3196 /* Relax PC-relative references to GP-relative references.  */
3197
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)
3209 {
3210   bfd_vma gp = riscv_global_pointer_value (link_info);
3211
3212   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3213
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))
3219     {
3220     case R_RISCV_PCREL_LO12_I:
3221     case R_RISCV_PCREL_LO12_S:
3222       {
3223         riscv_pcgp_hi_reloc *hi = riscv_find_pcgp_hi_reloc (pcgp_relocs,
3224                                                             symval - sec_addr(sym_sec));
3225         if (hi == NULL)
3226           {
3227             riscv_record_pcgp_lo_reloc (pcgp_relocs, symval - sec_addr(sym_sec));
3228             return TRUE;
3229           }
3230
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);
3239       }
3240       break;
3241
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;
3246
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;
3251
3252       break;
3253
3254     default:
3255       abort ();
3256     }
3257
3258   if (gp)
3259     {
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;
3266     }
3267
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)))
3275     {
3276       unsigned sym = hi_reloc.hi_sym;
3277       switch (ELFNN_R_TYPE (rel->r_info))
3278         {
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);
3283
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);
3288
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);
3300
3301         default:
3302           abort ();
3303         }
3304     }
3305
3306   return TRUE;
3307 }
3308
3309 /* Relax PC-relative references to GP-relative references.  */
3310
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)
3322 {
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;
3328 }
3329
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.  */
3333
3334 static bfd_boolean
3335 _bfd_riscv_relax_section (bfd *abfd, asection *sec,
3336                           struct bfd_link_info *info,
3337                           bfd_boolean *again)
3338 {
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;
3347
3348   *again = FALSE;
3349
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;
3357
3358   riscv_init_pcgp_relocs (&pcgp_relocs);
3359
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;
3366
3367   if (htab)
3368     {
3369       max_alignment = htab->max_alignment;
3370       if (max_alignment == (bfd_vma) -1)
3371         {
3372           max_alignment = _bfd_riscv_get_max_alignment (sec);
3373           htab->max_alignment = max_alignment;
3374         }
3375     }
3376   else
3377     max_alignment = _bfd_riscv_get_max_alignment (sec);
3378
3379   /* Examine and consider relaxing each reloc.  */
3380   for (i = 0; i < sec->reloc_count; i++)
3381     {
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;
3387
3388       relax_func = NULL;
3389       if (info->relax_pass == 0)
3390         {
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;
3409
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;
3415
3416           /* Skip over the R_RISCV_RELAX.  */
3417           i++;
3418         }
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;
3425
3426       data->relocs = relocs;
3427
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;
3432
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;
3441
3442       /* Get the value of the symbol referred to by the reloc.  */
3443       if (ELFNN_R_SYM (rel->r_info) < symtab_hdr->sh_info)
3444         {
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;
3450
3451           if (isym->st_shndx == SHN_UNDEF)
3452             sym_sec = sec, symval = sec_addr (sec) + rel->r_offset;
3453           else
3454             {
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;
3466             }
3467         }
3468       else
3469         {
3470           unsigned long indx;
3471           struct elf_link_hash_entry *h;
3472
3473           indx = ELFNN_R_SYM (rel->r_info) - symtab_hdr->sh_info;
3474           h = elf_sym_hashes (abfd)[indx];
3475
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;
3479
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;
3488
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;
3493         }
3494
3495       symval += rel->r_addend;
3496
3497       if (!relax_func (abfd, sec, sym_sec, info, rel, symval,
3498                        max_alignment, reserve_size, again,
3499                        &pcgp_relocs))
3500         goto fail;
3501     }
3502
3503   ret = TRUE;
3504
3505 fail:
3506   if (relocs != data->relocs)
3507     free (relocs);
3508   riscv_free_pcgp_relocs(&pcgp_relocs, abfd, sec);
3509
3510   return ret;
3511 }
3512
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
3534
3535 /* Support for core dump NOTE sections.  */
3536
3537 static bfd_boolean
3538 riscv_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3539 {
3540   switch (note->descsz)
3541     {
3542       default:
3543         return FALSE;
3544
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);
3549
3550         /* pr_pid */
3551         elf_tdata (abfd)->core->lwpid
3552           = bfd_get_32 (abfd, note->descdata + PRSTATUS_OFFSET_PR_PID);
3553         break;
3554     }
3555
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);
3559 }
3560
3561 static bfd_boolean
3562 riscv_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3563 {
3564   switch (note->descsz)
3565     {
3566       default:
3567         return FALSE;
3568
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);
3573
3574         /* pr_fname */
3575         elf_tdata (abfd)->core->program = _bfd_elfcore_strndup
3576           (abfd, note->descdata + PRPSINFO_OFFSET_PR_FNAME, 16);
3577
3578         /* pr_psargs */
3579         elf_tdata (abfd)->core->command = _bfd_elfcore_strndup
3580           (abfd, note->descdata + PRPSINFO_OFFSET_PR_PSARGS, 80);
3581         break;
3582     }
3583
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.  */
3587
3588   {
3589     char *command = elf_tdata (abfd)->core->command;
3590     int n = strlen (command);
3591
3592     if (0 < n && command[n - 1] == ' ')
3593       command[n - 1] = '\0';
3594   }
3595
3596   return TRUE;
3597 }
3598
3599 /* Set the right mach type.  */
3600 static bfd_boolean
3601 riscv_elf_object_p (bfd *abfd)
3602 {
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);
3608
3609   return TRUE;
3610 }
3611
3612
3613 #define TARGET_LITTLE_SYM               riscv_elfNN_vec
3614 #define TARGET_LITTLE_NAME              "elfNN-littleriscv"
3615
3616 #define elf_backend_reloc_type_class         riscv_reloc_type_class
3617
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
3623
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
3640
3641 #define elf_backend_init_index_section       _bfd_elf_init_1_index_section
3642
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
3653
3654 #include "elfNN-target.h"