readonly_dynrelocs
[external/binutils.git] / bfd / elfnn-riscv.c
1 /* RISC-V-specific support for NN-bit ELF.
2    Copyright (C) 2011-2017 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 /* The RISC-V linker needs to keep track of the number of relocs that it
59    decides to copy as dynamic relocs in check_relocs for each symbol.
60    This is so that it can later discard them if they are found to be
61    unnecessary.  We store the information in a field extending the
62    regular ELF linker hash table.  */
63
64 struct riscv_elf_dyn_relocs
65 {
66   struct riscv_elf_dyn_relocs *next;
67
68   /* The input section of the reloc.  */
69   asection *sec;
70
71   /* Total number of relocs copied for the input section.  */
72   bfd_size_type count;
73
74   /* Number of pc-relative relocs copied for the input section.  */
75   bfd_size_type pc_count;
76 };
77
78 /* RISC-V ELF linker hash entry.  */
79
80 struct riscv_elf_link_hash_entry
81 {
82   struct elf_link_hash_entry elf;
83
84   /* Track dynamic relocs copied for this symbol.  */
85   struct riscv_elf_dyn_relocs *dyn_relocs;
86
87 #define GOT_UNKNOWN     0
88 #define GOT_NORMAL      1
89 #define GOT_TLS_GD      2
90 #define GOT_TLS_IE      4
91 #define GOT_TLS_LE      8
92   char tls_type;
93 };
94
95 #define riscv_elf_hash_entry(ent) \
96   ((struct riscv_elf_link_hash_entry *)(ent))
97
98 struct _bfd_riscv_elf_obj_tdata
99 {
100   struct elf_obj_tdata root;
101
102   /* tls_type for each local got entry.  */
103   char *local_got_tls_type;
104 };
105
106 #define _bfd_riscv_elf_tdata(abfd) \
107   ((struct _bfd_riscv_elf_obj_tdata *) (abfd)->tdata.any)
108
109 #define _bfd_riscv_elf_local_got_tls_type(abfd) \
110   (_bfd_riscv_elf_tdata (abfd)->local_got_tls_type)
111
112 #define _bfd_riscv_elf_tls_type(abfd, h, symndx)                \
113   (*((h) != NULL ? &riscv_elf_hash_entry (h)->tls_type          \
114      : &_bfd_riscv_elf_local_got_tls_type (abfd) [symndx]))
115
116 #define is_riscv_elf(bfd)                               \
117   (bfd_get_flavour (bfd) == bfd_target_elf_flavour      \
118    && elf_tdata (bfd) != NULL                           \
119    && elf_object_id (bfd) == RISCV_ELF_DATA)
120
121 #include "elf/common.h"
122 #include "elf/internal.h"
123
124 struct riscv_elf_link_hash_table
125 {
126   struct elf_link_hash_table elf;
127
128   /* Short-cuts to get to dynamic linker sections.  */
129   asection *sdyntdata;
130
131   /* Small local sym to section mapping cache.  */
132   struct sym_cache sym_cache;
133
134   /* The max alignment of output sections.  */
135   bfd_vma max_alignment;
136 };
137
138
139 /* Get the RISC-V ELF linker hash table from a link_info structure.  */
140 #define riscv_elf_hash_table(p) \
141   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
142   == RISCV_ELF_DATA ? ((struct riscv_elf_link_hash_table *) ((p)->hash)) : NULL)
143
144 static void
145 riscv_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
146                           arelent *cache_ptr,
147                           Elf_Internal_Rela *dst)
148 {
149   cache_ptr->howto = riscv_elf_rtype_to_howto (ELFNN_R_TYPE (dst->r_info));
150 }
151
152 static void
153 riscv_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
154 {
155   const struct elf_backend_data *bed;
156   bfd_byte *loc;
157
158   bed = get_elf_backend_data (abfd);
159   loc = s->contents + (s->reloc_count++ * bed->s->sizeof_rela);
160   bed->s->swap_reloca_out (abfd, rel, loc);
161 }
162
163 /* PLT/GOT stuff.  */
164
165 #define PLT_HEADER_INSNS 8
166 #define PLT_ENTRY_INSNS 4
167 #define PLT_HEADER_SIZE (PLT_HEADER_INSNS * 4)
168 #define PLT_ENTRY_SIZE (PLT_ENTRY_INSNS * 4)
169
170 #define GOT_ENTRY_SIZE RISCV_ELF_WORD_BYTES
171
172 #define GOTPLT_HEADER_SIZE (2 * GOT_ENTRY_SIZE)
173
174 #define sec_addr(sec) ((sec)->output_section->vma + (sec)->output_offset)
175
176 static bfd_vma
177 riscv_elf_got_plt_val (bfd_vma plt_index, struct bfd_link_info *info)
178 {
179   return sec_addr (riscv_elf_hash_table (info)->elf.sgotplt)
180          + GOTPLT_HEADER_SIZE + (plt_index * GOT_ENTRY_SIZE);
181 }
182
183 #if ARCH_SIZE == 32
184 # define MATCH_LREG MATCH_LW
185 #else
186 # define MATCH_LREG MATCH_LD
187 #endif
188
189 /* Generate a PLT header.  */
190
191 static void
192 riscv_make_plt_header (bfd_vma gotplt_addr, bfd_vma addr, uint32_t *entry)
193 {
194   bfd_vma gotplt_offset_high = RISCV_PCREL_HIGH_PART (gotplt_addr, addr);
195   bfd_vma gotplt_offset_low = RISCV_PCREL_LOW_PART (gotplt_addr, addr);
196
197   /* auipc  t2, %hi(.got.plt)
198      sub    t1, t1, t3               # shifted .got.plt offset + hdr size + 12
199      l[w|d] t3, %lo(.got.plt)(t2)    # _dl_runtime_resolve
200      addi   t1, t1, -(hdr size + 12) # shifted .got.plt offset
201      addi   t0, t2, %lo(.got.plt)    # &.got.plt
202      srli   t1, t1, log2(16/PTRSIZE) # .got.plt offset
203      l[w|d] t0, PTRSIZE(t0)          # link map
204      jr     t3 */
205
206   entry[0] = RISCV_UTYPE (AUIPC, X_T2, gotplt_offset_high);
207   entry[1] = RISCV_RTYPE (SUB, X_T1, X_T1, X_T3);
208   entry[2] = RISCV_ITYPE (LREG, X_T3, X_T2, gotplt_offset_low);
209   entry[3] = RISCV_ITYPE (ADDI, X_T1, X_T1, -(PLT_HEADER_SIZE + 12));
210   entry[4] = RISCV_ITYPE (ADDI, X_T0, X_T2, gotplt_offset_low);
211   entry[5] = RISCV_ITYPE (SRLI, X_T1, X_T1, 4 - RISCV_ELF_LOG_WORD_BYTES);
212   entry[6] = RISCV_ITYPE (LREG, X_T0, X_T0, RISCV_ELF_WORD_BYTES);
213   entry[7] = RISCV_ITYPE (JALR, 0, X_T3, 0);
214 }
215
216 /* Generate a PLT entry.  */
217
218 static void
219 riscv_make_plt_entry (bfd_vma got, bfd_vma addr, uint32_t *entry)
220 {
221   /* auipc  t3, %hi(.got.plt entry)
222      l[w|d] t3, %lo(.got.plt entry)(t3)
223      jalr   t1, t3
224      nop */
225
226   entry[0] = RISCV_UTYPE (AUIPC, X_T3, RISCV_PCREL_HIGH_PART (got, addr));
227   entry[1] = RISCV_ITYPE (LREG,  X_T3, X_T3, RISCV_PCREL_LOW_PART (got, addr));
228   entry[2] = RISCV_ITYPE (JALR, X_T1, X_T3, 0);
229   entry[3] = RISCV_NOP;
230 }
231
232 /* Create an entry in an RISC-V ELF linker hash table.  */
233
234 static struct bfd_hash_entry *
235 link_hash_newfunc (struct bfd_hash_entry *entry,
236                    struct bfd_hash_table *table, const char *string)
237 {
238   /* Allocate the structure if it has not already been allocated by a
239      subclass.  */
240   if (entry == NULL)
241     {
242       entry =
243         bfd_hash_allocate (table,
244                            sizeof (struct riscv_elf_link_hash_entry));
245       if (entry == NULL)
246         return entry;
247     }
248
249   /* Call the allocation method of the superclass.  */
250   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
251   if (entry != NULL)
252     {
253       struct riscv_elf_link_hash_entry *eh;
254
255       eh = (struct riscv_elf_link_hash_entry *) entry;
256       eh->dyn_relocs = NULL;
257       eh->tls_type = GOT_UNKNOWN;
258     }
259
260   return entry;
261 }
262
263 /* Create a RISC-V ELF linker hash table.  */
264
265 static struct bfd_link_hash_table *
266 riscv_elf_link_hash_table_create (bfd *abfd)
267 {
268   struct riscv_elf_link_hash_table *ret;
269   bfd_size_type amt = sizeof (struct riscv_elf_link_hash_table);
270
271   ret = (struct riscv_elf_link_hash_table *) bfd_zmalloc (amt);
272   if (ret == NULL)
273     return NULL;
274
275   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
276                                       sizeof (struct riscv_elf_link_hash_entry),
277                                       RISCV_ELF_DATA))
278     {
279       free (ret);
280       return NULL;
281     }
282
283   ret->max_alignment = (bfd_vma) -1;
284   return &ret->elf.root;
285 }
286
287 /* Create the .got section.  */
288
289 static bfd_boolean
290 riscv_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
291 {
292   flagword flags;
293   asection *s, *s_got;
294   struct elf_link_hash_entry *h;
295   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
296   struct elf_link_hash_table *htab = elf_hash_table (info);
297
298   /* This function may be called more than once.  */
299   if (htab->sgot != NULL)
300     return TRUE;
301
302   flags = bed->dynamic_sec_flags;
303
304   s = bfd_make_section_anyway_with_flags (abfd,
305                                           (bed->rela_plts_and_copies_p
306                                            ? ".rela.got" : ".rel.got"),
307                                           (bed->dynamic_sec_flags
308                                            | SEC_READONLY));
309   if (s == NULL
310       || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
311     return FALSE;
312   htab->srelgot = s;
313
314   s = s_got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
315   if (s == NULL
316       || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
317     return FALSE;
318   htab->sgot = s;
319
320   /* The first bit of the global offset table is the header.  */
321   s->size += bed->got_header_size;
322
323   if (bed->want_got_plt)
324     {
325       s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
326       if (s == NULL
327           || !bfd_set_section_alignment (abfd, s,
328                                          bed->s->log_file_align))
329         return FALSE;
330       htab->sgotplt = s;
331
332       /* Reserve room for the header.  */
333       s->size += GOTPLT_HEADER_SIZE;
334     }
335
336   if (bed->want_got_sym)
337     {
338       /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
339          section.  We don't do this in the linker script because we don't want
340          to define the symbol if we are not creating a global offset
341          table.  */
342       h = _bfd_elf_define_linkage_sym (abfd, info, s_got,
343                                        "_GLOBAL_OFFSET_TABLE_");
344       elf_hash_table (info)->hgot = h;
345       if (h == NULL)
346         return FALSE;
347     }
348
349   return TRUE;
350 }
351
352 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
353    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
354    hash table.  */
355
356 static bfd_boolean
357 riscv_elf_create_dynamic_sections (bfd *dynobj,
358                                    struct bfd_link_info *info)
359 {
360   struct riscv_elf_link_hash_table *htab;
361
362   htab = riscv_elf_hash_table (info);
363   BFD_ASSERT (htab != NULL);
364
365   if (!riscv_elf_create_got_section (dynobj, info))
366     return FALSE;
367
368   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
369     return FALSE;
370
371   if (!bfd_link_pic (info))
372     {
373       htab->sdyntdata =
374         bfd_make_section_anyway_with_flags (dynobj, ".tdata.dyn",
375                                             SEC_ALLOC | SEC_THREAD_LOCAL);
376     }
377
378   if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss
379       || (!bfd_link_pic (info) && (!htab->elf.srelbss || !htab->sdyntdata)))
380     abort ();
381
382   return TRUE;
383 }
384
385 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
386
387 static void
388 riscv_elf_copy_indirect_symbol (struct bfd_link_info *info,
389                                 struct elf_link_hash_entry *dir,
390                                 struct elf_link_hash_entry *ind)
391 {
392   struct riscv_elf_link_hash_entry *edir, *eind;
393
394   edir = (struct riscv_elf_link_hash_entry *) dir;
395   eind = (struct riscv_elf_link_hash_entry *) ind;
396
397   if (eind->dyn_relocs != NULL)
398     {
399       if (edir->dyn_relocs != NULL)
400         {
401           struct riscv_elf_dyn_relocs **pp;
402           struct riscv_elf_dyn_relocs *p;
403
404           /* Add reloc counts against the indirect sym to the direct sym
405              list.  Merge any entries against the same section.  */
406           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
407             {
408               struct riscv_elf_dyn_relocs *q;
409
410               for (q = edir->dyn_relocs; q != NULL; q = q->next)
411                 if (q->sec == p->sec)
412                   {
413                     q->pc_count += p->pc_count;
414                     q->count += p->count;
415                     *pp = p->next;
416                     break;
417                   }
418               if (q == NULL)
419                 pp = &p->next;
420             }
421           *pp = edir->dyn_relocs;
422         }
423
424       edir->dyn_relocs = eind->dyn_relocs;
425       eind->dyn_relocs = NULL;
426     }
427
428   if (ind->root.type == bfd_link_hash_indirect
429       && dir->got.refcount <= 0)
430     {
431       edir->tls_type = eind->tls_type;
432       eind->tls_type = GOT_UNKNOWN;
433     }
434   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
435 }
436
437 static bfd_boolean
438 riscv_elf_record_tls_type (bfd *abfd, struct elf_link_hash_entry *h,
439                            unsigned long symndx, char tls_type)
440 {
441   char *new_tls_type = &_bfd_riscv_elf_tls_type (abfd, h, symndx);
442
443   *new_tls_type |= tls_type;
444   if ((*new_tls_type & GOT_NORMAL) && (*new_tls_type & ~GOT_NORMAL))
445     {
446       (*_bfd_error_handler)
447         (_("%B: `%s' accessed both as normal and thread local symbol"),
448          abfd, h ? h->root.root.string : "<local>");
449       return FALSE;
450     }
451   return TRUE;
452 }
453
454 static bfd_boolean
455 riscv_elf_record_got_reference (bfd *abfd, struct bfd_link_info *info,
456                                 struct elf_link_hash_entry *h, long symndx)
457 {
458   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
459   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
460
461   if (htab->elf.sgot == NULL)
462     {
463       if (!riscv_elf_create_got_section (htab->elf.dynobj, info))
464         return FALSE;
465     }
466
467   if (h != NULL)
468     {
469       h->got.refcount += 1;
470       return TRUE;
471     }
472
473   /* This is a global offset table entry for a local symbol.  */
474   if (elf_local_got_refcounts (abfd) == NULL)
475     {
476       bfd_size_type size = symtab_hdr->sh_info * (sizeof (bfd_vma) + 1);
477       if (!(elf_local_got_refcounts (abfd) = bfd_zalloc (abfd, size)))
478         return FALSE;
479       _bfd_riscv_elf_local_got_tls_type (abfd)
480         = (char *) (elf_local_got_refcounts (abfd) + symtab_hdr->sh_info);
481     }
482   elf_local_got_refcounts (abfd) [symndx] += 1;
483
484   return TRUE;
485 }
486
487 static bfd_boolean
488 bad_static_reloc (bfd *abfd, unsigned r_type, struct elf_link_hash_entry *h)
489 {
490   (*_bfd_error_handler)
491     (_("%B: relocation %s against `%s' can not be used when making a shared "
492        "object; recompile with -fPIC"),
493       abfd, riscv_elf_rtype_to_howto (r_type)->name,
494       h != NULL ? h->root.root.string : "a local symbol");
495   bfd_set_error (bfd_error_bad_value);
496   return FALSE;
497 }
498 /* Look through the relocs for a section during the first phase, and
499    allocate space in the global offset table or procedure linkage
500    table.  */
501
502 static bfd_boolean
503 riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
504                         asection *sec, const Elf_Internal_Rela *relocs)
505 {
506   struct riscv_elf_link_hash_table *htab;
507   Elf_Internal_Shdr *symtab_hdr;
508   struct elf_link_hash_entry **sym_hashes;
509   const Elf_Internal_Rela *rel;
510   asection *sreloc = NULL;
511
512   if (bfd_link_relocatable (info))
513     return TRUE;
514
515   htab = riscv_elf_hash_table (info);
516   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
517   sym_hashes = elf_sym_hashes (abfd);
518
519   if (htab->elf.dynobj == NULL)
520     htab->elf.dynobj = abfd;
521
522   for (rel = relocs; rel < relocs + sec->reloc_count; rel++)
523     {
524       unsigned int r_type;
525       unsigned int r_symndx;
526       struct elf_link_hash_entry *h;
527
528       r_symndx = ELFNN_R_SYM (rel->r_info);
529       r_type = ELFNN_R_TYPE (rel->r_info);
530
531       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
532         {
533           (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
534                                  abfd, r_symndx);
535           return FALSE;
536         }
537
538       if (r_symndx < symtab_hdr->sh_info)
539         h = NULL;
540       else
541         {
542           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
543           while (h->root.type == bfd_link_hash_indirect
544                  || h->root.type == bfd_link_hash_warning)
545             h = (struct elf_link_hash_entry *) h->root.u.i.link;
546         }
547
548       switch (r_type)
549         {
550         case R_RISCV_TLS_GD_HI20:
551           if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
552               || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_GD))
553             return FALSE;
554           break;
555
556         case R_RISCV_TLS_GOT_HI20:
557           if (bfd_link_pic (info))
558             info->flags |= DF_STATIC_TLS;
559           if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
560               || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_IE))
561             return FALSE;
562           break;
563
564         case R_RISCV_GOT_HI20:
565           if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
566               || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_NORMAL))
567             return FALSE;
568           break;
569
570         case R_RISCV_CALL_PLT:
571           /* This symbol requires a procedure linkage table entry.  We
572              actually build the entry in adjust_dynamic_symbol,
573              because this might be a case of linking PIC code without
574              linking in any dynamic objects, in which case we don't
575              need to generate a procedure linkage table after all.  */
576
577           if (h != NULL)
578             {
579               h->needs_plt = 1;
580               h->plt.refcount += 1;
581             }
582           break;
583
584         case R_RISCV_CALL:
585         case R_RISCV_JAL:
586         case R_RISCV_BRANCH:
587         case R_RISCV_RVC_BRANCH:
588         case R_RISCV_RVC_JUMP:
589         case R_RISCV_PCREL_HI20:
590           /* In shared libraries, these relocs are known to bind locally.  */
591           if (bfd_link_pic (info))
592             break;
593           goto static_reloc;
594
595         case R_RISCV_TPREL_HI20:
596           if (!bfd_link_executable (info))
597             return bad_static_reloc (abfd, r_type, h);
598           if (h != NULL)
599             riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
600           goto static_reloc;
601
602         case R_RISCV_HI20:
603           if (bfd_link_pic (info))
604             return bad_static_reloc (abfd, r_type, h);
605           /* Fall through.  */
606
607         case R_RISCV_COPY:
608         case R_RISCV_JUMP_SLOT:
609         case R_RISCV_RELATIVE:
610         case R_RISCV_64:
611         case R_RISCV_32:
612           /* Fall through.  */
613
614         static_reloc:
615           /* This reloc might not bind locally.  */
616           if (h != NULL)
617             h->non_got_ref = 1;
618
619           if (h != NULL && !bfd_link_pic (info))
620             {
621               /* We may need a .plt entry if the function this reloc
622                  refers to is in a shared lib.  */
623               h->plt.refcount += 1;
624             }
625
626           /* If we are creating a shared library, and this is a reloc
627              against a global symbol, or a non PC relative reloc
628              against a local symbol, then we need to copy the reloc
629              into the shared library.  However, if we are linking with
630              -Bsymbolic, we do not need to copy a reloc against a
631              global symbol which is defined in an object we are
632              including in the link (i.e., DEF_REGULAR is set).  At
633              this point we have not seen all the input files, so it is
634              possible that DEF_REGULAR is not set now but will be set
635              later (it is never cleared).  In case of a weak definition,
636              DEF_REGULAR may be cleared later by a strong definition in
637              a shared library.  We account for that possibility below by
638              storing information in the relocs_copied field of the hash
639              table entry.  A similar situation occurs when creating
640              shared libraries and symbol visibility changes render the
641              symbol local.
642
643              If on the other hand, we are creating an executable, we
644              may need to keep relocations for symbols satisfied by a
645              dynamic library if we manage to avoid copy relocs for the
646              symbol.  */
647           if ((bfd_link_pic (info)
648                && (sec->flags & SEC_ALLOC) != 0
649                && (! riscv_elf_rtype_to_howto (r_type)->pc_relative
650                    || (h != NULL
651                        && (! info->symbolic
652                            || h->root.type == bfd_link_hash_defweak
653                            || !h->def_regular))))
654               || (!bfd_link_pic (info)
655                   && (sec->flags & SEC_ALLOC) != 0
656                   && h != NULL
657                   && (h->root.type == bfd_link_hash_defweak
658                       || !h->def_regular)))
659             {
660               struct riscv_elf_dyn_relocs *p;
661               struct riscv_elf_dyn_relocs **head;
662
663               /* When creating a shared object, we must copy these
664                  relocs into the output file.  We create a reloc
665                  section in dynobj and make room for the reloc.  */
666               if (sreloc == NULL)
667                 {
668                   sreloc = _bfd_elf_make_dynamic_reloc_section
669                     (sec, htab->elf.dynobj, RISCV_ELF_LOG_WORD_BYTES,
670                     abfd, /*rela?*/ TRUE);
671
672                   if (sreloc == NULL)
673                     return FALSE;
674                 }
675
676               /* If this is a global symbol, we count the number of
677                  relocations we need for this symbol.  */
678               if (h != NULL)
679                 head = &((struct riscv_elf_link_hash_entry *) h)->dyn_relocs;
680               else
681                 {
682                   /* Track dynamic relocs needed for local syms too.
683                      We really need local syms available to do this
684                      easily.  Oh well.  */
685
686                   asection *s;
687                   void *vpp;
688                   Elf_Internal_Sym *isym;
689
690                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
691                                                 abfd, r_symndx);
692                   if (isym == NULL)
693                     return FALSE;
694
695                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
696                   if (s == NULL)
697                     s = sec;
698
699                   vpp = &elf_section_data (s)->local_dynrel;
700                   head = (struct riscv_elf_dyn_relocs **) vpp;
701                 }
702
703               p = *head;
704               if (p == NULL || p->sec != sec)
705                 {
706                   bfd_size_type amt = sizeof *p;
707                   p = ((struct riscv_elf_dyn_relocs *)
708                        bfd_alloc (htab->elf.dynobj, amt));
709                   if (p == NULL)
710                     return FALSE;
711                   p->next = *head;
712                   *head = p;
713                   p->sec = sec;
714                   p->count = 0;
715                   p->pc_count = 0;
716                 }
717
718               p->count += 1;
719               p->pc_count += riscv_elf_rtype_to_howto (r_type)->pc_relative;
720             }
721
722           break;
723
724         case R_RISCV_GNU_VTINHERIT:
725           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
726             return FALSE;
727           break;
728
729         case R_RISCV_GNU_VTENTRY:
730           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
731             return FALSE;
732           break;
733
734         default:
735           break;
736         }
737     }
738
739   return TRUE;
740 }
741
742 static asection *
743 riscv_elf_gc_mark_hook (asection *sec,
744                         struct bfd_link_info *info,
745                         Elf_Internal_Rela *rel,
746                         struct elf_link_hash_entry *h,
747                         Elf_Internal_Sym *sym)
748 {
749   if (h != NULL)
750     switch (ELFNN_R_TYPE (rel->r_info))
751       {
752       case R_RISCV_GNU_VTINHERIT:
753       case R_RISCV_GNU_VTENTRY:
754         return NULL;
755       }
756
757   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
758 }
759
760 /* Find dynamic relocs for H that apply to read-only sections.  */
761
762 static asection *
763 readonly_dynrelocs (struct elf_link_hash_entry *h)
764 {
765   struct riscv_elf_dyn_relocs *p;
766
767   for (p = riscv_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
768     {
769       asection *s = p->sec->output_section;
770
771       if (s != NULL && (s->flags & SEC_READONLY) != 0)
772         return p->sec;
773     }
774   return NULL;
775 }
776
777 /* Adjust a symbol defined by a dynamic object and referenced by a
778    regular object.  The current definition is in some section of the
779    dynamic object, but we're not including those sections.  We have to
780    change the definition to something the rest of the link can
781    understand.  */
782
783 static bfd_boolean
784 riscv_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
785                                  struct elf_link_hash_entry *h)
786 {
787   struct riscv_elf_link_hash_table *htab;
788   struct riscv_elf_link_hash_entry * eh;
789   struct riscv_elf_dyn_relocs *p;
790   bfd *dynobj;
791   asection *s, *srel;
792
793   htab = riscv_elf_hash_table (info);
794   BFD_ASSERT (htab != NULL);
795
796   dynobj = htab->elf.dynobj;
797
798   /* Make sure we know what is going on here.  */
799   BFD_ASSERT (dynobj != NULL
800               && (h->needs_plt
801                   || h->type == STT_GNU_IFUNC
802                   || h->is_weakalias
803                   || (h->def_dynamic
804                       && h->ref_regular
805                       && !h->def_regular)));
806
807   /* If this is a function, put it in the procedure linkage table.  We
808      will fill in the contents of the procedure linkage table later
809      (although we could actually do it here).  */
810   if (h->type == STT_FUNC || h->type == STT_GNU_IFUNC || h->needs_plt)
811     {
812       if (h->plt.refcount <= 0
813           || SYMBOL_CALLS_LOCAL (info, h)
814           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
815               && h->root.type == bfd_link_hash_undefweak))
816         {
817           /* This case can occur if we saw a R_RISCV_CALL_PLT reloc in an
818              input file, but the symbol was never referred to by a dynamic
819              object, or if all references were garbage collected.  In such
820              a case, we don't actually need to build a PLT entry.  */
821           h->plt.offset = (bfd_vma) -1;
822           h->needs_plt = 0;
823         }
824
825       return TRUE;
826     }
827   else
828     h->plt.offset = (bfd_vma) -1;
829
830   /* If this is a weak symbol, and there is a real definition, the
831      processor independent code will have arranged for us to see the
832      real definition first, and we can just use the same value.  */
833   if (h->is_weakalias)
834     {
835       struct elf_link_hash_entry *def = weakdef (h);
836       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
837       h->root.u.def.section = def->root.u.def.section;
838       h->root.u.def.value = def->root.u.def.value;
839       return TRUE;
840     }
841
842   /* This is a reference to a symbol defined by a dynamic object which
843      is not a function.  */
844
845   /* If we are creating a shared library, we must presume that the
846      only references to the symbol are via the global offset table.
847      For such cases we need not do anything here; the relocations will
848      be handled correctly by relocate_section.  */
849   if (bfd_link_pic (info))
850     return TRUE;
851
852   /* If there are no references to this symbol that do not use the
853      GOT, we don't need to generate a copy reloc.  */
854   if (!h->non_got_ref)
855     return TRUE;
856
857   /* If -z nocopyreloc was given, we won't generate them either.  */
858   if (info->nocopyreloc)
859     {
860       h->non_got_ref = 0;
861       return TRUE;
862     }
863
864   eh = (struct riscv_elf_link_hash_entry *) h;
865   for (p = eh->dyn_relocs; p != NULL; p = p->next)
866     {
867       s = p->sec->output_section;
868       if (s != NULL && (s->flags & SEC_READONLY) != 0)
869         break;
870     }
871
872   /* If we didn't find any dynamic relocs in read-only sections, then
873      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
874   if (p == NULL)
875     {
876       h->non_got_ref = 0;
877       return TRUE;
878     }
879
880   /* We must allocate the symbol in our .dynbss section, which will
881      become part of the .bss section of the executable.  There will be
882      an entry for this symbol in the .dynsym section.  The dynamic
883      object will contain position independent code, so all references
884      from the dynamic object to this symbol will go through the global
885      offset table.  The dynamic linker will use the .dynsym entry to
886      determine the address it must put in the global offset table, so
887      both the dynamic object and the regular object will refer to the
888      same memory location for the variable.  */
889
890   /* We must generate a R_RISCV_COPY reloc to tell the dynamic linker
891      to copy the initial value out of the dynamic object and into the
892      runtime process image.  We need to remember the offset into the
893      .rel.bss section we are going to use.  */
894   if (eh->tls_type & ~GOT_NORMAL)
895     {
896       s = htab->sdyntdata;
897       srel = htab->elf.srelbss;
898     }
899   else if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
900     {
901       s = htab->elf.sdynrelro;
902       srel = htab->elf.sreldynrelro;
903     }
904   else
905     {
906       s = htab->elf.sdynbss;
907       srel = htab->elf.srelbss;
908     }
909   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
910     {
911       srel->size += sizeof (ElfNN_External_Rela);
912       h->needs_copy = 1;
913     }
914
915   return _bfd_elf_adjust_dynamic_copy (info, h, s);
916 }
917
918 /* Allocate space in .plt, .got and associated reloc sections for
919    dynamic relocs.  */
920
921 static bfd_boolean
922 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
923 {
924   struct bfd_link_info *info;
925   struct riscv_elf_link_hash_table *htab;
926   struct riscv_elf_link_hash_entry *eh;
927   struct riscv_elf_dyn_relocs *p;
928
929   if (h->root.type == bfd_link_hash_indirect)
930     return TRUE;
931
932   info = (struct bfd_link_info *) inf;
933   htab = riscv_elf_hash_table (info);
934   BFD_ASSERT (htab != NULL);
935
936   if (htab->elf.dynamic_sections_created
937       && h->plt.refcount > 0)
938     {
939       /* Make sure this symbol is output as a dynamic symbol.
940          Undefined weak syms won't yet be marked as dynamic.  */
941       if (h->dynindx == -1
942           && !h->forced_local)
943         {
944           if (! bfd_elf_link_record_dynamic_symbol (info, h))
945             return FALSE;
946         }
947
948       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
949         {
950           asection *s = htab->elf.splt;
951
952           if (s->size == 0)
953             s->size = PLT_HEADER_SIZE;
954
955           h->plt.offset = s->size;
956
957           /* Make room for this entry.  */
958           s->size += PLT_ENTRY_SIZE;
959
960           /* We also need to make an entry in the .got.plt section.  */
961           htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
962
963           /* We also need to make an entry in the .rela.plt section.  */
964           htab->elf.srelplt->size += sizeof (ElfNN_External_Rela);
965
966           /* If this symbol is not defined in a regular file, and we are
967              not generating a shared library, then set the symbol to this
968              location in the .plt.  This is required to make function
969              pointers compare as equal between the normal executable and
970              the shared library.  */
971           if (! bfd_link_pic (info)
972               && !h->def_regular)
973             {
974               h->root.u.def.section = s;
975               h->root.u.def.value = h->plt.offset;
976             }
977         }
978       else
979         {
980           h->plt.offset = (bfd_vma) -1;
981           h->needs_plt = 0;
982         }
983     }
984   else
985     {
986       h->plt.offset = (bfd_vma) -1;
987       h->needs_plt = 0;
988     }
989
990   if (h->got.refcount > 0)
991     {
992       asection *s;
993       bfd_boolean dyn;
994       int tls_type = riscv_elf_hash_entry (h)->tls_type;
995
996       /* Make sure this symbol is output as a dynamic symbol.
997          Undefined weak syms won't yet be marked as dynamic.  */
998       if (h->dynindx == -1
999           && !h->forced_local)
1000         {
1001           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1002             return FALSE;
1003         }
1004
1005       s = htab->elf.sgot;
1006       h->got.offset = s->size;
1007       dyn = htab->elf.dynamic_sections_created;
1008       if (tls_type & (GOT_TLS_GD | GOT_TLS_IE))
1009         {
1010           /* TLS_GD needs two dynamic relocs and two GOT slots.  */
1011           if (tls_type & GOT_TLS_GD)
1012             {
1013               s->size += 2 * RISCV_ELF_WORD_BYTES;
1014               htab->elf.srelgot->size += 2 * sizeof (ElfNN_External_Rela);
1015             }
1016
1017           /* TLS_IE needs one dynamic reloc and one GOT slot.  */
1018           if (tls_type & GOT_TLS_IE)
1019             {
1020               s->size += RISCV_ELF_WORD_BYTES;
1021               htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
1022             }
1023         }
1024       else
1025         {
1026           s->size += RISCV_ELF_WORD_BYTES;
1027           if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
1028             htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
1029         }
1030     }
1031   else
1032     h->got.offset = (bfd_vma) -1;
1033
1034   eh = (struct riscv_elf_link_hash_entry *) h;
1035   if (eh->dyn_relocs == NULL)
1036     return TRUE;
1037
1038   /* In the shared -Bsymbolic case, discard space allocated for
1039      dynamic pc-relative relocs against symbols which turn out to be
1040      defined in regular objects.  For the normal shared case, discard
1041      space for pc-relative relocs that have become local due to symbol
1042      visibility changes.  */
1043
1044   if (bfd_link_pic (info))
1045     {
1046       if (SYMBOL_CALLS_LOCAL (info, h))
1047         {
1048           struct riscv_elf_dyn_relocs **pp;
1049
1050           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1051             {
1052               p->count -= p->pc_count;
1053               p->pc_count = 0;
1054               if (p->count == 0)
1055                 *pp = p->next;
1056               else
1057                 pp = &p->next;
1058             }
1059         }
1060
1061       /* Also discard relocs on undefined weak syms with non-default
1062          visibility.  */
1063       if (eh->dyn_relocs != NULL
1064           && h->root.type == bfd_link_hash_undefweak)
1065         {
1066           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1067             eh->dyn_relocs = NULL;
1068
1069           /* Make sure undefined weak symbols are output as a dynamic
1070              symbol in PIEs.  */
1071           else if (h->dynindx == -1
1072                    && !h->forced_local)
1073             {
1074               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1075                 return FALSE;
1076             }
1077         }
1078     }
1079   else
1080     {
1081       /* For the non-shared case, discard space for relocs against
1082          symbols which turn out to need copy relocs or are not
1083          dynamic.  */
1084
1085       if (!h->non_got_ref
1086           && ((h->def_dynamic
1087                && !h->def_regular)
1088               || (htab->elf.dynamic_sections_created
1089                   && (h->root.type == bfd_link_hash_undefweak
1090                       || h->root.type == bfd_link_hash_undefined))))
1091         {
1092           /* Make sure this symbol is output as a dynamic symbol.
1093              Undefined weak syms won't yet be marked as dynamic.  */
1094           if (h->dynindx == -1
1095               && !h->forced_local)
1096             {
1097               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1098                 return FALSE;
1099             }
1100
1101           /* If that succeeded, we know we'll be keeping all the
1102              relocs.  */
1103           if (h->dynindx != -1)
1104             goto keep;
1105         }
1106
1107       eh->dyn_relocs = NULL;
1108
1109     keep: ;
1110     }
1111
1112   /* Finally, allocate space.  */
1113   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1114     {
1115       asection *sreloc = elf_section_data (p->sec)->sreloc;
1116       sreloc->size += p->count * sizeof (ElfNN_External_Rela);
1117     }
1118
1119   return TRUE;
1120 }
1121
1122 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
1123    read-only sections.  */
1124
1125 static bfd_boolean
1126 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
1127 {
1128   asection *sec;
1129
1130   if (h->root.type == bfd_link_hash_indirect)
1131     return TRUE;
1132
1133   sec = readonly_dynrelocs (h);
1134   if (sec != NULL)
1135     {
1136       struct bfd_link_info *info = (struct bfd_link_info *) info_p;
1137
1138       info->flags |= DF_TEXTREL;
1139       info->callbacks->minfo
1140         (_("%B: dynamic relocation against `%T' in read-only section `%A'\n"),
1141          sec->owner, h->root.root.string, sec);
1142
1143       /* Not an error, just cut short the traversal.  */
1144       return FALSE;
1145     }
1146   return TRUE;
1147 }
1148
1149 static bfd_boolean
1150 riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1151 {
1152   struct riscv_elf_link_hash_table *htab;
1153   bfd *dynobj;
1154   asection *s;
1155   bfd *ibfd;
1156
1157   htab = riscv_elf_hash_table (info);
1158   BFD_ASSERT (htab != NULL);
1159   dynobj = htab->elf.dynobj;
1160   BFD_ASSERT (dynobj != NULL);
1161
1162   if (elf_hash_table (info)->dynamic_sections_created)
1163     {
1164       /* Set the contents of the .interp section to the interpreter.  */
1165       if (bfd_link_executable (info) && !info->nointerp)
1166         {
1167           s = bfd_get_linker_section (dynobj, ".interp");
1168           BFD_ASSERT (s != NULL);
1169           s->size = strlen (ELFNN_DYNAMIC_INTERPRETER) + 1;
1170           s->contents = (unsigned char *) ELFNN_DYNAMIC_INTERPRETER;
1171         }
1172     }
1173
1174   /* Set up .got offsets for local syms, and space for local dynamic
1175      relocs.  */
1176   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1177     {
1178       bfd_signed_vma *local_got;
1179       bfd_signed_vma *end_local_got;
1180       char *local_tls_type;
1181       bfd_size_type locsymcount;
1182       Elf_Internal_Shdr *symtab_hdr;
1183       asection *srel;
1184
1185       if (! is_riscv_elf (ibfd))
1186         continue;
1187
1188       for (s = ibfd->sections; s != NULL; s = s->next)
1189         {
1190           struct riscv_elf_dyn_relocs *p;
1191
1192           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
1193             {
1194               if (!bfd_is_abs_section (p->sec)
1195                   && bfd_is_abs_section (p->sec->output_section))
1196                 {
1197                   /* Input section has been discarded, either because
1198                      it is a copy of a linkonce section or due to
1199                      linker script /DISCARD/, so we'll be discarding
1200                      the relocs too.  */
1201                 }
1202               else if (p->count != 0)
1203                 {
1204                   srel = elf_section_data (p->sec)->sreloc;
1205                   srel->size += p->count * sizeof (ElfNN_External_Rela);
1206                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1207                     info->flags |= DF_TEXTREL;
1208                 }
1209             }
1210         }
1211
1212       local_got = elf_local_got_refcounts (ibfd);
1213       if (!local_got)
1214         continue;
1215
1216       symtab_hdr = &elf_symtab_hdr (ibfd);
1217       locsymcount = symtab_hdr->sh_info;
1218       end_local_got = local_got + locsymcount;
1219       local_tls_type = _bfd_riscv_elf_local_got_tls_type (ibfd);
1220       s = htab->elf.sgot;
1221       srel = htab->elf.srelgot;
1222       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1223         {
1224           if (*local_got > 0)
1225             {
1226               *local_got = s->size;
1227               s->size += RISCV_ELF_WORD_BYTES;
1228               if (*local_tls_type & GOT_TLS_GD)
1229                 s->size += RISCV_ELF_WORD_BYTES;
1230               if (bfd_link_pic (info)
1231                   || (*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)))
1232                 srel->size += sizeof (ElfNN_External_Rela);
1233             }
1234           else
1235             *local_got = (bfd_vma) -1;
1236         }
1237     }
1238
1239   /* Allocate global sym .plt and .got entries, and space for global
1240      sym dynamic relocs.  */
1241   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
1242
1243   if (htab->elf.sgotplt)
1244     {
1245       struct elf_link_hash_entry *got;
1246       got = elf_link_hash_lookup (elf_hash_table (info),
1247                                   "_GLOBAL_OFFSET_TABLE_",
1248                                   FALSE, FALSE, FALSE);
1249
1250       /* Don't allocate .got.plt section if there are no GOT nor PLT
1251          entries and there is no refeence to _GLOBAL_OFFSET_TABLE_.  */
1252       if ((got == NULL
1253            || !got->ref_regular_nonweak)
1254           && (htab->elf.sgotplt->size == GOTPLT_HEADER_SIZE)
1255           && (htab->elf.splt == NULL
1256               || htab->elf.splt->size == 0)
1257           && (htab->elf.sgot == NULL
1258               || (htab->elf.sgot->size
1259                   == get_elf_backend_data (output_bfd)->got_header_size)))
1260         htab->elf.sgotplt->size = 0;
1261     }
1262
1263   /* The check_relocs and adjust_dynamic_symbol entry points have
1264      determined the sizes of the various dynamic sections.  Allocate
1265      memory for them.  */
1266   for (s = dynobj->sections; s != NULL; s = s->next)
1267     {
1268       if ((s->flags & SEC_LINKER_CREATED) == 0)
1269         continue;
1270
1271       if (s == htab->elf.splt
1272           || s == htab->elf.sgot
1273           || s == htab->elf.sgotplt
1274           || s == htab->elf.sdynbss
1275           || s == htab->elf.sdynrelro)
1276         {
1277           /* Strip this section if we don't need it; see the
1278              comment below.  */
1279         }
1280       else if (strncmp (s->name, ".rela", 5) == 0)
1281         {
1282           if (s->size != 0)
1283             {
1284               /* We use the reloc_count field as a counter if we need
1285                  to copy relocs into the output file.  */
1286               s->reloc_count = 0;
1287             }
1288         }
1289       else
1290         {
1291           /* It's not one of our sections.  */
1292           continue;
1293         }
1294
1295       if (s->size == 0)
1296         {
1297           /* If we don't need this section, strip it from the
1298              output file.  This is mostly to handle .rela.bss and
1299              .rela.plt.  We must create both sections in
1300              create_dynamic_sections, because they must be created
1301              before the linker maps input sections to output
1302              sections.  The linker does that before
1303              adjust_dynamic_symbol is called, and it is that
1304              function which decides whether anything needs to go
1305              into these sections.  */
1306           s->flags |= SEC_EXCLUDE;
1307           continue;
1308         }
1309
1310       if ((s->flags & SEC_HAS_CONTENTS) == 0)
1311         continue;
1312
1313       /* Allocate memory for the section contents.  Zero the memory
1314          for the benefit of .rela.plt, which has 4 unused entries
1315          at the beginning, and we don't want garbage.  */
1316       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1317       if (s->contents == NULL)
1318         return FALSE;
1319     }
1320
1321   if (elf_hash_table (info)->dynamic_sections_created)
1322     {
1323       /* Add some entries to the .dynamic section.  We fill in the
1324          values later, in riscv_elf_finish_dynamic_sections, but we
1325          must add the entries now so that we get the correct size for
1326          the .dynamic section.  The DT_DEBUG entry is filled in by the
1327          dynamic linker and used by the debugger.  */
1328 #define add_dynamic_entry(TAG, VAL) \
1329   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1330
1331       if (bfd_link_executable (info))
1332         {
1333           if (!add_dynamic_entry (DT_DEBUG, 0))
1334             return FALSE;
1335         }
1336
1337       if (htab->elf.srelplt->size != 0)
1338         {
1339           if (!add_dynamic_entry (DT_PLTGOT, 0)
1340               || !add_dynamic_entry (DT_PLTRELSZ, 0)
1341               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1342               || !add_dynamic_entry (DT_JMPREL, 0))
1343             return FALSE;
1344         }
1345
1346       if (!add_dynamic_entry (DT_RELA, 0)
1347           || !add_dynamic_entry (DT_RELASZ, 0)
1348           || !add_dynamic_entry (DT_RELAENT, sizeof (ElfNN_External_Rela)))
1349         return FALSE;
1350
1351       /* If any dynamic relocs apply to a read-only section,
1352          then we need a DT_TEXTREL entry.  */
1353       if ((info->flags & DF_TEXTREL) == 0)
1354         elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
1355
1356       if (info->flags & DF_TEXTREL)
1357         {
1358           if (!add_dynamic_entry (DT_TEXTREL, 0))
1359             return FALSE;
1360         }
1361     }
1362 #undef add_dynamic_entry
1363
1364   return TRUE;
1365 }
1366
1367 #define TP_OFFSET 0
1368 #define DTP_OFFSET 0x800
1369
1370 /* Return the relocation value for a TLS dtp-relative reloc.  */
1371
1372 static bfd_vma
1373 dtpoff (struct bfd_link_info *info, bfd_vma address)
1374 {
1375   /* If tls_sec is NULL, we should have signalled an error already.  */
1376   if (elf_hash_table (info)->tls_sec == NULL)
1377     return 0;
1378   return address - elf_hash_table (info)->tls_sec->vma - DTP_OFFSET;
1379 }
1380
1381 /* Return the relocation value for a static TLS tp-relative relocation.  */
1382
1383 static bfd_vma
1384 tpoff (struct bfd_link_info *info, bfd_vma address)
1385 {
1386   /* If tls_sec is NULL, we should have signalled an error already.  */
1387   if (elf_hash_table (info)->tls_sec == NULL)
1388     return 0;
1389   return address - elf_hash_table (info)->tls_sec->vma - TP_OFFSET;
1390 }
1391
1392 /* Return the global pointer's value, or 0 if it is not in use.  */
1393
1394 static bfd_vma
1395 riscv_global_pointer_value (struct bfd_link_info *info)
1396 {
1397   struct bfd_link_hash_entry *h;
1398
1399   h = bfd_link_hash_lookup (info->hash, RISCV_GP_SYMBOL, FALSE, FALSE, TRUE);
1400   if (h == NULL || h->type != bfd_link_hash_defined)
1401     return 0;
1402
1403   return h->u.def.value + sec_addr (h->u.def.section);
1404 }
1405
1406 /* Emplace a static relocation.  */
1407
1408 static bfd_reloc_status_type
1409 perform_relocation (const reloc_howto_type *howto,
1410                     const Elf_Internal_Rela *rel,
1411                     bfd_vma value,
1412                     asection *input_section,
1413                     bfd *input_bfd,
1414                     bfd_byte *contents)
1415 {
1416   if (howto->pc_relative)
1417     value -= sec_addr (input_section) + rel->r_offset;
1418   value += rel->r_addend;
1419
1420   switch (ELFNN_R_TYPE (rel->r_info))
1421     {
1422     case R_RISCV_HI20:
1423     case R_RISCV_TPREL_HI20:
1424     case R_RISCV_PCREL_HI20:
1425     case R_RISCV_GOT_HI20:
1426     case R_RISCV_TLS_GOT_HI20:
1427     case R_RISCV_TLS_GD_HI20:
1428       if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)))
1429         return bfd_reloc_overflow;
1430       value = ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value));
1431       break;
1432
1433     case R_RISCV_LO12_I:
1434     case R_RISCV_GPREL_I:
1435     case R_RISCV_TPREL_LO12_I:
1436     case R_RISCV_TPREL_I:
1437     case R_RISCV_PCREL_LO12_I:
1438       value = ENCODE_ITYPE_IMM (value);
1439       break;
1440
1441     case R_RISCV_LO12_S:
1442     case R_RISCV_GPREL_S:
1443     case R_RISCV_TPREL_LO12_S:
1444     case R_RISCV_TPREL_S:
1445     case R_RISCV_PCREL_LO12_S:
1446       value = ENCODE_STYPE_IMM (value);
1447       break;
1448
1449     case R_RISCV_CALL:
1450     case R_RISCV_CALL_PLT:
1451       if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)))
1452         return bfd_reloc_overflow;
1453       value = ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value))
1454               | (ENCODE_ITYPE_IMM (value) << 32);
1455       break;
1456
1457     case R_RISCV_JAL:
1458       if (!VALID_UJTYPE_IMM (value))
1459         return bfd_reloc_overflow;
1460       value = ENCODE_UJTYPE_IMM (value);
1461       break;
1462
1463     case R_RISCV_BRANCH:
1464       if (!VALID_SBTYPE_IMM (value))
1465         return bfd_reloc_overflow;
1466       value = ENCODE_SBTYPE_IMM (value);
1467       break;
1468
1469     case R_RISCV_RVC_BRANCH:
1470       if (!VALID_RVC_B_IMM (value))
1471         return bfd_reloc_overflow;
1472       value = ENCODE_RVC_B_IMM (value);
1473       break;
1474
1475     case R_RISCV_RVC_JUMP:
1476       if (!VALID_RVC_J_IMM (value))
1477         return bfd_reloc_overflow;
1478       value = ENCODE_RVC_J_IMM (value);
1479       break;
1480
1481     case R_RISCV_RVC_LUI:
1482       if (!VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value)))
1483         return bfd_reloc_overflow;
1484       value = ENCODE_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value));
1485       break;
1486
1487     case R_RISCV_32:
1488     case R_RISCV_64:
1489     case R_RISCV_ADD8:
1490     case R_RISCV_ADD16:
1491     case R_RISCV_ADD32:
1492     case R_RISCV_ADD64:
1493     case R_RISCV_SUB6:
1494     case R_RISCV_SUB8:
1495     case R_RISCV_SUB16:
1496     case R_RISCV_SUB32:
1497     case R_RISCV_SUB64:
1498     case R_RISCV_SET6:
1499     case R_RISCV_SET8:
1500     case R_RISCV_SET16:
1501     case R_RISCV_SET32:
1502     case R_RISCV_32_PCREL:
1503     case R_RISCV_TLS_DTPREL32:
1504     case R_RISCV_TLS_DTPREL64:
1505       break;
1506
1507     case R_RISCV_DELETE:
1508       return bfd_reloc_ok;
1509
1510     default:
1511       return bfd_reloc_notsupported;
1512     }
1513
1514   bfd_vma word = bfd_get (howto->bitsize, input_bfd, contents + rel->r_offset);
1515   word = (word & ~howto->dst_mask) | (value & howto->dst_mask);
1516   bfd_put (howto->bitsize, input_bfd, word, contents + rel->r_offset);
1517
1518   return bfd_reloc_ok;
1519 }
1520
1521 /* Remember all PC-relative high-part relocs we've encountered to help us
1522    later resolve the corresponding low-part relocs.  */
1523
1524 typedef struct
1525 {
1526   bfd_vma address;
1527   bfd_vma value;
1528 } riscv_pcrel_hi_reloc;
1529
1530 typedef struct riscv_pcrel_lo_reloc
1531 {
1532   asection *                     input_section;
1533   struct bfd_link_info *         info;
1534   reloc_howto_type *             howto;
1535   const Elf_Internal_Rela *      reloc;
1536   bfd_vma                        addr;
1537   const char *                   name;
1538   bfd_byte *                     contents;
1539   struct riscv_pcrel_lo_reloc *  next;
1540 } riscv_pcrel_lo_reloc;
1541
1542 typedef struct
1543 {
1544   htab_t hi_relocs;
1545   riscv_pcrel_lo_reloc *lo_relocs;
1546 } riscv_pcrel_relocs;
1547
1548 static hashval_t
1549 riscv_pcrel_reloc_hash (const void *entry)
1550 {
1551   const riscv_pcrel_hi_reloc *e = entry;
1552   return (hashval_t)(e->address >> 2);
1553 }
1554
1555 static bfd_boolean
1556 riscv_pcrel_reloc_eq (const void *entry1, const void *entry2)
1557 {
1558   const riscv_pcrel_hi_reloc *e1 = entry1, *e2 = entry2;
1559   return e1->address == e2->address;
1560 }
1561
1562 static bfd_boolean
1563 riscv_init_pcrel_relocs (riscv_pcrel_relocs *p)
1564 {
1565
1566   p->lo_relocs = NULL;
1567   p->hi_relocs = htab_create (1024, riscv_pcrel_reloc_hash,
1568                               riscv_pcrel_reloc_eq, free);
1569   return p->hi_relocs != NULL;
1570 }
1571
1572 static void
1573 riscv_free_pcrel_relocs (riscv_pcrel_relocs *p)
1574 {
1575   riscv_pcrel_lo_reloc *cur = p->lo_relocs;
1576
1577   while (cur != NULL)
1578     {
1579       riscv_pcrel_lo_reloc *next = cur->next;
1580       free (cur);
1581       cur = next;
1582     }
1583
1584   htab_delete (p->hi_relocs);
1585 }
1586
1587 static bfd_boolean
1588 riscv_zero_pcrel_hi_reloc (Elf_Internal_Rela *rel,
1589                            struct bfd_link_info *info,
1590                            bfd_vma pc,
1591                            bfd_vma addr,
1592                            bfd_byte *contents,
1593                            const reloc_howto_type *howto,
1594                            bfd *input_bfd)
1595 {
1596   /* We may need to reference low addreses in PC-relative modes even when the
1597    * PC is far away from these addresses.  For example, undefweak references
1598    * need to produce the address 0 when linked.  As 0 is far from the arbitrary
1599    * addresses that we can link PC-relative programs at, the linker can't
1600    * actually relocate references to those symbols.  In order to allow these
1601    * programs to work we simply convert the PC-relative auipc sequences to
1602    * 0-relative lui sequences.  */
1603   if (bfd_link_pic (info))
1604     return FALSE;
1605
1606   /* If it's possible to reference the symbol using auipc we do so, as that's
1607    * more in the spirit of the PC-relative relocations we're processing.  */
1608   bfd_vma offset = addr - pc;
1609   if (ARCH_SIZE == 32 || VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (offset)))
1610     return FALSE;
1611
1612   /* If it's impossible to reference this with a LUI-based offset then don't
1613    * bother to convert it at all so users still see the PC-relative relocation
1614    * in the truncation message.  */
1615   if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (addr)))
1616     return FALSE;
1617
1618   rel->r_info = ELFNN_R_INFO(addr, R_RISCV_HI20);
1619
1620   bfd_vma insn = bfd_get(howto->bitsize, input_bfd, contents + rel->r_offset);
1621   insn = (insn & ~MASK_AUIPC) | MATCH_LUI;
1622   bfd_put(howto->bitsize, input_bfd, insn, contents + rel->r_offset);
1623   return TRUE;
1624 }
1625
1626 static bfd_boolean
1627 riscv_record_pcrel_hi_reloc (riscv_pcrel_relocs *p, bfd_vma addr,
1628                              bfd_vma value, bfd_boolean absolute)
1629 {
1630   bfd_vma offset = absolute ? value : value - addr;
1631   riscv_pcrel_hi_reloc entry = {addr, offset};
1632   riscv_pcrel_hi_reloc **slot =
1633     (riscv_pcrel_hi_reloc **) htab_find_slot (p->hi_relocs, &entry, INSERT);
1634
1635   BFD_ASSERT (*slot == NULL);
1636   *slot = (riscv_pcrel_hi_reloc *) bfd_malloc (sizeof (riscv_pcrel_hi_reloc));
1637   if (*slot == NULL)
1638     return FALSE;
1639   **slot = entry;
1640   return TRUE;
1641 }
1642
1643 static bfd_boolean
1644 riscv_record_pcrel_lo_reloc (riscv_pcrel_relocs *p,
1645                              asection *input_section,
1646                              struct bfd_link_info *info,
1647                              reloc_howto_type *howto,
1648                              const Elf_Internal_Rela *reloc,
1649                              bfd_vma addr,
1650                              const char *name,
1651                              bfd_byte *contents)
1652 {
1653   riscv_pcrel_lo_reloc *entry;
1654   entry = (riscv_pcrel_lo_reloc *) bfd_malloc (sizeof (riscv_pcrel_lo_reloc));
1655   if (entry == NULL)
1656     return FALSE;
1657   *entry = (riscv_pcrel_lo_reloc) {input_section, info, howto, reloc, addr,
1658                                    name, contents, p->lo_relocs};
1659   p->lo_relocs = entry;
1660   return TRUE;
1661 }
1662
1663 static bfd_boolean
1664 riscv_resolve_pcrel_lo_relocs (riscv_pcrel_relocs *p)
1665 {
1666   riscv_pcrel_lo_reloc *r;
1667
1668   for (r = p->lo_relocs; r != NULL; r = r->next)
1669     {
1670       bfd *input_bfd = r->input_section->owner;
1671
1672       riscv_pcrel_hi_reloc search = {r->addr, 0};
1673       riscv_pcrel_hi_reloc *entry = htab_find (p->hi_relocs, &search);
1674       if (entry == NULL)
1675         {
1676           ((*r->info->callbacks->reloc_overflow)
1677            (r->info, NULL, r->name, r->howto->name, (bfd_vma) 0,
1678             input_bfd, r->input_section, r->reloc->r_offset));
1679           return TRUE;
1680         }
1681
1682       perform_relocation (r->howto, r->reloc, entry->value, r->input_section,
1683                           input_bfd, r->contents);
1684     }
1685
1686   return TRUE;
1687 }
1688
1689 /* Relocate a RISC-V ELF section.
1690
1691    The RELOCATE_SECTION function is called by the new ELF backend linker
1692    to handle the relocations for a section.
1693
1694    The relocs are always passed as Rela structures.
1695
1696    This function is responsible for adjusting the section contents as
1697    necessary, and (if generating a relocatable output file) adjusting
1698    the reloc addend as necessary.
1699
1700    This function does not have to worry about setting the reloc
1701    address or the reloc symbol index.
1702
1703    LOCAL_SYMS is a pointer to the swapped in local symbols.
1704
1705    LOCAL_SECTIONS is an array giving the section in the input file
1706    corresponding to the st_shndx field of each local symbol.
1707
1708    The global hash table entry for the global symbols can be found
1709    via elf_sym_hashes (input_bfd).
1710
1711    When generating relocatable output, this function must handle
1712    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1713    going to be the section symbol corresponding to the output
1714    section, which means that the addend must be adjusted
1715    accordingly.  */
1716
1717 static bfd_boolean
1718 riscv_elf_relocate_section (bfd *output_bfd,
1719                             struct bfd_link_info *info,
1720                             bfd *input_bfd,
1721                             asection *input_section,
1722                             bfd_byte *contents,
1723                             Elf_Internal_Rela *relocs,
1724                             Elf_Internal_Sym *local_syms,
1725                             asection **local_sections)
1726 {
1727   Elf_Internal_Rela *rel;
1728   Elf_Internal_Rela *relend;
1729   riscv_pcrel_relocs pcrel_relocs;
1730   bfd_boolean ret = FALSE;
1731   asection *sreloc = elf_section_data (input_section)->sreloc;
1732   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
1733   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_bfd);
1734   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
1735   bfd_vma *local_got_offsets = elf_local_got_offsets (input_bfd);
1736   bfd_boolean absolute;
1737
1738   if (!riscv_init_pcrel_relocs (&pcrel_relocs))
1739     return FALSE;
1740
1741   relend = relocs + input_section->reloc_count;
1742   for (rel = relocs; rel < relend; rel++)
1743     {
1744       unsigned long r_symndx;
1745       struct elf_link_hash_entry *h;
1746       Elf_Internal_Sym *sym;
1747       asection *sec;
1748       bfd_vma relocation;
1749       bfd_reloc_status_type r = bfd_reloc_ok;
1750       const char *name;
1751       bfd_vma off, ie_off;
1752       bfd_boolean unresolved_reloc, is_ie = FALSE;
1753       bfd_vma pc = sec_addr (input_section) + rel->r_offset;
1754       int r_type = ELFNN_R_TYPE (rel->r_info), tls_type;
1755       reloc_howto_type *howto = riscv_elf_rtype_to_howto (r_type);
1756       const char *msg = NULL;
1757
1758       if (r_type == R_RISCV_GNU_VTINHERIT || r_type == R_RISCV_GNU_VTENTRY)
1759         continue;
1760
1761       /* This is a final link.  */
1762       r_symndx = ELFNN_R_SYM (rel->r_info);
1763       h = NULL;
1764       sym = NULL;
1765       sec = NULL;
1766       unresolved_reloc = FALSE;
1767       if (r_symndx < symtab_hdr->sh_info)
1768         {
1769           sym = local_syms + r_symndx;
1770           sec = local_sections[r_symndx];
1771           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1772         }
1773       else
1774         {
1775           bfd_boolean warned, ignored;
1776
1777           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1778                                    r_symndx, symtab_hdr, sym_hashes,
1779                                    h, sec, relocation,
1780                                    unresolved_reloc, warned, ignored);
1781           if (warned)
1782             {
1783               /* To avoid generating warning messages about truncated
1784                  relocations, set the relocation's address to be the same as
1785                  the start of this section.  */
1786               if (input_section->output_section != NULL)
1787                 relocation = input_section->output_section->vma;
1788               else
1789                 relocation = 0;
1790             }
1791         }
1792
1793       if (sec != NULL && discarded_section (sec))
1794         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1795                                          rel, 1, relend, howto, 0, contents);
1796
1797       if (bfd_link_relocatable (info))
1798         continue;
1799
1800       if (h != NULL)
1801         name = h->root.root.string;
1802       else
1803         {
1804           name = (bfd_elf_string_from_elf_section
1805                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
1806           if (name == NULL || *name == '\0')
1807             name = bfd_section_name (input_bfd, sec);
1808         }
1809
1810       switch (r_type)
1811         {
1812         case R_RISCV_NONE:
1813         case R_RISCV_RELAX:
1814         case R_RISCV_TPREL_ADD:
1815         case R_RISCV_COPY:
1816         case R_RISCV_JUMP_SLOT:
1817         case R_RISCV_RELATIVE:
1818           /* These require nothing of us at all.  */
1819           continue;
1820
1821         case R_RISCV_HI20:
1822         case R_RISCV_BRANCH:
1823         case R_RISCV_RVC_BRANCH:
1824         case R_RISCV_RVC_LUI:
1825         case R_RISCV_LO12_I:
1826         case R_RISCV_LO12_S:
1827         case R_RISCV_SET6:
1828         case R_RISCV_SET8:
1829         case R_RISCV_SET16:
1830         case R_RISCV_SET32:
1831         case R_RISCV_32_PCREL:
1832         case R_RISCV_DELETE:
1833           /* These require no special handling beyond perform_relocation.  */
1834           break;
1835
1836         case R_RISCV_GOT_HI20:
1837           if (h != NULL)
1838             {
1839               bfd_boolean dyn, pic;
1840
1841               off = h->got.offset;
1842               BFD_ASSERT (off != (bfd_vma) -1);
1843               dyn = elf_hash_table (info)->dynamic_sections_created;
1844               pic = bfd_link_pic (info);
1845
1846               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
1847                   || (pic && SYMBOL_REFERENCES_LOCAL (info, h)))
1848                 {
1849                   /* This is actually a static link, or it is a
1850                      -Bsymbolic link and the symbol is defined
1851                      locally, or the symbol was forced to be local
1852                      because of a version file.  We must initialize
1853                      this entry in the global offset table.  Since the
1854                      offset must always be a multiple of the word size,
1855                      we use the least significant bit to record whether
1856                      we have initialized it already.
1857
1858                      When doing a dynamic link, we create a .rela.got
1859                      relocation entry to initialize the value.  This
1860                      is done in the finish_dynamic_symbol routine.  */
1861                   if ((off & 1) != 0)
1862                     off &= ~1;
1863                   else
1864                     {
1865                       bfd_put_NN (output_bfd, relocation,
1866                                   htab->elf.sgot->contents + off);
1867                       h->got.offset |= 1;
1868                     }
1869                 }
1870               else
1871                 unresolved_reloc = FALSE;
1872             }
1873           else
1874             {
1875               BFD_ASSERT (local_got_offsets != NULL
1876                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
1877
1878               off = local_got_offsets[r_symndx];
1879
1880               /* The offset must always be a multiple of the word size.
1881                  So, we can use the least significant bit to record
1882                  whether we have already processed this entry.  */
1883               if ((off & 1) != 0)
1884                 off &= ~1;
1885               else
1886                 {
1887                   if (bfd_link_pic (info))
1888                     {
1889                       asection *s;
1890                       Elf_Internal_Rela outrel;
1891
1892                       /* We need to generate a R_RISCV_RELATIVE reloc
1893                          for the dynamic linker.  */
1894                       s = htab->elf.srelgot;
1895                       BFD_ASSERT (s != NULL);
1896
1897                       outrel.r_offset = sec_addr (htab->elf.sgot) + off;
1898                       outrel.r_info =
1899                         ELFNN_R_INFO (0, R_RISCV_RELATIVE);
1900                       outrel.r_addend = relocation;
1901                       relocation = 0;
1902                       riscv_elf_append_rela (output_bfd, s, &outrel);
1903                     }
1904
1905                   bfd_put_NN (output_bfd, relocation,
1906                               htab->elf.sgot->contents + off);
1907                   local_got_offsets[r_symndx] |= 1;
1908                 }
1909             }
1910           relocation = sec_addr (htab->elf.sgot) + off;
1911           absolute = riscv_zero_pcrel_hi_reloc (rel,
1912                                                 info,
1913                                                 pc,
1914                                                 relocation,
1915                                                 contents,
1916                                                 howto,
1917                                                 input_bfd);
1918           r_type = ELFNN_R_TYPE (rel->r_info);
1919           howto = riscv_elf_rtype_to_howto (r_type);
1920           if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
1921                                             relocation, absolute))
1922             r = bfd_reloc_overflow;
1923           break;
1924
1925         case R_RISCV_ADD8:
1926         case R_RISCV_ADD16:
1927         case R_RISCV_ADD32:
1928         case R_RISCV_ADD64:
1929           {
1930             bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1931                                          contents + rel->r_offset);
1932             relocation = old_value + relocation;
1933           }
1934           break;
1935
1936         case R_RISCV_SUB6:
1937         case R_RISCV_SUB8:
1938         case R_RISCV_SUB16:
1939         case R_RISCV_SUB32:
1940         case R_RISCV_SUB64:
1941           {
1942             bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1943                                          contents + rel->r_offset);
1944             relocation = old_value - relocation;
1945           }
1946           break;
1947
1948         case R_RISCV_CALL_PLT:
1949         case R_RISCV_CALL:
1950         case R_RISCV_JAL:
1951         case R_RISCV_RVC_JUMP:
1952           if (bfd_link_pic (info) && h != NULL && h->plt.offset != MINUS_ONE)
1953             {
1954               /* Refer to the PLT entry.  */
1955               relocation = sec_addr (htab->elf.splt) + h->plt.offset;
1956               unresolved_reloc = FALSE;
1957             }
1958           break;
1959
1960         case R_RISCV_TPREL_HI20:
1961           relocation = tpoff (info, relocation);
1962           break;
1963
1964         case R_RISCV_TPREL_LO12_I:
1965         case R_RISCV_TPREL_LO12_S:
1966           relocation = tpoff (info, relocation);
1967           break;
1968
1969         case R_RISCV_TPREL_I:
1970         case R_RISCV_TPREL_S:
1971           relocation = tpoff (info, relocation);
1972           if (VALID_ITYPE_IMM (relocation + rel->r_addend))
1973             {
1974               /* We can use tp as the base register.  */
1975               bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
1976               insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1977               insn |= X_TP << OP_SH_RS1;
1978               bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
1979             }
1980           else
1981             r = bfd_reloc_overflow;
1982           break;
1983
1984         case R_RISCV_GPREL_I:
1985         case R_RISCV_GPREL_S:
1986           {
1987             bfd_vma gp = riscv_global_pointer_value (info);
1988             bfd_boolean x0_base = VALID_ITYPE_IMM (relocation + rel->r_addend);
1989             if (x0_base || VALID_ITYPE_IMM (relocation + rel->r_addend - gp))
1990               {
1991                 /* We can use x0 or gp as the base register.  */
1992                 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
1993                 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1994                 if (!x0_base)
1995                   {
1996                     rel->r_addend -= gp;
1997                     insn |= X_GP << OP_SH_RS1;
1998                   }
1999                 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
2000               }
2001             else
2002               r = bfd_reloc_overflow;
2003             break;
2004           }
2005
2006         case R_RISCV_PCREL_HI20:
2007           absolute = riscv_zero_pcrel_hi_reloc (rel,
2008                                                 info,
2009                                                 pc,
2010                                                 relocation,
2011                                                 contents,
2012                                                 howto,
2013                                                 input_bfd);
2014           r_type = ELFNN_R_TYPE (rel->r_info);
2015           howto = riscv_elf_rtype_to_howto (r_type);
2016           if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2017                                             relocation + rel->r_addend,
2018                                             absolute))
2019             r = bfd_reloc_overflow;
2020           break;
2021
2022         case R_RISCV_PCREL_LO12_I:
2023         case R_RISCV_PCREL_LO12_S:
2024           if (riscv_record_pcrel_lo_reloc (&pcrel_relocs, input_section, info,
2025                                            howto, rel, relocation, name,
2026                                            contents))
2027             continue;
2028           r = bfd_reloc_overflow;
2029           break;
2030
2031         case R_RISCV_TLS_DTPREL32:
2032         case R_RISCV_TLS_DTPREL64:
2033           relocation = dtpoff (info, relocation);
2034           break;
2035
2036         case R_RISCV_32:
2037         case R_RISCV_64:
2038           if ((input_section->flags & SEC_ALLOC) == 0)
2039             break;
2040
2041           if ((bfd_link_pic (info)
2042                && (h == NULL
2043                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2044                    || h->root.type != bfd_link_hash_undefweak)
2045                && (! howto->pc_relative
2046                    || !SYMBOL_CALLS_LOCAL (info, h)))
2047               || (!bfd_link_pic (info)
2048                   && h != NULL
2049                   && h->dynindx != -1
2050                   && !h->non_got_ref
2051                   && ((h->def_dynamic
2052                        && !h->def_regular)
2053                       || h->root.type == bfd_link_hash_undefweak
2054                       || h->root.type == bfd_link_hash_undefined)))
2055             {
2056               Elf_Internal_Rela outrel;
2057               bfd_boolean skip_static_relocation, skip_dynamic_relocation;
2058
2059               /* When generating a shared object, these relocations
2060                  are copied into the output file to be resolved at run
2061                  time.  */
2062
2063               outrel.r_offset =
2064                 _bfd_elf_section_offset (output_bfd, info, input_section,
2065                                          rel->r_offset);
2066               skip_static_relocation = outrel.r_offset != (bfd_vma) -2;
2067               skip_dynamic_relocation = outrel.r_offset >= (bfd_vma) -2;
2068               outrel.r_offset += sec_addr (input_section);
2069
2070               if (skip_dynamic_relocation)
2071                 memset (&outrel, 0, sizeof outrel);
2072               else if (h != NULL && h->dynindx != -1
2073                        && !(bfd_link_pic (info)
2074                             && SYMBOLIC_BIND (info, h)
2075                             && h->def_regular))
2076                 {
2077                   outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
2078                   outrel.r_addend = rel->r_addend;
2079                 }
2080               else
2081                 {
2082                   outrel.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2083                   outrel.r_addend = relocation + rel->r_addend;
2084                 }
2085
2086               riscv_elf_append_rela (output_bfd, sreloc, &outrel);
2087               if (skip_static_relocation)
2088                 continue;
2089             }
2090           break;
2091
2092         case R_RISCV_TLS_GOT_HI20:
2093           is_ie = TRUE;
2094           /* Fall through.  */
2095
2096         case R_RISCV_TLS_GD_HI20:
2097           if (h != NULL)
2098             {
2099               off = h->got.offset;
2100               h->got.offset |= 1;
2101             }
2102           else
2103             {
2104               off = local_got_offsets[r_symndx];
2105               local_got_offsets[r_symndx] |= 1;
2106             }
2107
2108           tls_type = _bfd_riscv_elf_tls_type (input_bfd, h, r_symndx);
2109           BFD_ASSERT (tls_type & (GOT_TLS_IE | GOT_TLS_GD));
2110           /* If this symbol is referenced by both GD and IE TLS, the IE
2111              reference's GOT slot follows the GD reference's slots.  */
2112           ie_off = 0;
2113           if ((tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_IE))
2114             ie_off = 2 * GOT_ENTRY_SIZE;
2115
2116           if ((off & 1) != 0)
2117             off &= ~1;
2118           else
2119             {
2120               Elf_Internal_Rela outrel;
2121               int indx = 0;
2122               bfd_boolean need_relocs = FALSE;
2123
2124               if (htab->elf.srelgot == NULL)
2125                 abort ();
2126
2127               if (h != NULL)
2128                 {
2129                   bfd_boolean dyn, pic;
2130                   dyn = htab->elf.dynamic_sections_created;
2131                   pic = bfd_link_pic (info);
2132
2133                   if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
2134                       && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
2135                     indx = h->dynindx;
2136                 }
2137
2138               /* The GOT entries have not been initialized yet.  Do it
2139                  now, and emit any relocations.  */
2140               if ((bfd_link_pic (info) || indx != 0)
2141                   && (h == NULL
2142                       || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2143                       || h->root.type != bfd_link_hash_undefweak))
2144                     need_relocs = TRUE;
2145
2146               if (tls_type & GOT_TLS_GD)
2147                 {
2148                   if (need_relocs)
2149                     {
2150                       outrel.r_offset = sec_addr (htab->elf.sgot) + off;
2151                       outrel.r_addend = 0;
2152                       outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPMODNN);
2153                       bfd_put_NN (output_bfd, 0,
2154                                   htab->elf.sgot->contents + off);
2155                       riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2156                       if (indx == 0)
2157                         {
2158                           BFD_ASSERT (! unresolved_reloc);
2159                           bfd_put_NN (output_bfd,
2160                                       dtpoff (info, relocation),
2161                                       (htab->elf.sgot->contents + off +
2162                                        RISCV_ELF_WORD_BYTES));
2163                         }
2164                       else
2165                         {
2166                           bfd_put_NN (output_bfd, 0,
2167                                       (htab->elf.sgot->contents + off +
2168                                        RISCV_ELF_WORD_BYTES));
2169                           outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPRELNN);
2170                           outrel.r_offset += RISCV_ELF_WORD_BYTES;
2171                           riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2172                         }
2173                     }
2174                   else
2175                     {
2176                       /* If we are not emitting relocations for a
2177                          general dynamic reference, then we must be in a
2178                          static link or an executable link with the
2179                          symbol binding locally.  Mark it as belonging
2180                          to module 1, the executable.  */
2181                       bfd_put_NN (output_bfd, 1,
2182                                   htab->elf.sgot->contents + off);
2183                       bfd_put_NN (output_bfd,
2184                                   dtpoff (info, relocation),
2185                                   (htab->elf.sgot->contents + off +
2186                                    RISCV_ELF_WORD_BYTES));
2187                    }
2188                 }
2189
2190               if (tls_type & GOT_TLS_IE)
2191                 {
2192                   if (need_relocs)
2193                     {
2194                       bfd_put_NN (output_bfd, 0,
2195                                   htab->elf.sgot->contents + off + ie_off);
2196                       outrel.r_offset = sec_addr (htab->elf.sgot)
2197                                        + off + ie_off;
2198                       outrel.r_addend = 0;
2199                       if (indx == 0)
2200                         outrel.r_addend = tpoff (info, relocation);
2201                       outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_TPRELNN);
2202                       riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2203                     }
2204                   else
2205                     {
2206                       bfd_put_NN (output_bfd, tpoff (info, relocation),
2207                                   htab->elf.sgot->contents + off + ie_off);
2208                     }
2209                 }
2210             }
2211
2212           BFD_ASSERT (off < (bfd_vma) -2);
2213           relocation = sec_addr (htab->elf.sgot) + off + (is_ie ? ie_off : 0);
2214           if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2215                                             relocation, FALSE))
2216             r = bfd_reloc_overflow;
2217           unresolved_reloc = FALSE;
2218           break;
2219
2220         default:
2221           r = bfd_reloc_notsupported;
2222         }
2223
2224       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2225          because such sections are not SEC_ALLOC and thus ld.so will
2226          not process them.  */
2227       if (unresolved_reloc
2228           && !((input_section->flags & SEC_DEBUGGING) != 0
2229                && h->def_dynamic)
2230           && _bfd_elf_section_offset (output_bfd, info, input_section,
2231                                       rel->r_offset) != (bfd_vma) -1)
2232         {
2233           (*_bfd_error_handler)
2234             (_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"),
2235              input_bfd,
2236              input_section,
2237              rel->r_offset,
2238              howto->name,
2239              h->root.root.string);
2240           continue;
2241         }
2242
2243       if (r == bfd_reloc_ok)
2244         r = perform_relocation (howto, rel, relocation, input_section,
2245                                 input_bfd, contents);
2246
2247       switch (r)
2248         {
2249         case bfd_reloc_ok:
2250           continue;
2251
2252         case bfd_reloc_overflow:
2253           info->callbacks->reloc_overflow
2254             (info, (h ? &h->root : NULL), name, howto->name,
2255              (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
2256           break;
2257
2258         case bfd_reloc_undefined:
2259           info->callbacks->undefined_symbol
2260             (info, name, input_bfd, input_section, rel->r_offset,
2261              TRUE);
2262           break;
2263
2264         case bfd_reloc_outofrange:
2265           msg = _("internal error: out of range error");
2266           break;
2267
2268         case bfd_reloc_notsupported:
2269           msg = _("internal error: unsupported relocation error");
2270           break;
2271
2272         case bfd_reloc_dangerous:
2273           msg = _("internal error: dangerous relocation");
2274           break;
2275
2276         default:
2277           msg = _("internal error: unknown error");
2278           break;
2279         }
2280
2281       if (msg)
2282         info->callbacks->warning
2283           (info, msg, name, input_bfd, input_section, rel->r_offset);
2284       goto out;
2285     }
2286
2287   ret = riscv_resolve_pcrel_lo_relocs (&pcrel_relocs);
2288 out:
2289   riscv_free_pcrel_relocs (&pcrel_relocs);
2290   return ret;
2291 }
2292
2293 /* Finish up dynamic symbol handling.  We set the contents of various
2294    dynamic sections here.  */
2295
2296 static bfd_boolean
2297 riscv_elf_finish_dynamic_symbol (bfd *output_bfd,
2298                                  struct bfd_link_info *info,
2299                                  struct elf_link_hash_entry *h,
2300                                  Elf_Internal_Sym *sym)
2301 {
2302   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2303   const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2304
2305   if (h->plt.offset != (bfd_vma) -1)
2306     {
2307       /* We've decided to create a PLT entry for this symbol.  */
2308       bfd_byte *loc;
2309       bfd_vma i, header_address, plt_idx, got_address;
2310       uint32_t plt_entry[PLT_ENTRY_INSNS];
2311       Elf_Internal_Rela rela;
2312
2313       BFD_ASSERT (h->dynindx != -1);
2314
2315       /* Calculate the address of the PLT header.  */
2316       header_address = sec_addr (htab->elf.splt);
2317
2318       /* Calculate the index of the entry.  */
2319       plt_idx = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
2320
2321       /* Calculate the address of the .got.plt entry.  */
2322       got_address = riscv_elf_got_plt_val (plt_idx, info);
2323
2324       /* Find out where the .plt entry should go.  */
2325       loc = htab->elf.splt->contents + h->plt.offset;
2326
2327       /* Fill in the PLT entry itself.  */
2328       riscv_make_plt_entry (got_address, header_address + h->plt.offset,
2329                             plt_entry);
2330       for (i = 0; i < PLT_ENTRY_INSNS; i++)
2331         bfd_put_32 (output_bfd, plt_entry[i], loc + 4*i);
2332
2333       /* Fill in the initial value of the .got.plt entry.  */
2334       loc = htab->elf.sgotplt->contents
2335             + (got_address - sec_addr (htab->elf.sgotplt));
2336       bfd_put_NN (output_bfd, sec_addr (htab->elf.splt), loc);
2337
2338       /* Fill in the entry in the .rela.plt section.  */
2339       rela.r_offset = got_address;
2340       rela.r_addend = 0;
2341       rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_JUMP_SLOT);
2342
2343       loc = htab->elf.srelplt->contents + plt_idx * sizeof (ElfNN_External_Rela);
2344       bed->s->swap_reloca_out (output_bfd, &rela, loc);
2345
2346       if (!h->def_regular)
2347         {
2348           /* Mark the symbol as undefined, rather than as defined in
2349              the .plt section.  Leave the value alone.  */
2350           sym->st_shndx = SHN_UNDEF;
2351           /* If the symbol is weak, we do need to clear the value.
2352              Otherwise, the PLT entry would provide a definition for
2353              the symbol even if the symbol wasn't defined anywhere,
2354              and so the symbol would never be NULL.  */
2355           if (!h->ref_regular_nonweak)
2356             sym->st_value = 0;
2357         }
2358     }
2359
2360   if (h->got.offset != (bfd_vma) -1
2361       && !(riscv_elf_hash_entry (h)->tls_type & (GOT_TLS_GD | GOT_TLS_IE)))
2362     {
2363       asection *sgot;
2364       asection *srela;
2365       Elf_Internal_Rela rela;
2366
2367       /* This symbol has an entry in the GOT.  Set it up.  */
2368
2369       sgot = htab->elf.sgot;
2370       srela = htab->elf.srelgot;
2371       BFD_ASSERT (sgot != NULL && srela != NULL);
2372
2373       rela.r_offset = sec_addr (sgot) + (h->got.offset &~ (bfd_vma) 1);
2374
2375       /* If this is a -Bsymbolic link, and the symbol is defined
2376          locally, we just want to emit a RELATIVE reloc.  Likewise if
2377          the symbol was forced to be local because of a version file.
2378          The entry in the global offset table will already have been
2379          initialized in the relocate_section function.  */
2380       if (bfd_link_pic (info)
2381           && (info->symbolic || h->dynindx == -1)
2382           && h->def_regular)
2383         {
2384           asection *sec = h->root.u.def.section;
2385           rela.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2386           rela.r_addend = (h->root.u.def.value
2387                            + sec->output_section->vma
2388                            + sec->output_offset);
2389         }
2390       else
2391         {
2392           BFD_ASSERT (h->dynindx != -1);
2393           rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_NN);
2394           rela.r_addend = 0;
2395         }
2396
2397       bfd_put_NN (output_bfd, 0,
2398                   sgot->contents + (h->got.offset & ~(bfd_vma) 1));
2399       riscv_elf_append_rela (output_bfd, srela, &rela);
2400     }
2401
2402   if (h->needs_copy)
2403     {
2404       Elf_Internal_Rela rela;
2405       asection *s;
2406
2407       /* This symbols needs a copy reloc.  Set it up.  */
2408       BFD_ASSERT (h->dynindx != -1);
2409
2410       rela.r_offset = sec_addr (h->root.u.def.section) + h->root.u.def.value;
2411       rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_COPY);
2412       rela.r_addend = 0;
2413       if (h->root.u.def.section == htab->elf.sdynrelro)
2414         s = htab->elf.sreldynrelro;
2415       else
2416         s = htab->elf.srelbss;
2417       riscv_elf_append_rela (output_bfd, s, &rela);
2418     }
2419
2420   /* Mark some specially defined symbols as absolute.  */
2421   if (h == htab->elf.hdynamic
2422       || (h == htab->elf.hgot || h == htab->elf.hplt))
2423     sym->st_shndx = SHN_ABS;
2424
2425   return TRUE;
2426 }
2427
2428 /* Finish up the dynamic sections.  */
2429
2430 static bfd_boolean
2431 riscv_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
2432                   bfd *dynobj, asection *sdyn)
2433 {
2434   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2435   const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2436   size_t dynsize = bed->s->sizeof_dyn;
2437   bfd_byte *dyncon, *dynconend;
2438
2439   dynconend = sdyn->contents + sdyn->size;
2440   for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
2441     {
2442       Elf_Internal_Dyn dyn;
2443       asection *s;
2444
2445       bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
2446
2447       switch (dyn.d_tag)
2448         {
2449         case DT_PLTGOT:
2450           s = htab->elf.sgotplt;
2451           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2452           break;
2453         case DT_JMPREL:
2454           s = htab->elf.srelplt;
2455           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2456           break;
2457         case DT_PLTRELSZ:
2458           s = htab->elf.srelplt;
2459           dyn.d_un.d_val = s->size;
2460           break;
2461         default:
2462           continue;
2463         }
2464
2465       bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
2466     }
2467   return TRUE;
2468 }
2469
2470 static bfd_boolean
2471 riscv_elf_finish_dynamic_sections (bfd *output_bfd,
2472                                    struct bfd_link_info *info)
2473 {
2474   bfd *dynobj;
2475   asection *sdyn;
2476   struct riscv_elf_link_hash_table *htab;
2477
2478   htab = riscv_elf_hash_table (info);
2479   BFD_ASSERT (htab != NULL);
2480   dynobj = htab->elf.dynobj;
2481
2482   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
2483
2484   if (elf_hash_table (info)->dynamic_sections_created)
2485     {
2486       asection *splt;
2487       bfd_boolean ret;
2488
2489       splt = htab->elf.splt;
2490       BFD_ASSERT (splt != NULL && sdyn != NULL);
2491
2492       ret = riscv_finish_dyn (output_bfd, info, dynobj, sdyn);
2493
2494       if (!ret)
2495         return ret;
2496
2497       /* Fill in the head and tail entries in the procedure linkage table.  */
2498       if (splt->size > 0)
2499         {
2500           int i;
2501           uint32_t plt_header[PLT_HEADER_INSNS];
2502           riscv_make_plt_header (sec_addr (htab->elf.sgotplt),
2503                                  sec_addr (splt), plt_header);
2504
2505           for (i = 0; i < PLT_HEADER_INSNS; i++)
2506             bfd_put_32 (output_bfd, plt_header[i], splt->contents + 4*i);
2507
2508           elf_section_data (splt->output_section)->this_hdr.sh_entsize
2509             = PLT_ENTRY_SIZE;
2510         }
2511     }
2512
2513   if (htab->elf.sgotplt)
2514     {
2515       asection *output_section = htab->elf.sgotplt->output_section;
2516
2517       if (bfd_is_abs_section (output_section))
2518         {
2519           (*_bfd_error_handler)
2520             (_("discarded output section: `%A'"), htab->elf.sgotplt);
2521           return FALSE;
2522         }
2523
2524       if (htab->elf.sgotplt->size > 0)
2525         {
2526           /* Write the first two entries in .got.plt, needed for the dynamic
2527              linker.  */
2528           bfd_put_NN (output_bfd, (bfd_vma) -1, htab->elf.sgotplt->contents);
2529           bfd_put_NN (output_bfd, (bfd_vma) 0,
2530                       htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
2531         }
2532
2533       elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2534     }
2535
2536   if (htab->elf.sgot)
2537     {
2538       asection *output_section = htab->elf.sgot->output_section;
2539
2540       if (htab->elf.sgot->size > 0)
2541         {
2542           /* Set the first entry in the global offset table to the address of
2543              the dynamic section.  */
2544           bfd_vma val = sdyn ? sec_addr (sdyn) : 0;
2545           bfd_put_NN (output_bfd, val, htab->elf.sgot->contents);
2546         }
2547
2548       elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2549     }
2550
2551   return TRUE;
2552 }
2553
2554 /* Return address for Ith PLT stub in section PLT, for relocation REL
2555    or (bfd_vma) -1 if it should not be included.  */
2556
2557 static bfd_vma
2558 riscv_elf_plt_sym_val (bfd_vma i, const asection *plt,
2559                        const arelent *rel ATTRIBUTE_UNUSED)
2560 {
2561   return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
2562 }
2563
2564 static enum elf_reloc_type_class
2565 riscv_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2566                         const asection *rel_sec ATTRIBUTE_UNUSED,
2567                         const Elf_Internal_Rela *rela)
2568 {
2569   switch (ELFNN_R_TYPE (rela->r_info))
2570     {
2571     case R_RISCV_RELATIVE:
2572       return reloc_class_relative;
2573     case R_RISCV_JUMP_SLOT:
2574       return reloc_class_plt;
2575     case R_RISCV_COPY:
2576       return reloc_class_copy;
2577     default:
2578       return reloc_class_normal;
2579     }
2580 }
2581
2582 /* Merge backend specific data from an object file to the output
2583    object file when linking.  */
2584
2585 static bfd_boolean
2586 _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2587 {
2588   bfd *obfd = info->output_bfd;
2589   flagword new_flags = elf_elfheader (ibfd)->e_flags;
2590   flagword old_flags = elf_elfheader (obfd)->e_flags;
2591
2592   if (!is_riscv_elf (ibfd) || !is_riscv_elf (obfd))
2593     return TRUE;
2594
2595   if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
2596     {
2597       (*_bfd_error_handler)
2598         (_("%B: ABI is incompatible with that of the selected emulation:\n"
2599            "  target emulation `%s' does not match `%s'"),
2600          ibfd, bfd_get_target (ibfd), bfd_get_target (obfd));
2601       return FALSE;
2602     }
2603
2604   if (!_bfd_elf_merge_object_attributes (ibfd, info))
2605     return FALSE;
2606
2607   if (! elf_flags_init (obfd))
2608     {
2609       elf_flags_init (obfd) = TRUE;
2610       elf_elfheader (obfd)->e_flags = new_flags;
2611       return TRUE;
2612     }
2613
2614   /* Disallow linking different float ABIs.  */
2615   if ((old_flags ^ new_flags) & EF_RISCV_FLOAT_ABI)
2616     {
2617       (*_bfd_error_handler)
2618         (_("%B: can't link hard-float modules with soft-float modules"), ibfd);
2619       goto fail;
2620     }
2621
2622   /* Allow linking RVC and non-RVC, and keep the RVC flag.  */
2623   elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC;
2624
2625   return TRUE;
2626
2627 fail:
2628   bfd_set_error (bfd_error_bad_value);
2629   return FALSE;
2630 }
2631
2632 /* Delete some bytes from a section while relaxing.  */
2633
2634 static bfd_boolean
2635 riscv_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, size_t count)
2636 {
2637   unsigned int i, symcount;
2638   bfd_vma toaddr = sec->size;
2639   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
2640   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2641   unsigned int sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2642   struct bfd_elf_section_data *data = elf_section_data (sec);
2643   bfd_byte *contents = data->this_hdr.contents;
2644
2645   /* Actually delete the bytes.  */
2646   sec->size -= count;
2647   memmove (contents + addr, contents + addr + count, toaddr - addr - count);
2648
2649   /* Adjust the location of all of the relocs.  Note that we need not
2650      adjust the addends, since all PC-relative references must be against
2651      symbols, which we will adjust below.  */
2652   for (i = 0; i < sec->reloc_count; i++)
2653     if (data->relocs[i].r_offset > addr && data->relocs[i].r_offset < toaddr)
2654       data->relocs[i].r_offset -= count;
2655
2656   /* Adjust the local symbols defined in this section.  */
2657   for (i = 0; i < symtab_hdr->sh_info; i++)
2658     {
2659       Elf_Internal_Sym *sym = (Elf_Internal_Sym *) symtab_hdr->contents + i;
2660       if (sym->st_shndx == sec_shndx)
2661         {
2662           /* If the symbol is in the range of memory we just moved, we
2663              have to adjust its value.  */
2664           if (sym->st_value > addr && sym->st_value <= toaddr)
2665             sym->st_value -= count;
2666
2667           /* If the symbol *spans* the bytes we just deleted (i.e. its
2668              *end* is in the moved bytes but its *start* isn't), then we
2669              must adjust its size.  */
2670           if (sym->st_value <= addr
2671               && sym->st_value + sym->st_size > addr
2672               && sym->st_value + sym->st_size <= toaddr)
2673             sym->st_size -= count;
2674         }
2675     }
2676
2677   /* Now adjust the global symbols defined in this section.  */
2678   symcount = ((symtab_hdr->sh_size / sizeof (ElfNN_External_Sym))
2679               - symtab_hdr->sh_info);
2680
2681   for (i = 0; i < symcount; i++)
2682     {
2683       struct elf_link_hash_entry *sym_hash = sym_hashes[i];
2684
2685       if ((sym_hash->root.type == bfd_link_hash_defined
2686            || sym_hash->root.type == bfd_link_hash_defweak)
2687           && sym_hash->root.u.def.section == sec)
2688         {
2689           /* As above, adjust the value if needed.  */
2690           if (sym_hash->root.u.def.value > addr
2691               && sym_hash->root.u.def.value <= toaddr)
2692             sym_hash->root.u.def.value -= count;
2693
2694           /* As above, adjust the size if needed.  */
2695           if (sym_hash->root.u.def.value <= addr
2696               && sym_hash->root.u.def.value + sym_hash->size > addr
2697               && sym_hash->root.u.def.value + sym_hash->size <= toaddr)
2698             sym_hash->size -= count;
2699         }
2700     }
2701
2702   return TRUE;
2703 }
2704
2705 /* A second format for recording PC-relative hi relocations.  This stores the
2706    information required to relax them to GP-relative addresses.  */
2707
2708 typedef struct riscv_pcgp_hi_reloc riscv_pcgp_hi_reloc;
2709 struct riscv_pcgp_hi_reloc
2710 {
2711   bfd_vma hi_sec_off;
2712   bfd_vma hi_addend;
2713   bfd_vma hi_addr;
2714   unsigned hi_sym;
2715   asection *sym_sec;
2716   riscv_pcgp_hi_reloc *next;
2717 };
2718
2719 typedef struct riscv_pcgp_lo_reloc riscv_pcgp_lo_reloc;
2720 struct riscv_pcgp_lo_reloc
2721 {
2722   bfd_vma hi_sec_off;
2723   riscv_pcgp_lo_reloc *next;
2724 };
2725
2726 typedef struct
2727 {
2728   riscv_pcgp_hi_reloc *hi;
2729   riscv_pcgp_lo_reloc *lo;
2730 } riscv_pcgp_relocs;
2731
2732 static bfd_boolean
2733 riscv_init_pcgp_relocs (riscv_pcgp_relocs *p)
2734 {
2735   p->hi = NULL;
2736   p->lo = NULL;
2737   return TRUE;
2738 }
2739
2740 static void
2741 riscv_free_pcgp_relocs (riscv_pcgp_relocs *p,
2742                         bfd *abfd ATTRIBUTE_UNUSED,
2743                         asection *sec ATTRIBUTE_UNUSED)
2744 {
2745   riscv_pcgp_hi_reloc *c;
2746   riscv_pcgp_lo_reloc *l;
2747
2748   for (c = p->hi; c != NULL;)
2749     {
2750       riscv_pcgp_hi_reloc *next = c->next;
2751       free (c);
2752       c = next;
2753     }
2754
2755   for (l = p->lo; l != NULL;)
2756     {
2757       riscv_pcgp_lo_reloc *next = l->next;
2758       free (l);
2759       l = next;
2760     }
2761 }
2762
2763 static bfd_boolean
2764 riscv_record_pcgp_hi_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off,
2765                             bfd_vma hi_addend, bfd_vma hi_addr,
2766                             unsigned hi_sym, asection *sym_sec)
2767 {
2768   riscv_pcgp_hi_reloc *new = bfd_malloc (sizeof(*new));
2769   if (!new)
2770     return FALSE;
2771   new->hi_sec_off = hi_sec_off;
2772   new->hi_addend = hi_addend;
2773   new->hi_addr = hi_addr;
2774   new->hi_sym = hi_sym;
2775   new->sym_sec = sym_sec;
2776   new->next = p->hi;
2777   p->hi = new;
2778   return TRUE;
2779 }
2780
2781 static riscv_pcgp_hi_reloc *
2782 riscv_find_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2783 {
2784   riscv_pcgp_hi_reloc *c;
2785
2786   for (c = p->hi; c != NULL; c = c->next)
2787     if (c->hi_sec_off == hi_sec_off)
2788       return c;
2789   return NULL;
2790 }
2791
2792 static bfd_boolean
2793 riscv_delete_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2794 {
2795   bfd_boolean out = FALSE;
2796   riscv_pcgp_hi_reloc *c;
2797
2798   for (c = p->hi; c != NULL; c = c->next)
2799       if (c->hi_sec_off == hi_sec_off)
2800         out = TRUE;
2801
2802   return out;
2803 }
2804
2805 static bfd_boolean
2806 riscv_use_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2807 {
2808   bfd_boolean out = FALSE;
2809   riscv_pcgp_hi_reloc *c;
2810
2811   for (c = p->hi; c != NULL; c = c->next)
2812     if (c->hi_sec_off == hi_sec_off)
2813       out = TRUE;
2814
2815   return out;
2816 }
2817
2818 static bfd_boolean
2819 riscv_record_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2820 {
2821   riscv_pcgp_lo_reloc *new = bfd_malloc (sizeof(*new));
2822   if (!new)
2823     return FALSE;
2824   new->hi_sec_off = hi_sec_off;
2825   new->next = p->lo;
2826   p->lo = new;
2827   return TRUE;
2828 }
2829
2830 static bfd_boolean
2831 riscv_find_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2832 {
2833   riscv_pcgp_lo_reloc *c;
2834
2835   for (c = p->lo; c != NULL; c = c->next)
2836     if (c->hi_sec_off == hi_sec_off)
2837       return TRUE;
2838   return FALSE;
2839 }
2840
2841 static bfd_boolean
2842 riscv_delete_pcgp_lo_reloc (riscv_pcgp_relocs *p ATTRIBUTE_UNUSED,
2843                             bfd_vma lo_sec_off ATTRIBUTE_UNUSED,
2844                             size_t bytes ATTRIBUTE_UNUSED)
2845 {
2846   return TRUE;
2847 }
2848
2849 typedef bfd_boolean (*relax_func_t) (bfd *, asection *, asection *,
2850                                      struct bfd_link_info *,
2851                                      Elf_Internal_Rela *,
2852                                      bfd_vma, bfd_vma, bfd_vma, bfd_boolean *,
2853                                      riscv_pcgp_relocs *);
2854
2855 /* Relax AUIPC + JALR into JAL.  */
2856
2857 static bfd_boolean
2858 _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec,
2859                        struct bfd_link_info *link_info,
2860                        Elf_Internal_Rela *rel,
2861                        bfd_vma symval,
2862                        bfd_vma max_alignment,
2863                        bfd_vma reserve_size ATTRIBUTE_UNUSED,
2864                        bfd_boolean *again,
2865                        riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
2866 {
2867   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2868   bfd_signed_vma foff = symval - (sec_addr (sec) + rel->r_offset);
2869   bfd_boolean near_zero = (symval + RISCV_IMM_REACH/2) < RISCV_IMM_REACH;
2870   bfd_vma auipc, jalr;
2871   int rd, r_type, len = 4, rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
2872
2873   /* If the call crosses section boundaries, an alignment directive could
2874      cause the PC-relative offset to later increase.  */
2875   if (VALID_UJTYPE_IMM (foff) && sym_sec->output_section != sec->output_section)
2876     foff += (foff < 0 ? -max_alignment : max_alignment);
2877
2878   /* See if this function call can be shortened.  */
2879   if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero))
2880     return TRUE;
2881
2882   /* Shorten the function call.  */
2883   BFD_ASSERT (rel->r_offset + 8 <= sec->size);
2884
2885   auipc = bfd_get_32 (abfd, contents + rel->r_offset);
2886   jalr = bfd_get_32 (abfd, contents + rel->r_offset + 4);
2887   rd = (jalr >> OP_SH_RD) & OP_MASK_RD;
2888   rvc = rvc && VALID_RVC_J_IMM (foff) && ARCH_SIZE == 32;
2889
2890   if (rvc && (rd == 0 || rd == X_RA))
2891     {
2892       /* Relax to C.J[AL] rd, addr.  */
2893       r_type = R_RISCV_RVC_JUMP;
2894       auipc = rd == 0 ? MATCH_C_J : MATCH_C_JAL;
2895       len = 2;
2896     }
2897   else if (VALID_UJTYPE_IMM (foff))
2898     {
2899       /* Relax to JAL rd, addr.  */
2900       r_type = R_RISCV_JAL;
2901       auipc = MATCH_JAL | (rd << OP_SH_RD);
2902     }
2903   else /* near_zero */
2904     {
2905       /* Relax to JALR rd, x0, addr.  */
2906       r_type = R_RISCV_LO12_I;
2907       auipc = MATCH_JALR | (rd << OP_SH_RD);
2908     }
2909
2910   /* Replace the R_RISCV_CALL reloc.  */
2911   rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), r_type);
2912   /* Replace the AUIPC.  */
2913   bfd_put (8 * len, abfd, auipc, contents + rel->r_offset);
2914
2915   /* Delete unnecessary JALR.  */
2916   *again = TRUE;
2917   return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + len, 8 - len);
2918 }
2919
2920 /* Traverse all output sections and return the max alignment.  */
2921
2922 static bfd_vma
2923 _bfd_riscv_get_max_alignment (asection *sec)
2924 {
2925   unsigned int max_alignment_power = 0;
2926   asection *o;
2927
2928   for (o = sec->output_section->owner->sections; o != NULL; o = o->next)
2929     {
2930       if (o->alignment_power > max_alignment_power)
2931         max_alignment_power = o->alignment_power;
2932     }
2933
2934   return (bfd_vma) 1 << max_alignment_power;
2935 }
2936
2937 /* Relax non-PIC global variable references.  */
2938
2939 static bfd_boolean
2940 _bfd_riscv_relax_lui (bfd *abfd,
2941                       asection *sec,
2942                       asection *sym_sec,
2943                       struct bfd_link_info *link_info,
2944                       Elf_Internal_Rela *rel,
2945                       bfd_vma symval,
2946                       bfd_vma max_alignment,
2947                       bfd_vma reserve_size,
2948                       bfd_boolean *again,
2949                       riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
2950 {
2951   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2952   bfd_vma gp = riscv_global_pointer_value (link_info);
2953   int use_rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
2954
2955   /* Mergeable symbols and code might later move out of range.  */
2956   if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
2957     return TRUE;
2958
2959   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
2960
2961   if (gp)
2962     {
2963       /* If gp and the symbol are in the same output section, then
2964          consider only that section's alignment.  */
2965       struct bfd_link_hash_entry *h =
2966         bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE,
2967                               TRUE);
2968       if (h->u.def.section->output_section == sym_sec->output_section)
2969         max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
2970     }
2971
2972   /* Is the reference in range of x0 or gp?
2973      Valid gp range conservatively because of alignment issue.  */
2974   if (VALID_ITYPE_IMM (symval)
2975       || (symval >= gp
2976           && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
2977       || (symval < gp
2978           && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
2979     {
2980       unsigned sym = ELFNN_R_SYM (rel->r_info);
2981       switch (ELFNN_R_TYPE (rel->r_info))
2982         {
2983         case R_RISCV_LO12_I:
2984           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
2985           return TRUE;
2986
2987         case R_RISCV_LO12_S:
2988           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
2989           return TRUE;
2990
2991         case R_RISCV_HI20:
2992           /* We can delete the unnecessary LUI and reloc.  */
2993           rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
2994           *again = TRUE;
2995           return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4);
2996
2997         default:
2998           abort ();
2999         }
3000     }
3001
3002   /* Can we relax LUI to C.LUI?  Alignment might move the section forward;
3003      account for this assuming page alignment at worst.  */
3004   if (use_rvc
3005       && ELFNN_R_TYPE (rel->r_info) == R_RISCV_HI20
3006       && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval))
3007       && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval + ELF_MAXPAGESIZE)))
3008     {
3009       /* Replace LUI with C.LUI if legal (i.e., rd != x0 and rd != x2/sp).  */
3010       bfd_vma lui = bfd_get_32 (abfd, contents + rel->r_offset);
3011       unsigned rd = ((unsigned)lui >> OP_SH_RD) & OP_MASK_RD;
3012       if (rd == 0 || rd == X_SP)
3013         return TRUE;
3014
3015       lui = (lui & (OP_MASK_RD << OP_SH_RD)) | MATCH_C_LUI;
3016       bfd_put_32 (abfd, lui, contents + rel->r_offset);
3017
3018       /* Replace the R_RISCV_HI20 reloc.  */
3019       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_RVC_LUI);
3020
3021       *again = TRUE;
3022       return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + 2, 2);
3023     }
3024
3025   return TRUE;
3026 }
3027
3028 /* Relax non-PIC TLS references.  */
3029
3030 static bfd_boolean
3031 _bfd_riscv_relax_tls_le (bfd *abfd,
3032                          asection *sec,
3033                          asection *sym_sec ATTRIBUTE_UNUSED,
3034                          struct bfd_link_info *link_info,
3035                          Elf_Internal_Rela *rel,
3036                          bfd_vma symval,
3037                          bfd_vma max_alignment ATTRIBUTE_UNUSED,
3038                          bfd_vma reserve_size ATTRIBUTE_UNUSED,
3039                          bfd_boolean *again,
3040                          riscv_pcgp_relocs *prcel_relocs ATTRIBUTE_UNUSED)
3041 {
3042   /* See if this symbol is in range of tp.  */
3043   if (RISCV_CONST_HIGH_PART (tpoff (link_info, symval)) != 0)
3044     return TRUE;
3045
3046   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3047   switch (ELFNN_R_TYPE (rel->r_info))
3048     {
3049     case R_RISCV_TPREL_LO12_I:
3050       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_I);
3051       return TRUE;
3052
3053     case R_RISCV_TPREL_LO12_S:
3054       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_S);
3055       return TRUE;
3056
3057     case R_RISCV_TPREL_HI20:
3058     case R_RISCV_TPREL_ADD:
3059       /* We can delete the unnecessary instruction and reloc.  */
3060       rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3061       *again = TRUE;
3062       return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4);
3063
3064     default:
3065       abort ();
3066     }
3067 }
3068
3069 /* Implement R_RISCV_ALIGN by deleting excess alignment NOPs.  */
3070
3071 static bfd_boolean
3072 _bfd_riscv_relax_align (bfd *abfd, asection *sec,
3073                         asection *sym_sec,
3074                         struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
3075                         Elf_Internal_Rela *rel,
3076                         bfd_vma symval,
3077                         bfd_vma max_alignment ATTRIBUTE_UNUSED,
3078                         bfd_vma reserve_size ATTRIBUTE_UNUSED,
3079                         bfd_boolean *again ATTRIBUTE_UNUSED,
3080                         riscv_pcgp_relocs *pcrel_relocs ATTRIBUTE_UNUSED)
3081 {
3082   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
3083   bfd_vma alignment = 1, pos;
3084   while (alignment <= rel->r_addend)
3085     alignment *= 2;
3086
3087   symval -= rel->r_addend;
3088   bfd_vma aligned_addr = ((symval - 1) & ~(alignment - 1)) + alignment;
3089   bfd_vma nop_bytes = aligned_addr - symval;
3090
3091   /* Once we've handled an R_RISCV_ALIGN, we can't relax anything else.  */
3092   sec->sec_flg0 = TRUE;
3093
3094   /* Make sure there are enough NOPs to actually achieve the alignment.  */
3095   if (rel->r_addend < nop_bytes)
3096     {
3097       (*_bfd_error_handler)
3098         (_("%B(%A+0x%lx): %d bytes required for alignment "
3099            "to %d-byte boundary, but only %d present"),
3100            abfd, sym_sec, rel->r_offset, nop_bytes, alignment, rel->r_addend);
3101       bfd_set_error (bfd_error_bad_value);
3102       return FALSE;
3103     }
3104
3105   /* Delete the reloc.  */
3106   rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3107
3108   /* If the number of NOPs is already correct, there's nothing to do.  */
3109   if (nop_bytes == rel->r_addend)
3110     return TRUE;
3111
3112   /* Write as many RISC-V NOPs as we need.  */
3113   for (pos = 0; pos < (nop_bytes & -4); pos += 4)
3114     bfd_put_32 (abfd, RISCV_NOP, contents + rel->r_offset + pos);
3115
3116   /* Write a final RVC NOP if need be.  */
3117   if (nop_bytes % 4 != 0)
3118     bfd_put_16 (abfd, RVC_NOP, contents + rel->r_offset + pos);
3119
3120   /* Delete the excess bytes.  */
3121   return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + nop_bytes,
3122                                    rel->r_addend - nop_bytes);
3123 }
3124
3125 /* Relax PC-relative references to GP-relative references.  */
3126
3127 static bfd_boolean
3128 _bfd_riscv_relax_pc  (bfd *abfd,
3129                       asection *sec,
3130                       asection *sym_sec,
3131                       struct bfd_link_info *link_info,
3132                       Elf_Internal_Rela *rel,
3133                       bfd_vma symval,
3134                       bfd_vma max_alignment,
3135                       bfd_vma reserve_size,
3136                       bfd_boolean *again ATTRIBUTE_UNUSED,
3137                       riscv_pcgp_relocs *pcgp_relocs)
3138 {
3139   bfd_vma gp = riscv_global_pointer_value (link_info);
3140
3141   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3142
3143   /* Chain the _LO relocs to their cooresponding _HI reloc to compute the
3144    * actual target address.  */
3145   riscv_pcgp_hi_reloc hi_reloc = {0};
3146   switch (ELFNN_R_TYPE (rel->r_info))
3147     {
3148     case R_RISCV_PCREL_LO12_I:
3149     case R_RISCV_PCREL_LO12_S:
3150       {
3151         riscv_pcgp_hi_reloc *hi = riscv_find_pcgp_hi_reloc (pcgp_relocs,
3152                                                             symval - sec_addr(sym_sec));
3153         if (hi == NULL)
3154           {
3155             riscv_record_pcgp_lo_reloc (pcgp_relocs, symval - sec_addr(sym_sec));
3156             return TRUE;
3157           }
3158
3159         hi_reloc = *hi;
3160         symval = hi_reloc.hi_addr;
3161         sym_sec = hi_reloc.sym_sec;
3162         if (!riscv_use_pcgp_hi_reloc(pcgp_relocs, hi->hi_sec_off))
3163           (*_bfd_error_handler)
3164            (_("%B(%A+0x%lx): Unable to clear RISCV_PCREL_HI20 reloc"
3165               "for cooresponding RISCV_PCREL_LO12 reloc"),
3166             abfd, sec, rel->r_offset);
3167       }
3168       break;
3169
3170     case R_RISCV_PCREL_HI20:
3171       /* Mergeable symbols and code might later move out of range.  */
3172       if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
3173         return TRUE;
3174
3175       /* If the cooresponding lo relocation has already been seen then it's not
3176        * safe to relax this relocation.  */
3177       if (riscv_find_pcgp_lo_reloc (pcgp_relocs, rel->r_offset))
3178         return TRUE;
3179
3180       break;
3181
3182     default:
3183       abort ();
3184     }
3185
3186   if (gp)
3187     {
3188       /* If gp and the symbol are in the same output section, then
3189          consider only that section's alignment.  */
3190       struct bfd_link_hash_entry *h =
3191         bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE, TRUE);
3192       if (h->u.def.section->output_section == sym_sec->output_section)
3193         max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
3194     }
3195
3196   /* Is the reference in range of x0 or gp?
3197      Valid gp range conservatively because of alignment issue.  */
3198   if (VALID_ITYPE_IMM (symval)
3199       || (symval >= gp
3200           && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
3201       || (symval < gp
3202           && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
3203     {
3204       unsigned sym = hi_reloc.hi_sym;
3205       switch (ELFNN_R_TYPE (rel->r_info))
3206         {
3207         case R_RISCV_PCREL_LO12_I:
3208           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
3209           rel->r_addend += hi_reloc.hi_addend;
3210           return riscv_delete_pcgp_lo_reloc (pcgp_relocs, rel->r_offset, 4);
3211
3212         case R_RISCV_PCREL_LO12_S:
3213           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
3214           rel->r_addend += hi_reloc.hi_addend;
3215           return riscv_delete_pcgp_lo_reloc (pcgp_relocs, rel->r_offset, 4);
3216
3217         case R_RISCV_PCREL_HI20:
3218           riscv_record_pcgp_hi_reloc (pcgp_relocs,
3219                                       rel->r_offset,
3220                                       rel->r_addend,
3221                                       symval,
3222                                       ELFNN_R_SYM(rel->r_info),
3223                                       sym_sec);
3224           /* We can delete the unnecessary AUIPC and reloc.  */
3225           rel->r_info = ELFNN_R_INFO (0, R_RISCV_DELETE);
3226           rel->r_addend = 4;
3227           return riscv_delete_pcgp_hi_reloc (pcgp_relocs, rel->r_offset);
3228
3229         default:
3230           abort ();
3231         }
3232     }
3233
3234   return TRUE;
3235 }
3236
3237 /* Relax PC-relative references to GP-relative references.  */
3238
3239 static bfd_boolean
3240 _bfd_riscv_relax_delete (bfd *abfd,
3241                          asection *sec,
3242                          asection *sym_sec ATTRIBUTE_UNUSED,
3243                          struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
3244                          Elf_Internal_Rela *rel,
3245                          bfd_vma symval ATTRIBUTE_UNUSED,
3246                          bfd_vma max_alignment ATTRIBUTE_UNUSED,
3247                          bfd_vma reserve_size ATTRIBUTE_UNUSED,
3248                          bfd_boolean *again ATTRIBUTE_UNUSED,
3249                          riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
3250 {
3251   if (!riscv_relax_delete_bytes(abfd, sec, rel->r_offset, rel->r_addend))
3252     return FALSE;
3253   rel->r_info = ELFNN_R_INFO(0, R_RISCV_NONE);
3254   return TRUE;
3255 }
3256
3257 /* Relax a section.  Pass 0 shortens code sequences unless disabled.  Pass 1
3258    deletes the bytes that pass 0 made obselete.  Pass 2, which cannot be
3259    disabled, handles code alignment directives.  */
3260
3261 static bfd_boolean
3262 _bfd_riscv_relax_section (bfd *abfd, asection *sec,
3263                           struct bfd_link_info *info,
3264                           bfd_boolean *again)
3265 {
3266   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
3267   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
3268   struct bfd_elf_section_data *data = elf_section_data (sec);
3269   Elf_Internal_Rela *relocs;
3270   bfd_boolean ret = FALSE;
3271   unsigned int i;
3272   bfd_vma max_alignment, reserve_size = 0;
3273   riscv_pcgp_relocs pcgp_relocs;
3274
3275   *again = FALSE;
3276
3277   if (bfd_link_relocatable (info)
3278       || sec->sec_flg0
3279       || (sec->flags & SEC_RELOC) == 0
3280       || sec->reloc_count == 0
3281       || (info->disable_target_specific_optimizations
3282           && info->relax_pass == 0))
3283     return TRUE;
3284
3285   riscv_init_pcgp_relocs (&pcgp_relocs);
3286
3287   /* Read this BFD's relocs if we haven't done so already.  */
3288   if (data->relocs)
3289     relocs = data->relocs;
3290   else if (!(relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
3291                                                  info->keep_memory)))
3292     goto fail;
3293
3294   if (htab)
3295     {
3296       max_alignment = htab->max_alignment;
3297       if (max_alignment == (bfd_vma) -1)
3298         {
3299           max_alignment = _bfd_riscv_get_max_alignment (sec);
3300           htab->max_alignment = max_alignment;
3301         }
3302     }
3303   else
3304     max_alignment = _bfd_riscv_get_max_alignment (sec);
3305
3306   /* Examine and consider relaxing each reloc.  */
3307   for (i = 0; i < sec->reloc_count; i++)
3308     {
3309       asection *sym_sec;
3310       Elf_Internal_Rela *rel = relocs + i;
3311       relax_func_t relax_func;
3312       int type = ELFNN_R_TYPE (rel->r_info);
3313       bfd_vma symval;
3314
3315       relax_func = NULL;
3316       if (info->relax_pass == 0)
3317         {
3318           if (type == R_RISCV_CALL || type == R_RISCV_CALL_PLT)
3319             relax_func = _bfd_riscv_relax_call;
3320           else if (type == R_RISCV_HI20
3321                    || type == R_RISCV_LO12_I
3322                    || type == R_RISCV_LO12_S)
3323             relax_func = _bfd_riscv_relax_lui;
3324           else if (!bfd_link_pic(info)
3325                    && (type == R_RISCV_PCREL_HI20
3326                    || type == R_RISCV_PCREL_LO12_I
3327                    || type == R_RISCV_PCREL_LO12_S))
3328             relax_func = _bfd_riscv_relax_pc;
3329           else if (type == R_RISCV_TPREL_HI20
3330                    || type == R_RISCV_TPREL_ADD
3331                    || type == R_RISCV_TPREL_LO12_I
3332                    || type == R_RISCV_TPREL_LO12_S)
3333             relax_func = _bfd_riscv_relax_tls_le;
3334           else
3335             continue;
3336
3337           /* Only relax this reloc if it is paired with R_RISCV_RELAX.  */
3338           if (i == sec->reloc_count - 1
3339               || ELFNN_R_TYPE ((rel + 1)->r_info) != R_RISCV_RELAX
3340               || rel->r_offset != (rel + 1)->r_offset)
3341             continue;
3342
3343           /* Skip over the R_RISCV_RELAX.  */
3344           i++;
3345         }
3346       else if (info->relax_pass == 1 && type == R_RISCV_DELETE)
3347         relax_func = _bfd_riscv_relax_delete;
3348       else if (info->relax_pass == 2 && type == R_RISCV_ALIGN)
3349         relax_func = _bfd_riscv_relax_align;
3350       else
3351         continue;
3352
3353       data->relocs = relocs;
3354
3355       /* Read this BFD's contents if we haven't done so already.  */
3356       if (!data->this_hdr.contents
3357           && !bfd_malloc_and_get_section (abfd, sec, &data->this_hdr.contents))
3358         goto fail;
3359
3360       /* Read this BFD's symbols if we haven't done so already.  */
3361       if (symtab_hdr->sh_info != 0
3362           && !symtab_hdr->contents
3363           && !(symtab_hdr->contents =
3364                (unsigned char *) bfd_elf_get_elf_syms (abfd, symtab_hdr,
3365                                                        symtab_hdr->sh_info,
3366                                                        0, NULL, NULL, NULL)))
3367         goto fail;
3368
3369       /* Get the value of the symbol referred to by the reloc.  */
3370       if (ELFNN_R_SYM (rel->r_info) < symtab_hdr->sh_info)
3371         {
3372           /* A local symbol.  */
3373           Elf_Internal_Sym *isym = ((Elf_Internal_Sym *) symtab_hdr->contents
3374                                     + ELFNN_R_SYM (rel->r_info));
3375           reserve_size = (isym->st_size - rel->r_addend) > isym->st_size
3376             ? 0 : isym->st_size - rel->r_addend;
3377
3378           if (isym->st_shndx == SHN_UNDEF)
3379             sym_sec = sec, symval = sec_addr (sec) + rel->r_offset;
3380           else
3381             {
3382               BFD_ASSERT (isym->st_shndx < elf_numsections (abfd));
3383               sym_sec = elf_elfsections (abfd)[isym->st_shndx]->bfd_section;
3384               if (sec_addr (sym_sec) == 0)
3385                 continue;
3386               symval = sec_addr (sym_sec) + isym->st_value;
3387             }
3388         }
3389       else
3390         {
3391           unsigned long indx;
3392           struct elf_link_hash_entry *h;
3393
3394           indx = ELFNN_R_SYM (rel->r_info) - symtab_hdr->sh_info;
3395           h = elf_sym_hashes (abfd)[indx];
3396
3397           while (h->root.type == bfd_link_hash_indirect
3398                  || h->root.type == bfd_link_hash_warning)
3399             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3400
3401           if (h->plt.offset != MINUS_ONE)
3402             symval = sec_addr (htab->elf.splt) + h->plt.offset;
3403           else if (h->root.u.def.section->output_section == NULL
3404                    || (h->root.type != bfd_link_hash_defined
3405                        && h->root.type != bfd_link_hash_defweak))
3406             continue;
3407           else
3408             symval = sec_addr (h->root.u.def.section) + h->root.u.def.value;
3409
3410           if (h->type != STT_FUNC)
3411             reserve_size =
3412               (h->size - rel->r_addend) > h->size ? 0 : h->size - rel->r_addend;
3413           sym_sec = h->root.u.def.section;
3414         }
3415
3416       symval += rel->r_addend;
3417
3418       if (!relax_func (abfd, sec, sym_sec, info, rel, symval,
3419                        max_alignment, reserve_size, again,
3420                        &pcgp_relocs))
3421         goto fail;
3422     }
3423
3424   ret = TRUE;
3425
3426 fail:
3427   if (relocs != data->relocs)
3428     free (relocs);
3429   riscv_free_pcgp_relocs(&pcgp_relocs, abfd, sec);
3430
3431   return ret;
3432 }
3433
3434 #if ARCH_SIZE == 32
3435 # define PRSTATUS_SIZE                  0 /* FIXME */
3436 # define PRSTATUS_OFFSET_PR_CURSIG      12
3437 # define PRSTATUS_OFFSET_PR_PID         24
3438 # define PRSTATUS_OFFSET_PR_REG         72
3439 # define ELF_GREGSET_T_SIZE             128
3440 # define PRPSINFO_SIZE                  128
3441 # define PRPSINFO_OFFSET_PR_PID         16
3442 # define PRPSINFO_OFFSET_PR_FNAME       32
3443 # define PRPSINFO_OFFSET_PR_PSARGS      48
3444 #else
3445 # define PRSTATUS_SIZE                  376
3446 # define PRSTATUS_OFFSET_PR_CURSIG      12
3447 # define PRSTATUS_OFFSET_PR_PID         32
3448 # define PRSTATUS_OFFSET_PR_REG         112
3449 # define ELF_GREGSET_T_SIZE             256
3450 # define PRPSINFO_SIZE                  136
3451 # define PRPSINFO_OFFSET_PR_PID         24
3452 # define PRPSINFO_OFFSET_PR_FNAME       40
3453 # define PRPSINFO_OFFSET_PR_PSARGS      56
3454 #endif
3455
3456 /* Support for core dump NOTE sections.  */
3457
3458 static bfd_boolean
3459 riscv_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3460 {
3461   switch (note->descsz)
3462     {
3463       default:
3464         return FALSE;
3465
3466       case PRSTATUS_SIZE:  /* sizeof(struct elf_prstatus) on Linux/RISC-V.  */
3467         /* pr_cursig */
3468         elf_tdata (abfd)->core->signal
3469           = bfd_get_16 (abfd, note->descdata + PRSTATUS_OFFSET_PR_CURSIG);
3470
3471         /* pr_pid */
3472         elf_tdata (abfd)->core->lwpid
3473           = bfd_get_32 (abfd, note->descdata + PRSTATUS_OFFSET_PR_PID);
3474         break;
3475     }
3476
3477   /* Make a ".reg/999" section.  */
3478   return _bfd_elfcore_make_pseudosection (abfd, ".reg", ELF_GREGSET_T_SIZE,
3479                                           note->descpos + PRSTATUS_OFFSET_PR_REG);
3480 }
3481
3482 static bfd_boolean
3483 riscv_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3484 {
3485   switch (note->descsz)
3486     {
3487       default:
3488         return FALSE;
3489
3490       case PRPSINFO_SIZE: /* sizeof(struct elf_prpsinfo) on Linux/RISC-V.  */
3491         /* pr_pid */
3492         elf_tdata (abfd)->core->pid
3493           = bfd_get_32 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PID);
3494
3495         /* pr_fname */
3496         elf_tdata (abfd)->core->program = _bfd_elfcore_strndup
3497           (abfd, note->descdata + PRPSINFO_OFFSET_PR_FNAME, 16);
3498
3499         /* pr_psargs */
3500         elf_tdata (abfd)->core->command = _bfd_elfcore_strndup
3501           (abfd, note->descdata + PRPSINFO_OFFSET_PR_PSARGS, 80);
3502         break;
3503     }
3504
3505   /* Note that for some reason, a spurious space is tacked
3506      onto the end of the args in some (at least one anyway)
3507      implementations, so strip it off if it exists.  */
3508
3509   {
3510     char *command = elf_tdata (abfd)->core->command;
3511     int n = strlen (command);
3512
3513     if (0 < n && command[n - 1] == ' ')
3514       command[n - 1] = '\0';
3515   }
3516
3517   return TRUE;
3518 }
3519
3520 /* Set the right mach type.  */
3521 static bfd_boolean
3522 riscv_elf_object_p (bfd *abfd)
3523 {
3524   /* There are only two mach types in RISCV currently.  */
3525   if (strcmp (abfd->xvec->name, "elf32-littleriscv") == 0)
3526     bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv32);
3527   else
3528     bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv64);
3529
3530   return TRUE;
3531 }
3532
3533
3534 #define TARGET_LITTLE_SYM               riscv_elfNN_vec
3535 #define TARGET_LITTLE_NAME              "elfNN-littleriscv"
3536
3537 #define elf_backend_reloc_type_class         riscv_reloc_type_class
3538
3539 #define bfd_elfNN_bfd_reloc_name_lookup      riscv_reloc_name_lookup
3540 #define bfd_elfNN_bfd_link_hash_table_create riscv_elf_link_hash_table_create
3541 #define bfd_elfNN_bfd_reloc_type_lookup      riscv_reloc_type_lookup
3542 #define bfd_elfNN_bfd_merge_private_bfd_data \
3543   _bfd_riscv_elf_merge_private_bfd_data
3544
3545 #define elf_backend_copy_indirect_symbol     riscv_elf_copy_indirect_symbol
3546 #define elf_backend_create_dynamic_sections  riscv_elf_create_dynamic_sections
3547 #define elf_backend_check_relocs             riscv_elf_check_relocs
3548 #define elf_backend_adjust_dynamic_symbol    riscv_elf_adjust_dynamic_symbol
3549 #define elf_backend_size_dynamic_sections    riscv_elf_size_dynamic_sections
3550 #define elf_backend_relocate_section         riscv_elf_relocate_section
3551 #define elf_backend_finish_dynamic_symbol    riscv_elf_finish_dynamic_symbol
3552 #define elf_backend_finish_dynamic_sections  riscv_elf_finish_dynamic_sections
3553 #define elf_backend_gc_mark_hook             riscv_elf_gc_mark_hook
3554 #define elf_backend_plt_sym_val              riscv_elf_plt_sym_val
3555 #define elf_backend_grok_prstatus            riscv_elf_grok_prstatus
3556 #define elf_backend_grok_psinfo              riscv_elf_grok_psinfo
3557 #define elf_backend_object_p                 riscv_elf_object_p
3558 #define elf_info_to_howto_rel                NULL
3559 #define elf_info_to_howto                    riscv_info_to_howto_rela
3560 #define bfd_elfNN_bfd_relax_section          _bfd_riscv_relax_section
3561
3562 #define elf_backend_init_index_section       _bfd_elf_init_1_index_section
3563
3564 #define elf_backend_can_gc_sections     1
3565 #define elf_backend_can_refcount        1
3566 #define elf_backend_want_got_plt        1
3567 #define elf_backend_plt_readonly        1
3568 #define elf_backend_plt_alignment       4
3569 #define elf_backend_want_plt_sym        1
3570 #define elf_backend_got_header_size     (ARCH_SIZE / 8)
3571 #define elf_backend_want_dynrelro       1
3572 #define elf_backend_rela_normal         1
3573 #define elf_backend_default_execstack   0
3574
3575 #include "elfNN-target.h"