Automatic date update in version.in
[external/binutils.git] / bfd / elfnn-riscv.c
1 /* RISC-V-specific support for NN-bit ELF.
2    Copyright (C) 2011-2019 Free Software Foundation, Inc.
3
4    Contributed by Andrew Waterman (andrew@sifive.com).
5    Based on TILE-Gx and MIPS targets.
6
7    This file is part of BFD, the Binary File Descriptor library.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; see the file COPYING3. If not,
21    see <http://www.gnu.org/licenses/>.  */
22
23 /* This file handles RISC-V ELF targets.  */
24
25 #include "sysdep.h"
26 #include "bfd.h"
27 #include "libbfd.h"
28 #include "bfdlink.h"
29 #include "genlink.h"
30 #include "elf-bfd.h"
31 #include "elfxx-riscv.h"
32 #include "elf/riscv.h"
33 #include "opcode/riscv.h"
34
35 /* Internal relocations used exclusively by the relaxation pass.  */
36 #define R_RISCV_DELETE (R_RISCV_max + 1)
37
38 #define ARCH_SIZE NN
39
40 #define MINUS_ONE ((bfd_vma)0 - 1)
41
42 #define RISCV_ELF_LOG_WORD_BYTES (ARCH_SIZE == 32 ? 2 : 3)
43
44 #define RISCV_ELF_WORD_BYTES (1 << RISCV_ELF_LOG_WORD_BYTES)
45
46 /* The name of the dynamic interpreter.  This is put in the .interp
47    section.  */
48
49 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld.so.1"
50 #define ELF32_DYNAMIC_INTERPRETER "/lib32/ld.so.1"
51
52 #define ELF_ARCH                        bfd_arch_riscv
53 #define ELF_TARGET_ID                   RISCV_ELF_DATA
54 #define ELF_MACHINE_CODE                EM_RISCV
55 #define ELF_MAXPAGESIZE                 0x1000
56 #define ELF_COMMONPAGESIZE              0x1000
57
58 /* RISC-V ELF linker hash entry.  */
59
60 struct riscv_elf_link_hash_entry
61 {
62   struct elf_link_hash_entry elf;
63
64   /* Track dynamic relocs copied for this symbol.  */
65   struct elf_dyn_relocs *dyn_relocs;
66
67 #define GOT_UNKNOWN     0
68 #define GOT_NORMAL      1
69 #define GOT_TLS_GD      2
70 #define GOT_TLS_IE      4
71 #define GOT_TLS_LE      8
72   char tls_type;
73 };
74
75 #define riscv_elf_hash_entry(ent) \
76   ((struct riscv_elf_link_hash_entry *)(ent))
77
78 struct _bfd_riscv_elf_obj_tdata
79 {
80   struct elf_obj_tdata root;
81
82   /* tls_type for each local got entry.  */
83   char *local_got_tls_type;
84 };
85
86 #define _bfd_riscv_elf_tdata(abfd) \
87   ((struct _bfd_riscv_elf_obj_tdata *) (abfd)->tdata.any)
88
89 #define _bfd_riscv_elf_local_got_tls_type(abfd) \
90   (_bfd_riscv_elf_tdata (abfd)->local_got_tls_type)
91
92 #define _bfd_riscv_elf_tls_type(abfd, h, symndx)                \
93   (*((h) != NULL ? &riscv_elf_hash_entry (h)->tls_type          \
94      : &_bfd_riscv_elf_local_got_tls_type (abfd) [symndx]))
95
96 #define is_riscv_elf(bfd)                               \
97   (bfd_get_flavour (bfd) == bfd_target_elf_flavour      \
98    && elf_tdata (bfd) != NULL                           \
99    && elf_object_id (bfd) == RISCV_ELF_DATA)
100
101 #include "elf/common.h"
102 #include "elf/internal.h"
103
104 struct riscv_elf_link_hash_table
105 {
106   struct elf_link_hash_table elf;
107
108   /* Short-cuts to get to dynamic linker sections.  */
109   asection *sdyntdata;
110
111   /* Small local sym to section mapping cache.  */
112   struct sym_cache sym_cache;
113
114   /* The max alignment of output sections.  */
115   bfd_vma max_alignment;
116 };
117
118
119 /* Get the RISC-V ELF linker hash table from a link_info structure.  */
120 #define riscv_elf_hash_table(p) \
121   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
122   == RISCV_ELF_DATA ? ((struct riscv_elf_link_hash_table *) ((p)->hash)) : NULL)
123
124 static bfd_boolean
125 riscv_info_to_howto_rela (bfd *abfd,
126                           arelent *cache_ptr,
127                           Elf_Internal_Rela *dst)
128 {
129   cache_ptr->howto = riscv_elf_rtype_to_howto (abfd, ELFNN_R_TYPE (dst->r_info));
130   return cache_ptr->howto != NULL;
131 }
132
133 static void
134 riscv_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
135 {
136   const struct elf_backend_data *bed;
137   bfd_byte *loc;
138
139   bed = get_elf_backend_data (abfd);
140   loc = s->contents + (s->reloc_count++ * bed->s->sizeof_rela);
141   bed->s->swap_reloca_out (abfd, rel, loc);
142 }
143
144 /* PLT/GOT stuff.  */
145
146 #define PLT_HEADER_INSNS 8
147 #define PLT_ENTRY_INSNS 4
148 #define PLT_HEADER_SIZE (PLT_HEADER_INSNS * 4)
149 #define PLT_ENTRY_SIZE (PLT_ENTRY_INSNS * 4)
150
151 #define GOT_ENTRY_SIZE RISCV_ELF_WORD_BYTES
152
153 #define GOTPLT_HEADER_SIZE (2 * GOT_ENTRY_SIZE)
154
155 #define sec_addr(sec) ((sec)->output_section->vma + (sec)->output_offset)
156
157 static bfd_vma
158 riscv_elf_got_plt_val (bfd_vma plt_index, struct bfd_link_info *info)
159 {
160   return sec_addr (riscv_elf_hash_table (info)->elf.sgotplt)
161          + GOTPLT_HEADER_SIZE + (plt_index * GOT_ENTRY_SIZE);
162 }
163
164 #if ARCH_SIZE == 32
165 # define MATCH_LREG MATCH_LW
166 #else
167 # define MATCH_LREG MATCH_LD
168 #endif
169
170 /* Generate a PLT header.  */
171
172 static bfd_boolean
173 riscv_make_plt_header (bfd *output_bfd, bfd_vma gotplt_addr, bfd_vma addr,
174                        uint32_t *entry)
175 {
176   bfd_vma gotplt_offset_high = RISCV_PCREL_HIGH_PART (gotplt_addr, addr);
177   bfd_vma gotplt_offset_low = RISCV_PCREL_LOW_PART (gotplt_addr, addr);
178
179   /* RVE has no t3 register, so this won't work, and is not supported.  */
180   if (elf_elfheader (output_bfd)->e_flags & EF_RISCV_RVE)
181     {
182       _bfd_error_handler (_("%pB: warning: RVE PLT generation not supported"),
183                           output_bfd);
184       return FALSE;
185     }
186
187   /* auipc  t2, %hi(.got.plt)
188      sub    t1, t1, t3               # shifted .got.plt offset + hdr size + 12
189      l[w|d] t3, %lo(.got.plt)(t2)    # _dl_runtime_resolve
190      addi   t1, t1, -(hdr size + 12) # shifted .got.plt offset
191      addi   t0, t2, %lo(.got.plt)    # &.got.plt
192      srli   t1, t1, log2(16/PTRSIZE) # .got.plt offset
193      l[w|d] t0, PTRSIZE(t0)          # link map
194      jr     t3 */
195
196   entry[0] = RISCV_UTYPE (AUIPC, X_T2, gotplt_offset_high);
197   entry[1] = RISCV_RTYPE (SUB, X_T1, X_T1, X_T3);
198   entry[2] = RISCV_ITYPE (LREG, X_T3, X_T2, gotplt_offset_low);
199   entry[3] = RISCV_ITYPE (ADDI, X_T1, X_T1, -(PLT_HEADER_SIZE + 12));
200   entry[4] = RISCV_ITYPE (ADDI, X_T0, X_T2, gotplt_offset_low);
201   entry[5] = RISCV_ITYPE (SRLI, X_T1, X_T1, 4 - RISCV_ELF_LOG_WORD_BYTES);
202   entry[6] = RISCV_ITYPE (LREG, X_T0, X_T0, RISCV_ELF_WORD_BYTES);
203   entry[7] = RISCV_ITYPE (JALR, 0, X_T3, 0);
204
205   return TRUE;
206 }
207
208 /* Generate a PLT entry.  */
209
210 static bfd_boolean
211 riscv_make_plt_entry (bfd *output_bfd, bfd_vma got, bfd_vma addr,
212                       uint32_t *entry)
213 {
214   /* RVE has no t3 register, so this won't work, and is not supported.  */
215   if (elf_elfheader (output_bfd)->e_flags & EF_RISCV_RVE)
216     {
217       _bfd_error_handler (_("%pB: warning: RVE PLT generation not supported"),
218                           output_bfd);
219       return FALSE;
220     }
221
222   /* auipc  t3, %hi(.got.plt entry)
223      l[w|d] t3, %lo(.got.plt entry)(t3)
224      jalr   t1, t3
225      nop */
226
227   entry[0] = RISCV_UTYPE (AUIPC, X_T3, RISCV_PCREL_HIGH_PART (got, addr));
228   entry[1] = RISCV_ITYPE (LREG,  X_T3, X_T3, RISCV_PCREL_LOW_PART (got, addr));
229   entry[2] = RISCV_ITYPE (JALR, X_T1, X_T3, 0);
230   entry[3] = RISCV_NOP;
231
232   return TRUE;
233 }
234
235 /* Create an entry in an RISC-V ELF linker hash table.  */
236
237 static struct bfd_hash_entry *
238 link_hash_newfunc (struct bfd_hash_entry *entry,
239                    struct bfd_hash_table *table, const char *string)
240 {
241   /* Allocate the structure if it has not already been allocated by a
242      subclass.  */
243   if (entry == NULL)
244     {
245       entry =
246         bfd_hash_allocate (table,
247                            sizeof (struct riscv_elf_link_hash_entry));
248       if (entry == NULL)
249         return entry;
250     }
251
252   /* Call the allocation method of the superclass.  */
253   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
254   if (entry != NULL)
255     {
256       struct riscv_elf_link_hash_entry *eh;
257
258       eh = (struct riscv_elf_link_hash_entry *) entry;
259       eh->dyn_relocs = NULL;
260       eh->tls_type = GOT_UNKNOWN;
261     }
262
263   return entry;
264 }
265
266 /* Create a RISC-V ELF linker hash table.  */
267
268 static struct bfd_link_hash_table *
269 riscv_elf_link_hash_table_create (bfd *abfd)
270 {
271   struct riscv_elf_link_hash_table *ret;
272   bfd_size_type amt = sizeof (struct riscv_elf_link_hash_table);
273
274   ret = (struct riscv_elf_link_hash_table *) bfd_zmalloc (amt);
275   if (ret == NULL)
276     return NULL;
277
278   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
279                                       sizeof (struct riscv_elf_link_hash_entry),
280                                       RISCV_ELF_DATA))
281     {
282       free (ret);
283       return NULL;
284     }
285
286   ret->max_alignment = (bfd_vma) -1;
287   return &ret->elf.root;
288 }
289
290 /* Create the .got section.  */
291
292 static bfd_boolean
293 riscv_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
294 {
295   flagword flags;
296   asection *s, *s_got;
297   struct elf_link_hash_entry *h;
298   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
299   struct elf_link_hash_table *htab = elf_hash_table (info);
300
301   /* This function may be called more than once.  */
302   if (htab->sgot != NULL)
303     return TRUE;
304
305   flags = bed->dynamic_sec_flags;
306
307   s = bfd_make_section_anyway_with_flags (abfd,
308                                           (bed->rela_plts_and_copies_p
309                                            ? ".rela.got" : ".rel.got"),
310                                           (bed->dynamic_sec_flags
311                                            | SEC_READONLY));
312   if (s == NULL
313       || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
314     return FALSE;
315   htab->srelgot = s;
316
317   s = s_got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
318   if (s == NULL
319       || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
320     return FALSE;
321   htab->sgot = s;
322
323   /* The first bit of the global offset table is the header.  */
324   s->size += bed->got_header_size;
325
326   if (bed->want_got_plt)
327     {
328       s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
329       if (s == NULL
330           || !bfd_set_section_alignment (abfd, s,
331                                          bed->s->log_file_align))
332         return FALSE;
333       htab->sgotplt = s;
334
335       /* Reserve room for the header.  */
336       s->size += GOTPLT_HEADER_SIZE;
337     }
338
339   if (bed->want_got_sym)
340     {
341       /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
342          section.  We don't do this in the linker script because we don't want
343          to define the symbol if we are not creating a global offset
344          table.  */
345       h = _bfd_elf_define_linkage_sym (abfd, info, s_got,
346                                        "_GLOBAL_OFFSET_TABLE_");
347       elf_hash_table (info)->hgot = h;
348       if (h == NULL)
349         return FALSE;
350     }
351
352   return TRUE;
353 }
354
355 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
356    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
357    hash table.  */
358
359 static bfd_boolean
360 riscv_elf_create_dynamic_sections (bfd *dynobj,
361                                    struct bfd_link_info *info)
362 {
363   struct riscv_elf_link_hash_table *htab;
364
365   htab = riscv_elf_hash_table (info);
366   BFD_ASSERT (htab != NULL);
367
368   if (!riscv_elf_create_got_section (dynobj, info))
369     return FALSE;
370
371   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
372     return FALSE;
373
374   if (!bfd_link_pic (info))
375     {
376       htab->sdyntdata =
377         bfd_make_section_anyway_with_flags (dynobj, ".tdata.dyn",
378                                             (SEC_ALLOC | SEC_THREAD_LOCAL
379                                              | SEC_LINKER_CREATED));
380     }
381
382   if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss
383       || (!bfd_link_pic (info) && (!htab->elf.srelbss || !htab->sdyntdata)))
384     abort ();
385
386   return TRUE;
387 }
388
389 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
390
391 static void
392 riscv_elf_copy_indirect_symbol (struct bfd_link_info *info,
393                                 struct elf_link_hash_entry *dir,
394                                 struct elf_link_hash_entry *ind)
395 {
396   struct riscv_elf_link_hash_entry *edir, *eind;
397
398   edir = (struct riscv_elf_link_hash_entry *) dir;
399   eind = (struct riscv_elf_link_hash_entry *) ind;
400
401   if (eind->dyn_relocs != NULL)
402     {
403       if (edir->dyn_relocs != NULL)
404         {
405           struct elf_dyn_relocs **pp;
406           struct elf_dyn_relocs *p;
407
408           /* Add reloc counts against the indirect sym to the direct sym
409              list.  Merge any entries against the same section.  */
410           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
411             {
412               struct elf_dyn_relocs *q;
413
414               for (q = edir->dyn_relocs; q != NULL; q = q->next)
415                 if (q->sec == p->sec)
416                   {
417                     q->pc_count += p->pc_count;
418                     q->count += p->count;
419                     *pp = p->next;
420                     break;
421                   }
422               if (q == NULL)
423                 pp = &p->next;
424             }
425           *pp = edir->dyn_relocs;
426         }
427
428       edir->dyn_relocs = eind->dyn_relocs;
429       eind->dyn_relocs = NULL;
430     }
431
432   if (ind->root.type == bfd_link_hash_indirect
433       && dir->got.refcount <= 0)
434     {
435       edir->tls_type = eind->tls_type;
436       eind->tls_type = GOT_UNKNOWN;
437     }
438   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
439 }
440
441 static bfd_boolean
442 riscv_elf_record_tls_type (bfd *abfd, struct elf_link_hash_entry *h,
443                            unsigned long symndx, char tls_type)
444 {
445   char *new_tls_type = &_bfd_riscv_elf_tls_type (abfd, h, symndx);
446
447   *new_tls_type |= tls_type;
448   if ((*new_tls_type & GOT_NORMAL) && (*new_tls_type & ~GOT_NORMAL))
449     {
450       (*_bfd_error_handler)
451         (_("%pB: `%s' accessed both as normal and thread local symbol"),
452          abfd, h ? h->root.root.string : "<local>");
453       return FALSE;
454     }
455   return TRUE;
456 }
457
458 static bfd_boolean
459 riscv_elf_record_got_reference (bfd *abfd, struct bfd_link_info *info,
460                                 struct elf_link_hash_entry *h, long symndx)
461 {
462   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
463   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
464
465   if (htab->elf.sgot == NULL)
466     {
467       if (!riscv_elf_create_got_section (htab->elf.dynobj, info))
468         return FALSE;
469     }
470
471   if (h != NULL)
472     {
473       h->got.refcount += 1;
474       return TRUE;
475     }
476
477   /* This is a global offset table entry for a local symbol.  */
478   if (elf_local_got_refcounts (abfd) == NULL)
479     {
480       bfd_size_type size = symtab_hdr->sh_info * (sizeof (bfd_vma) + 1);
481       if (!(elf_local_got_refcounts (abfd) = bfd_zalloc (abfd, size)))
482         return FALSE;
483       _bfd_riscv_elf_local_got_tls_type (abfd)
484         = (char *) (elf_local_got_refcounts (abfd) + symtab_hdr->sh_info);
485     }
486   elf_local_got_refcounts (abfd) [symndx] += 1;
487
488   return TRUE;
489 }
490
491 static bfd_boolean
492 bad_static_reloc (bfd *abfd, unsigned r_type, struct elf_link_hash_entry *h)
493 {
494   reloc_howto_type * r = riscv_elf_rtype_to_howto (abfd, r_type);
495
496   (*_bfd_error_handler)
497     (_("%pB: relocation %s against `%s' can not be used when making a shared "
498        "object; recompile with -fPIC"),
499      abfd, r ? r->name : _("<unknown>"),
500      h != NULL ? h->root.root.string : "a local symbol");
501   bfd_set_error (bfd_error_bad_value);
502   return FALSE;
503 }
504 /* Look through the relocs for a section during the first phase, and
505    allocate space in the global offset table or procedure linkage
506    table.  */
507
508 static bfd_boolean
509 riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
510                         asection *sec, const Elf_Internal_Rela *relocs)
511 {
512   struct riscv_elf_link_hash_table *htab;
513   Elf_Internal_Shdr *symtab_hdr;
514   struct elf_link_hash_entry **sym_hashes;
515   const Elf_Internal_Rela *rel;
516   asection *sreloc = NULL;
517
518   if (bfd_link_relocatable (info))
519     return TRUE;
520
521   htab = riscv_elf_hash_table (info);
522   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
523   sym_hashes = elf_sym_hashes (abfd);
524
525   if (htab->elf.dynobj == NULL)
526     htab->elf.dynobj = abfd;
527
528   for (rel = relocs; rel < relocs + sec->reloc_count; rel++)
529     {
530       unsigned int r_type;
531       unsigned int r_symndx;
532       struct elf_link_hash_entry *h;
533
534       r_symndx = ELFNN_R_SYM (rel->r_info);
535       r_type = ELFNN_R_TYPE (rel->r_info);
536
537       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
538         {
539           (*_bfd_error_handler) (_("%pB: bad symbol index: %d"),
540                                  abfd, r_symndx);
541           return FALSE;
542         }
543
544       if (r_symndx < symtab_hdr->sh_info)
545         h = NULL;
546       else
547         {
548           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
549           while (h->root.type == bfd_link_hash_indirect
550                  || h->root.type == bfd_link_hash_warning)
551             h = (struct elf_link_hash_entry *) h->root.u.i.link;
552         }
553
554       switch (r_type)
555         {
556         case R_RISCV_TLS_GD_HI20:
557           if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
558               || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_GD))
559             return FALSE;
560           break;
561
562         case R_RISCV_TLS_GOT_HI20:
563           if (bfd_link_pic (info))
564             info->flags |= DF_STATIC_TLS;
565           if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
566               || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_IE))
567             return FALSE;
568           break;
569
570         case R_RISCV_GOT_HI20:
571           if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
572               || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_NORMAL))
573             return FALSE;
574           break;
575
576         case R_RISCV_CALL_PLT:
577           /* This symbol requires a procedure linkage table entry.  We
578              actually build the entry in adjust_dynamic_symbol,
579              because this might be a case of linking PIC code without
580              linking in any dynamic objects, in which case we don't
581              need to generate a procedure linkage table after all.  */
582
583           if (h != NULL)
584             {
585               h->needs_plt = 1;
586               h->plt.refcount += 1;
587             }
588           break;
589
590         case R_RISCV_CALL:
591         case R_RISCV_JAL:
592         case R_RISCV_BRANCH:
593         case R_RISCV_RVC_BRANCH:
594         case R_RISCV_RVC_JUMP:
595         case R_RISCV_PCREL_HI20:
596           /* In shared libraries, these relocs are known to bind locally.  */
597           if (bfd_link_pic (info))
598             break;
599           goto static_reloc;
600
601         case R_RISCV_TPREL_HI20:
602           if (!bfd_link_executable (info))
603             return bad_static_reloc (abfd, r_type, h);
604           if (h != NULL)
605             riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
606           goto static_reloc;
607
608         case R_RISCV_HI20:
609           if (bfd_link_pic (info))
610             return bad_static_reloc (abfd, r_type, h);
611           /* Fall through.  */
612
613         case R_RISCV_COPY:
614         case R_RISCV_JUMP_SLOT:
615         case R_RISCV_RELATIVE:
616         case R_RISCV_64:
617         case R_RISCV_32:
618           /* Fall through.  */
619
620         static_reloc:
621           /* This reloc might not bind locally.  */
622           if (h != NULL)
623             h->non_got_ref = 1;
624
625           if (h != NULL && !bfd_link_pic (info))
626             {
627               /* We may need a .plt entry if the function this reloc
628                  refers to is in a shared lib.  */
629               h->plt.refcount += 1;
630             }
631
632           /* If we are creating a shared library, and this is a reloc
633              against a global symbol, or a non PC relative reloc
634              against a local symbol, then we need to copy the reloc
635              into the shared library.  However, if we are linking with
636              -Bsymbolic, we do not need to copy a reloc against a
637              global symbol which is defined in an object we are
638              including in the link (i.e., DEF_REGULAR is set).  At
639              this point we have not seen all the input files, so it is
640              possible that DEF_REGULAR is not set now but will be set
641              later (it is never cleared).  In case of a weak definition,
642              DEF_REGULAR may be cleared later by a strong definition in
643              a shared library.  We account for that possibility below by
644              storing information in the relocs_copied field of the hash
645              table entry.  A similar situation occurs when creating
646              shared libraries and symbol visibility changes render the
647              symbol local.
648
649              If on the other hand, we are creating an executable, we
650              may need to keep relocations for symbols satisfied by a
651              dynamic library if we manage to avoid copy relocs for the
652              symbol.  */
653           reloc_howto_type * r = riscv_elf_rtype_to_howto (abfd, r_type);
654
655           if ((bfd_link_pic (info)
656                && (sec->flags & SEC_ALLOC) != 0
657                && ((r != NULL && ! r->pc_relative)
658                    || (h != NULL
659                        && (! info->symbolic
660                            || h->root.type == bfd_link_hash_defweak
661                            || !h->def_regular))))
662               || (!bfd_link_pic (info)
663                   && (sec->flags & SEC_ALLOC) != 0
664                   && h != NULL
665                   && (h->root.type == bfd_link_hash_defweak
666                       || !h->def_regular)))
667             {
668               struct elf_dyn_relocs *p;
669               struct elf_dyn_relocs **head;
670
671               /* When creating a shared object, we must copy these
672                  relocs into the output file.  We create a reloc
673                  section in dynobj and make room for the reloc.  */
674               if (sreloc == NULL)
675                 {
676                   sreloc = _bfd_elf_make_dynamic_reloc_section
677                     (sec, htab->elf.dynobj, RISCV_ELF_LOG_WORD_BYTES,
678                     abfd, /*rela?*/ TRUE);
679
680                   if (sreloc == NULL)
681                     return FALSE;
682                 }
683
684               /* If this is a global symbol, we count the number of
685                  relocations we need for this symbol.  */
686               if (h != NULL)
687                 head = &((struct riscv_elf_link_hash_entry *) h)->dyn_relocs;
688               else
689                 {
690                   /* Track dynamic relocs needed for local syms too.
691                      We really need local syms available to do this
692                      easily.  Oh well.  */
693
694                   asection *s;
695                   void *vpp;
696                   Elf_Internal_Sym *isym;
697
698                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
699                                                 abfd, r_symndx);
700                   if (isym == NULL)
701                     return FALSE;
702
703                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
704                   if (s == NULL)
705                     s = sec;
706
707                   vpp = &elf_section_data (s)->local_dynrel;
708                   head = (struct elf_dyn_relocs **) vpp;
709                 }
710
711               p = *head;
712               if (p == NULL || p->sec != sec)
713                 {
714                   bfd_size_type amt = sizeof *p;
715                   p = ((struct elf_dyn_relocs *)
716                        bfd_alloc (htab->elf.dynobj, amt));
717                   if (p == NULL)
718                     return FALSE;
719                   p->next = *head;
720                   *head = p;
721                   p->sec = sec;
722                   p->count = 0;
723                   p->pc_count = 0;
724                 }
725
726               p->count += 1;
727               p->pc_count += r == NULL ? 0 : r->pc_relative;
728             }
729
730           break;
731
732         case R_RISCV_GNU_VTINHERIT:
733           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
734             return FALSE;
735           break;
736
737         case R_RISCV_GNU_VTENTRY:
738           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
739             return FALSE;
740           break;
741
742         default:
743           break;
744         }
745     }
746
747   return TRUE;
748 }
749
750 static asection *
751 riscv_elf_gc_mark_hook (asection *sec,
752                         struct bfd_link_info *info,
753                         Elf_Internal_Rela *rel,
754                         struct elf_link_hash_entry *h,
755                         Elf_Internal_Sym *sym)
756 {
757   if (h != NULL)
758     switch (ELFNN_R_TYPE (rel->r_info))
759       {
760       case R_RISCV_GNU_VTINHERIT:
761       case R_RISCV_GNU_VTENTRY:
762         return NULL;
763       }
764
765   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
766 }
767
768 /* Find dynamic relocs for H that apply to read-only sections.  */
769
770 static asection *
771 readonly_dynrelocs (struct elf_link_hash_entry *h)
772 {
773   struct elf_dyn_relocs *p;
774
775   for (p = riscv_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
776     {
777       asection *s = p->sec->output_section;
778
779       if (s != NULL && (s->flags & SEC_READONLY) != 0)
780         return p->sec;
781     }
782   return NULL;
783 }
784
785 /* Adjust a symbol defined by a dynamic object and referenced by a
786    regular object.  The current definition is in some section of the
787    dynamic object, but we're not including those sections.  We have to
788    change the definition to something the rest of the link can
789    understand.  */
790
791 static bfd_boolean
792 riscv_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
793                                  struct elf_link_hash_entry *h)
794 {
795   struct riscv_elf_link_hash_table *htab;
796   struct riscv_elf_link_hash_entry * eh;
797   bfd *dynobj;
798   asection *s, *srel;
799
800   htab = riscv_elf_hash_table (info);
801   BFD_ASSERT (htab != NULL);
802
803   dynobj = htab->elf.dynobj;
804
805   /* Make sure we know what is going on here.  */
806   BFD_ASSERT (dynobj != NULL
807               && (h->needs_plt
808                   || h->type == STT_GNU_IFUNC
809                   || h->is_weakalias
810                   || (h->def_dynamic
811                       && h->ref_regular
812                       && !h->def_regular)));
813
814   /* If this is a function, put it in the procedure linkage table.  We
815      will fill in the contents of the procedure linkage table later
816      (although we could actually do it here).  */
817   if (h->type == STT_FUNC || h->type == STT_GNU_IFUNC || h->needs_plt)
818     {
819       if (h->plt.refcount <= 0
820           || SYMBOL_CALLS_LOCAL (info, h)
821           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
822               && h->root.type == bfd_link_hash_undefweak))
823         {
824           /* This case can occur if we saw a R_RISCV_CALL_PLT reloc in an
825              input file, but the symbol was never referred to by a dynamic
826              object, or if all references were garbage collected.  In such
827              a case, we don't actually need to build a PLT entry.  */
828           h->plt.offset = (bfd_vma) -1;
829           h->needs_plt = 0;
830         }
831
832       return TRUE;
833     }
834   else
835     h->plt.offset = (bfd_vma) -1;
836
837   /* If this is a weak symbol, and there is a real definition, the
838      processor independent code will have arranged for us to see the
839      real definition first, and we can just use the same value.  */
840   if (h->is_weakalias)
841     {
842       struct elf_link_hash_entry *def = weakdef (h);
843       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
844       h->root.u.def.section = def->root.u.def.section;
845       h->root.u.def.value = def->root.u.def.value;
846       return TRUE;
847     }
848
849   /* This is a reference to a symbol defined by a dynamic object which
850      is not a function.  */
851
852   /* If we are creating a shared library, we must presume that the
853      only references to the symbol are via the global offset table.
854      For such cases we need not do anything here; the relocations will
855      be handled correctly by relocate_section.  */
856   if (bfd_link_pic (info))
857     return TRUE;
858
859   /* If there are no references to this symbol that do not use the
860      GOT, we don't need to generate a copy reloc.  */
861   if (!h->non_got_ref)
862     return TRUE;
863
864   /* If -z nocopyreloc was given, we won't generate them either.  */
865   if (info->nocopyreloc)
866     {
867       h->non_got_ref = 0;
868       return TRUE;
869     }
870
871   /* If we don't find any dynamic relocs in read-only sections, then
872      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
873   if (!readonly_dynrelocs (h))
874     {
875       h->non_got_ref = 0;
876       return TRUE;
877     }
878
879   /* We must allocate the symbol in our .dynbss section, which will
880      become part of the .bss section of the executable.  There will be
881      an entry for this symbol in the .dynsym section.  The dynamic
882      object will contain position independent code, so all references
883      from the dynamic object to this symbol will go through the global
884      offset table.  The dynamic linker will use the .dynsym entry to
885      determine the address it must put in the global offset table, so
886      both the dynamic object and the regular object will refer to the
887      same memory location for the variable.  */
888
889   /* We must generate a R_RISCV_COPY reloc to tell the dynamic linker
890      to copy the initial value out of the dynamic object and into the
891      runtime process image.  We need to remember the offset into the
892      .rel.bss section we are going to use.  */
893   eh = (struct riscv_elf_link_hash_entry *) h;
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 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               && ! UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
1029             htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
1030         }
1031     }
1032   else
1033     h->got.offset = (bfd_vma) -1;
1034
1035   eh = (struct riscv_elf_link_hash_entry *) h;
1036   if (eh->dyn_relocs == NULL)
1037     return TRUE;
1038
1039   /* In the shared -Bsymbolic case, discard space allocated for
1040      dynamic pc-relative relocs against symbols which turn out to be
1041      defined in regular objects.  For the normal shared case, discard
1042      space for pc-relative relocs that have become local due to symbol
1043      visibility changes.  */
1044
1045   if (bfd_link_pic (info))
1046     {
1047       if (SYMBOL_CALLS_LOCAL (info, h))
1048         {
1049           struct elf_dyn_relocs **pp;
1050
1051           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1052             {
1053               p->count -= p->pc_count;
1054               p->pc_count = 0;
1055               if (p->count == 0)
1056                 *pp = p->next;
1057               else
1058                 pp = &p->next;
1059             }
1060         }
1061
1062       /* Also discard relocs on undefined weak syms with non-default
1063          visibility.  */
1064       if (eh->dyn_relocs != NULL
1065           && h->root.type == bfd_link_hash_undefweak)
1066         {
1067           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1068               || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
1069             eh->dyn_relocs = NULL;
1070
1071           /* Make sure undefined weak symbols are output as a dynamic
1072              symbol in PIEs.  */
1073           else if (h->dynindx == -1
1074                    && !h->forced_local)
1075             {
1076               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1077                 return FALSE;
1078             }
1079         }
1080     }
1081   else
1082     {
1083       /* For the non-shared case, discard space for relocs against
1084          symbols which turn out to need copy relocs or are not
1085          dynamic.  */
1086
1087       if (!h->non_got_ref
1088           && ((h->def_dynamic
1089                && !h->def_regular)
1090               || (htab->elf.dynamic_sections_created
1091                   && (h->root.type == bfd_link_hash_undefweak
1092                       || h->root.type == bfd_link_hash_undefined))))
1093         {
1094           /* Make sure this symbol is output as a dynamic symbol.
1095              Undefined weak syms won't yet be marked as dynamic.  */
1096           if (h->dynindx == -1
1097               && !h->forced_local)
1098             {
1099               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1100                 return FALSE;
1101             }
1102
1103           /* If that succeeded, we know we'll be keeping all the
1104              relocs.  */
1105           if (h->dynindx != -1)
1106             goto keep;
1107         }
1108
1109       eh->dyn_relocs = NULL;
1110
1111     keep: ;
1112     }
1113
1114   /* Finally, allocate space.  */
1115   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1116     {
1117       asection *sreloc = elf_section_data (p->sec)->sreloc;
1118       sreloc->size += p->count * sizeof (ElfNN_External_Rela);
1119     }
1120
1121   return TRUE;
1122 }
1123
1124 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
1125    read-only sections.  */
1126
1127 static bfd_boolean
1128 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
1129 {
1130   asection *sec;
1131
1132   if (h->root.type == bfd_link_hash_indirect)
1133     return TRUE;
1134
1135   sec = readonly_dynrelocs (h);
1136   if (sec != NULL)
1137     {
1138       struct bfd_link_info *info = (struct bfd_link_info *) info_p;
1139
1140       info->flags |= DF_TEXTREL;
1141       info->callbacks->minfo
1142         (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
1143          sec->owner, h->root.root.string, sec);
1144
1145       /* Not an error, just cut short the traversal.  */
1146       return FALSE;
1147     }
1148   return TRUE;
1149 }
1150
1151 static bfd_boolean
1152 riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1153 {
1154   struct riscv_elf_link_hash_table *htab;
1155   bfd *dynobj;
1156   asection *s;
1157   bfd *ibfd;
1158
1159   htab = riscv_elf_hash_table (info);
1160   BFD_ASSERT (htab != NULL);
1161   dynobj = htab->elf.dynobj;
1162   BFD_ASSERT (dynobj != NULL);
1163
1164   if (elf_hash_table (info)->dynamic_sections_created)
1165     {
1166       /* Set the contents of the .interp section to the interpreter.  */
1167       if (bfd_link_executable (info) && !info->nointerp)
1168         {
1169           s = bfd_get_linker_section (dynobj, ".interp");
1170           BFD_ASSERT (s != NULL);
1171           s->size = strlen (ELFNN_DYNAMIC_INTERPRETER) + 1;
1172           s->contents = (unsigned char *) ELFNN_DYNAMIC_INTERPRETER;
1173         }
1174     }
1175
1176   /* Set up .got offsets for local syms, and space for local dynamic
1177      relocs.  */
1178   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1179     {
1180       bfd_signed_vma *local_got;
1181       bfd_signed_vma *end_local_got;
1182       char *local_tls_type;
1183       bfd_size_type locsymcount;
1184       Elf_Internal_Shdr *symtab_hdr;
1185       asection *srel;
1186
1187       if (! is_riscv_elf (ibfd))
1188         continue;
1189
1190       for (s = ibfd->sections; s != NULL; s = s->next)
1191         {
1192           struct elf_dyn_relocs *p;
1193
1194           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
1195             {
1196               if (!bfd_is_abs_section (p->sec)
1197                   && bfd_is_abs_section (p->sec->output_section))
1198                 {
1199                   /* Input section has been discarded, either because
1200                      it is a copy of a linkonce section or due to
1201                      linker script /DISCARD/, so we'll be discarding
1202                      the relocs too.  */
1203                 }
1204               else if (p->count != 0)
1205                 {
1206                   srel = elf_section_data (p->sec)->sreloc;
1207                   srel->size += p->count * sizeof (ElfNN_External_Rela);
1208                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1209                     info->flags |= DF_TEXTREL;
1210                 }
1211             }
1212         }
1213
1214       local_got = elf_local_got_refcounts (ibfd);
1215       if (!local_got)
1216         continue;
1217
1218       symtab_hdr = &elf_symtab_hdr (ibfd);
1219       locsymcount = symtab_hdr->sh_info;
1220       end_local_got = local_got + locsymcount;
1221       local_tls_type = _bfd_riscv_elf_local_got_tls_type (ibfd);
1222       s = htab->elf.sgot;
1223       srel = htab->elf.srelgot;
1224       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1225         {
1226           if (*local_got > 0)
1227             {
1228               *local_got = s->size;
1229               s->size += RISCV_ELF_WORD_BYTES;
1230               if (*local_tls_type & GOT_TLS_GD)
1231                 s->size += RISCV_ELF_WORD_BYTES;
1232               if (bfd_link_pic (info)
1233                   || (*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)))
1234                 srel->size += sizeof (ElfNN_External_Rela);
1235             }
1236           else
1237             *local_got = (bfd_vma) -1;
1238         }
1239     }
1240
1241   /* Allocate global sym .plt and .got entries, and space for global
1242      sym dynamic relocs.  */
1243   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
1244
1245   if (htab->elf.sgotplt)
1246     {
1247       struct elf_link_hash_entry *got;
1248       got = elf_link_hash_lookup (elf_hash_table (info),
1249                                   "_GLOBAL_OFFSET_TABLE_",
1250                                   FALSE, FALSE, FALSE);
1251
1252       /* Don't allocate .got.plt section if there are no GOT nor PLT
1253          entries and there is no refeence to _GLOBAL_OFFSET_TABLE_.  */
1254       if ((got == NULL
1255            || !got->ref_regular_nonweak)
1256           && (htab->elf.sgotplt->size == GOTPLT_HEADER_SIZE)
1257           && (htab->elf.splt == NULL
1258               || htab->elf.splt->size == 0)
1259           && (htab->elf.sgot == NULL
1260               || (htab->elf.sgot->size
1261                   == get_elf_backend_data (output_bfd)->got_header_size)))
1262         htab->elf.sgotplt->size = 0;
1263     }
1264
1265   /* The check_relocs and adjust_dynamic_symbol entry points have
1266      determined the sizes of the various dynamic sections.  Allocate
1267      memory for them.  */
1268   for (s = dynobj->sections; s != NULL; s = s->next)
1269     {
1270       if ((s->flags & SEC_LINKER_CREATED) == 0)
1271         continue;
1272
1273       if (s == htab->elf.splt
1274           || s == htab->elf.sgot
1275           || s == htab->elf.sgotplt
1276           || s == htab->elf.sdynbss
1277           || s == htab->elf.sdynrelro
1278           || s == htab->sdyntdata)
1279         {
1280           /* Strip this section if we don't need it; see the
1281              comment below.  */
1282         }
1283       else if (strncmp (s->name, ".rela", 5) == 0)
1284         {
1285           if (s->size != 0)
1286             {
1287               /* We use the reloc_count field as a counter if we need
1288                  to copy relocs into the output file.  */
1289               s->reloc_count = 0;
1290             }
1291         }
1292       else
1293         {
1294           /* It's not one of our sections.  */
1295           continue;
1296         }
1297
1298       if (s->size == 0)
1299         {
1300           /* If we don't need this section, strip it from the
1301              output file.  This is mostly to handle .rela.bss and
1302              .rela.plt.  We must create both sections in
1303              create_dynamic_sections, because they must be created
1304              before the linker maps input sections to output
1305              sections.  The linker does that before
1306              adjust_dynamic_symbol is called, and it is that
1307              function which decides whether anything needs to go
1308              into these sections.  */
1309           s->flags |= SEC_EXCLUDE;
1310           continue;
1311         }
1312
1313       if ((s->flags & SEC_HAS_CONTENTS) == 0)
1314         continue;
1315
1316       /* Allocate memory for the section contents.  Zero the memory
1317          for the benefit of .rela.plt, which has 4 unused entries
1318          at the beginning, and we don't want garbage.  */
1319       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1320       if (s->contents == NULL)
1321         return FALSE;
1322     }
1323
1324   if (elf_hash_table (info)->dynamic_sections_created)
1325     {
1326       /* Add some entries to the .dynamic section.  We fill in the
1327          values later, in riscv_elf_finish_dynamic_sections, but we
1328          must add the entries now so that we get the correct size for
1329          the .dynamic section.  The DT_DEBUG entry is filled in by the
1330          dynamic linker and used by the debugger.  */
1331 #define add_dynamic_entry(TAG, VAL) \
1332   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1333
1334       if (bfd_link_executable (info))
1335         {
1336           if (!add_dynamic_entry (DT_DEBUG, 0))
1337             return FALSE;
1338         }
1339
1340       if (htab->elf.srelplt->size != 0)
1341         {
1342           if (!add_dynamic_entry (DT_PLTGOT, 0)
1343               || !add_dynamic_entry (DT_PLTRELSZ, 0)
1344               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1345               || !add_dynamic_entry (DT_JMPREL, 0))
1346             return FALSE;
1347         }
1348
1349       if (!add_dynamic_entry (DT_RELA, 0)
1350           || !add_dynamic_entry (DT_RELASZ, 0)
1351           || !add_dynamic_entry (DT_RELAENT, sizeof (ElfNN_External_Rela)))
1352         return FALSE;
1353
1354       /* If any dynamic relocs apply to a read-only section,
1355          then we need a DT_TEXTREL entry.  */
1356       if ((info->flags & DF_TEXTREL) == 0)
1357         elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
1358
1359       if (info->flags & DF_TEXTREL)
1360         {
1361           if (!add_dynamic_entry (DT_TEXTREL, 0))
1362             return FALSE;
1363         }
1364     }
1365 #undef add_dynamic_entry
1366
1367   return TRUE;
1368 }
1369
1370 #define TP_OFFSET 0
1371 #define DTP_OFFSET 0x800
1372
1373 /* Return the relocation value for a TLS dtp-relative reloc.  */
1374
1375 static bfd_vma
1376 dtpoff (struct bfd_link_info *info, bfd_vma address)
1377 {
1378   /* If tls_sec is NULL, we should have signalled an error already.  */
1379   if (elf_hash_table (info)->tls_sec == NULL)
1380     return 0;
1381   return address - elf_hash_table (info)->tls_sec->vma - DTP_OFFSET;
1382 }
1383
1384 /* Return the relocation value for a static TLS tp-relative relocation.  */
1385
1386 static bfd_vma
1387 tpoff (struct bfd_link_info *info, bfd_vma address)
1388 {
1389   /* If tls_sec is NULL, we should have signalled an error already.  */
1390   if (elf_hash_table (info)->tls_sec == NULL)
1391     return 0;
1392   return address - elf_hash_table (info)->tls_sec->vma - TP_OFFSET;
1393 }
1394
1395 /* Return the global pointer's value, or 0 if it is not in use.  */
1396
1397 static bfd_vma
1398 riscv_global_pointer_value (struct bfd_link_info *info)
1399 {
1400   struct bfd_link_hash_entry *h;
1401
1402   h = bfd_link_hash_lookup (info->hash, RISCV_GP_SYMBOL, FALSE, FALSE, TRUE);
1403   if (h == NULL || h->type != bfd_link_hash_defined)
1404     return 0;
1405
1406   return h->u.def.value + sec_addr (h->u.def.section);
1407 }
1408
1409 /* Emplace a static relocation.  */
1410
1411 static bfd_reloc_status_type
1412 perform_relocation (const reloc_howto_type *howto,
1413                     const Elf_Internal_Rela *rel,
1414                     bfd_vma value,
1415                     asection *input_section,
1416                     bfd *input_bfd,
1417                     bfd_byte *contents)
1418 {
1419   if (howto->pc_relative)
1420     value -= sec_addr (input_section) + rel->r_offset;
1421   value += rel->r_addend;
1422
1423   switch (ELFNN_R_TYPE (rel->r_info))
1424     {
1425     case R_RISCV_HI20:
1426     case R_RISCV_TPREL_HI20:
1427     case R_RISCV_PCREL_HI20:
1428     case R_RISCV_GOT_HI20:
1429     case R_RISCV_TLS_GOT_HI20:
1430     case R_RISCV_TLS_GD_HI20:
1431       if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)))
1432         return bfd_reloc_overflow;
1433       value = ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value));
1434       break;
1435
1436     case R_RISCV_LO12_I:
1437     case R_RISCV_GPREL_I:
1438     case R_RISCV_TPREL_LO12_I:
1439     case R_RISCV_TPREL_I:
1440     case R_RISCV_PCREL_LO12_I:
1441       value = ENCODE_ITYPE_IMM (value);
1442       break;
1443
1444     case R_RISCV_LO12_S:
1445     case R_RISCV_GPREL_S:
1446     case R_RISCV_TPREL_LO12_S:
1447     case R_RISCV_TPREL_S:
1448     case R_RISCV_PCREL_LO12_S:
1449       value = ENCODE_STYPE_IMM (value);
1450       break;
1451
1452     case R_RISCV_CALL:
1453     case R_RISCV_CALL_PLT:
1454       if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)))
1455         return bfd_reloc_overflow;
1456       value = ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value))
1457               | (ENCODE_ITYPE_IMM (value) << 32);
1458       break;
1459
1460     case R_RISCV_JAL:
1461       if (!VALID_UJTYPE_IMM (value))
1462         return bfd_reloc_overflow;
1463       value = ENCODE_UJTYPE_IMM (value);
1464       break;
1465
1466     case R_RISCV_BRANCH:
1467       if (!VALID_SBTYPE_IMM (value))
1468         return bfd_reloc_overflow;
1469       value = ENCODE_SBTYPE_IMM (value);
1470       break;
1471
1472     case R_RISCV_RVC_BRANCH:
1473       if (!VALID_RVC_B_IMM (value))
1474         return bfd_reloc_overflow;
1475       value = ENCODE_RVC_B_IMM (value);
1476       break;
1477
1478     case R_RISCV_RVC_JUMP:
1479       if (!VALID_RVC_J_IMM (value))
1480         return bfd_reloc_overflow;
1481       value = ENCODE_RVC_J_IMM (value);
1482       break;
1483
1484     case R_RISCV_RVC_LUI:
1485       if (RISCV_CONST_HIGH_PART (value) == 0)
1486         {
1487           /* Linker relaxation can convert an address equal to or greater than
1488              0x800 to slightly below 0x800.  C.LUI does not accept zero as a
1489              valid immediate.  We can fix this by converting it to a C.LI.  */
1490           bfd_vma insn = bfd_get (howto->bitsize, input_bfd,
1491                                   contents + rel->r_offset);
1492           insn = (insn & ~MATCH_C_LUI) | MATCH_C_LI;
1493           bfd_put (howto->bitsize, input_bfd, insn, contents + rel->r_offset);
1494           value = ENCODE_RVC_IMM (0);
1495         }
1496       else if (!VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value)))
1497         return bfd_reloc_overflow;
1498       else
1499         value = ENCODE_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value));
1500       break;
1501
1502     case R_RISCV_32:
1503     case R_RISCV_64:
1504     case R_RISCV_ADD8:
1505     case R_RISCV_ADD16:
1506     case R_RISCV_ADD32:
1507     case R_RISCV_ADD64:
1508     case R_RISCV_SUB6:
1509     case R_RISCV_SUB8:
1510     case R_RISCV_SUB16:
1511     case R_RISCV_SUB32:
1512     case R_RISCV_SUB64:
1513     case R_RISCV_SET6:
1514     case R_RISCV_SET8:
1515     case R_RISCV_SET16:
1516     case R_RISCV_SET32:
1517     case R_RISCV_32_PCREL:
1518     case R_RISCV_TLS_DTPREL32:
1519     case R_RISCV_TLS_DTPREL64:
1520       break;
1521
1522     case R_RISCV_DELETE:
1523       return bfd_reloc_ok;
1524
1525     default:
1526       return bfd_reloc_notsupported;
1527     }
1528
1529   bfd_vma word = bfd_get (howto->bitsize, input_bfd, contents + rel->r_offset);
1530   word = (word & ~howto->dst_mask) | (value & howto->dst_mask);
1531   bfd_put (howto->bitsize, input_bfd, word, contents + rel->r_offset);
1532
1533   return bfd_reloc_ok;
1534 }
1535
1536 /* Remember all PC-relative high-part relocs we've encountered to help us
1537    later resolve the corresponding low-part relocs.  */
1538
1539 typedef struct
1540 {
1541   bfd_vma address;
1542   bfd_vma value;
1543 } riscv_pcrel_hi_reloc;
1544
1545 typedef struct riscv_pcrel_lo_reloc
1546 {
1547   asection *                     input_section;
1548   struct bfd_link_info *         info;
1549   reloc_howto_type *             howto;
1550   const Elf_Internal_Rela *      reloc;
1551   bfd_vma                        addr;
1552   const char *                   name;
1553   bfd_byte *                     contents;
1554   struct riscv_pcrel_lo_reloc *  next;
1555 } riscv_pcrel_lo_reloc;
1556
1557 typedef struct
1558 {
1559   htab_t hi_relocs;
1560   riscv_pcrel_lo_reloc *lo_relocs;
1561 } riscv_pcrel_relocs;
1562
1563 static hashval_t
1564 riscv_pcrel_reloc_hash (const void *entry)
1565 {
1566   const riscv_pcrel_hi_reloc *e = entry;
1567   return (hashval_t)(e->address >> 2);
1568 }
1569
1570 static bfd_boolean
1571 riscv_pcrel_reloc_eq (const void *entry1, const void *entry2)
1572 {
1573   const riscv_pcrel_hi_reloc *e1 = entry1, *e2 = entry2;
1574   return e1->address == e2->address;
1575 }
1576
1577 static bfd_boolean
1578 riscv_init_pcrel_relocs (riscv_pcrel_relocs *p)
1579 {
1580
1581   p->lo_relocs = NULL;
1582   p->hi_relocs = htab_create (1024, riscv_pcrel_reloc_hash,
1583                               riscv_pcrel_reloc_eq, free);
1584   return p->hi_relocs != NULL;
1585 }
1586
1587 static void
1588 riscv_free_pcrel_relocs (riscv_pcrel_relocs *p)
1589 {
1590   riscv_pcrel_lo_reloc *cur = p->lo_relocs;
1591
1592   while (cur != NULL)
1593     {
1594       riscv_pcrel_lo_reloc *next = cur->next;
1595       free (cur);
1596       cur = next;
1597     }
1598
1599   htab_delete (p->hi_relocs);
1600 }
1601
1602 static bfd_boolean
1603 riscv_zero_pcrel_hi_reloc (Elf_Internal_Rela *rel,
1604                            struct bfd_link_info *info,
1605                            bfd_vma pc,
1606                            bfd_vma addr,
1607                            bfd_byte *contents,
1608                            const reloc_howto_type *howto,
1609                            bfd *input_bfd)
1610 {
1611   /* We may need to reference low addreses in PC-relative modes even when the
1612    * PC is far away from these addresses.  For example, undefweak references
1613    * need to produce the address 0 when linked.  As 0 is far from the arbitrary
1614    * addresses that we can link PC-relative programs at, the linker can't
1615    * actually relocate references to those symbols.  In order to allow these
1616    * programs to work we simply convert the PC-relative auipc sequences to
1617    * 0-relative lui sequences.  */
1618   if (bfd_link_pic (info))
1619     return FALSE;
1620
1621   /* If it's possible to reference the symbol using auipc we do so, as that's
1622    * more in the spirit of the PC-relative relocations we're processing.  */
1623   bfd_vma offset = addr - pc;
1624   if (ARCH_SIZE == 32 || VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (offset)))
1625     return FALSE;
1626
1627   /* If it's impossible to reference this with a LUI-based offset then don't
1628    * bother to convert it at all so users still see the PC-relative relocation
1629    * in the truncation message.  */
1630   if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (addr)))
1631     return FALSE;
1632
1633   rel->r_info = ELFNN_R_INFO(addr, R_RISCV_HI20);
1634
1635   bfd_vma insn = bfd_get(howto->bitsize, input_bfd, contents + rel->r_offset);
1636   insn = (insn & ~MASK_AUIPC) | MATCH_LUI;
1637   bfd_put(howto->bitsize, input_bfd, insn, contents + rel->r_offset);
1638   return TRUE;
1639 }
1640
1641 static bfd_boolean
1642 riscv_record_pcrel_hi_reloc (riscv_pcrel_relocs *p, bfd_vma addr,
1643                              bfd_vma value, bfd_boolean absolute)
1644 {
1645   bfd_vma offset = absolute ? value : value - addr;
1646   riscv_pcrel_hi_reloc entry = {addr, offset};
1647   riscv_pcrel_hi_reloc **slot =
1648     (riscv_pcrel_hi_reloc **) htab_find_slot (p->hi_relocs, &entry, INSERT);
1649
1650   BFD_ASSERT (*slot == NULL);
1651   *slot = (riscv_pcrel_hi_reloc *) bfd_malloc (sizeof (riscv_pcrel_hi_reloc));
1652   if (*slot == NULL)
1653     return FALSE;
1654   **slot = entry;
1655   return TRUE;
1656 }
1657
1658 static bfd_boolean
1659 riscv_record_pcrel_lo_reloc (riscv_pcrel_relocs *p,
1660                              asection *input_section,
1661                              struct bfd_link_info *info,
1662                              reloc_howto_type *howto,
1663                              const Elf_Internal_Rela *reloc,
1664                              bfd_vma addr,
1665                              const char *name,
1666                              bfd_byte *contents)
1667 {
1668   riscv_pcrel_lo_reloc *entry;
1669   entry = (riscv_pcrel_lo_reloc *) bfd_malloc (sizeof (riscv_pcrel_lo_reloc));
1670   if (entry == NULL)
1671     return FALSE;
1672   *entry = (riscv_pcrel_lo_reloc) {input_section, info, howto, reloc, addr,
1673                                    name, contents, p->lo_relocs};
1674   p->lo_relocs = entry;
1675   return TRUE;
1676 }
1677
1678 static bfd_boolean
1679 riscv_resolve_pcrel_lo_relocs (riscv_pcrel_relocs *p)
1680 {
1681   riscv_pcrel_lo_reloc *r;
1682
1683   for (r = p->lo_relocs; r != NULL; r = r->next)
1684     {
1685       bfd *input_bfd = r->input_section->owner;
1686
1687       riscv_pcrel_hi_reloc search = {r->addr, 0};
1688       riscv_pcrel_hi_reloc *entry = htab_find (p->hi_relocs, &search);
1689       if (entry == NULL
1690           /* Check for overflow into bit 11 when adding reloc addend.  */
1691           || (! (entry->value & 0x800)
1692               && ((entry->value + r->reloc->r_addend) & 0x800)))
1693         {
1694           char *string = (entry == NULL
1695                           ? "%pcrel_lo missing matching %pcrel_hi"
1696                           : "%pcrel_lo overflow with an addend");
1697           (*r->info->callbacks->reloc_dangerous)
1698             (r->info, string, input_bfd, r->input_section, r->reloc->r_offset);
1699           return TRUE;
1700         }
1701
1702       perform_relocation (r->howto, r->reloc, entry->value, r->input_section,
1703                           input_bfd, r->contents);
1704     }
1705
1706   return TRUE;
1707 }
1708
1709 /* Relocate a RISC-V ELF section.
1710
1711    The RELOCATE_SECTION function is called by the new ELF backend linker
1712    to handle the relocations for a section.
1713
1714    The relocs are always passed as Rela structures.
1715
1716    This function is responsible for adjusting the section contents as
1717    necessary, and (if generating a relocatable output file) adjusting
1718    the reloc addend as necessary.
1719
1720    This function does not have to worry about setting the reloc
1721    address or the reloc symbol index.
1722
1723    LOCAL_SYMS is a pointer to the swapped in local symbols.
1724
1725    LOCAL_SECTIONS is an array giving the section in the input file
1726    corresponding to the st_shndx field of each local symbol.
1727
1728    The global hash table entry for the global symbols can be found
1729    via elf_sym_hashes (input_bfd).
1730
1731    When generating relocatable output, this function must handle
1732    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1733    going to be the section symbol corresponding to the output
1734    section, which means that the addend must be adjusted
1735    accordingly.  */
1736
1737 static bfd_boolean
1738 riscv_elf_relocate_section (bfd *output_bfd,
1739                             struct bfd_link_info *info,
1740                             bfd *input_bfd,
1741                             asection *input_section,
1742                             bfd_byte *contents,
1743                             Elf_Internal_Rela *relocs,
1744                             Elf_Internal_Sym *local_syms,
1745                             asection **local_sections)
1746 {
1747   Elf_Internal_Rela *rel;
1748   Elf_Internal_Rela *relend;
1749   riscv_pcrel_relocs pcrel_relocs;
1750   bfd_boolean ret = FALSE;
1751   asection *sreloc = elf_section_data (input_section)->sreloc;
1752   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
1753   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_bfd);
1754   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
1755   bfd_vma *local_got_offsets = elf_local_got_offsets (input_bfd);
1756   bfd_boolean absolute;
1757
1758   if (!riscv_init_pcrel_relocs (&pcrel_relocs))
1759     return FALSE;
1760
1761   relend = relocs + input_section->reloc_count;
1762   for (rel = relocs; rel < relend; rel++)
1763     {
1764       unsigned long r_symndx;
1765       struct elf_link_hash_entry *h;
1766       Elf_Internal_Sym *sym;
1767       asection *sec;
1768       bfd_vma relocation;
1769       bfd_reloc_status_type r = bfd_reloc_ok;
1770       const char *name;
1771       bfd_vma off, ie_off;
1772       bfd_boolean unresolved_reloc, is_ie = FALSE;
1773       bfd_vma pc = sec_addr (input_section) + rel->r_offset;
1774       int r_type = ELFNN_R_TYPE (rel->r_info), tls_type;
1775       reloc_howto_type *howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
1776       const char *msg = NULL;
1777       bfd_boolean resolved_to_zero;
1778
1779       if (howto == NULL
1780           || r_type == R_RISCV_GNU_VTINHERIT || r_type == R_RISCV_GNU_VTENTRY)
1781         continue;
1782
1783       /* This is a final link.  */
1784       r_symndx = ELFNN_R_SYM (rel->r_info);
1785       h = NULL;
1786       sym = NULL;
1787       sec = NULL;
1788       unresolved_reloc = FALSE;
1789       if (r_symndx < symtab_hdr->sh_info)
1790         {
1791           sym = local_syms + r_symndx;
1792           sec = local_sections[r_symndx];
1793           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1794         }
1795       else
1796         {
1797           bfd_boolean warned, ignored;
1798
1799           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1800                                    r_symndx, symtab_hdr, sym_hashes,
1801                                    h, sec, relocation,
1802                                    unresolved_reloc, warned, ignored);
1803           if (warned)
1804             {
1805               /* To avoid generating warning messages about truncated
1806                  relocations, set the relocation's address to be the same as
1807                  the start of this section.  */
1808               if (input_section->output_section != NULL)
1809                 relocation = input_section->output_section->vma;
1810               else
1811                 relocation = 0;
1812             }
1813         }
1814
1815       if (sec != NULL && discarded_section (sec))
1816         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1817                                          rel, 1, relend, howto, 0, contents);
1818
1819       if (bfd_link_relocatable (info))
1820         continue;
1821
1822       if (h != NULL)
1823         name = h->root.root.string;
1824       else
1825         {
1826           name = (bfd_elf_string_from_elf_section
1827                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
1828           if (name == NULL || *name == '\0')
1829             name = bfd_section_name (input_bfd, sec);
1830         }
1831
1832       resolved_to_zero = (h != NULL
1833                           && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
1834
1835       switch (r_type)
1836         {
1837         case R_RISCV_NONE:
1838         case R_RISCV_RELAX:
1839         case R_RISCV_TPREL_ADD:
1840         case R_RISCV_COPY:
1841         case R_RISCV_JUMP_SLOT:
1842         case R_RISCV_RELATIVE:
1843           /* These require nothing of us at all.  */
1844           continue;
1845
1846         case R_RISCV_HI20:
1847         case R_RISCV_BRANCH:
1848         case R_RISCV_RVC_BRANCH:
1849         case R_RISCV_RVC_LUI:
1850         case R_RISCV_LO12_I:
1851         case R_RISCV_LO12_S:
1852         case R_RISCV_SET6:
1853         case R_RISCV_SET8:
1854         case R_RISCV_SET16:
1855         case R_RISCV_SET32:
1856         case R_RISCV_32_PCREL:
1857         case R_RISCV_DELETE:
1858           /* These require no special handling beyond perform_relocation.  */
1859           break;
1860
1861         case R_RISCV_GOT_HI20:
1862           if (h != NULL)
1863             {
1864               bfd_boolean dyn, pic;
1865
1866               off = h->got.offset;
1867               BFD_ASSERT (off != (bfd_vma) -1);
1868               dyn = elf_hash_table (info)->dynamic_sections_created;
1869               pic = bfd_link_pic (info);
1870
1871               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
1872                   || (pic && SYMBOL_REFERENCES_LOCAL (info, h)))
1873                 {
1874                   /* This is actually a static link, or it is a
1875                      -Bsymbolic link and the symbol is defined
1876                      locally, or the symbol was forced to be local
1877                      because of a version file.  We must initialize
1878                      this entry in the global offset table.  Since the
1879                      offset must always be a multiple of the word size,
1880                      we use the least significant bit to record whether
1881                      we have initialized it already.
1882
1883                      When doing a dynamic link, we create a .rela.got
1884                      relocation entry to initialize the value.  This
1885                      is done in the finish_dynamic_symbol routine.  */
1886                   if ((off & 1) != 0)
1887                     off &= ~1;
1888                   else
1889                     {
1890                       bfd_put_NN (output_bfd, relocation,
1891                                   htab->elf.sgot->contents + off);
1892                       h->got.offset |= 1;
1893                     }
1894                 }
1895               else
1896                 unresolved_reloc = FALSE;
1897             }
1898           else
1899             {
1900               BFD_ASSERT (local_got_offsets != NULL
1901                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
1902
1903               off = local_got_offsets[r_symndx];
1904
1905               /* The offset must always be a multiple of the word size.
1906                  So, we can use the least significant bit to record
1907                  whether we have already processed this entry.  */
1908               if ((off & 1) != 0)
1909                 off &= ~1;
1910               else
1911                 {
1912                   if (bfd_link_pic (info))
1913                     {
1914                       asection *s;
1915                       Elf_Internal_Rela outrel;
1916
1917                       /* We need to generate a R_RISCV_RELATIVE reloc
1918                          for the dynamic linker.  */
1919                       s = htab->elf.srelgot;
1920                       BFD_ASSERT (s != NULL);
1921
1922                       outrel.r_offset = sec_addr (htab->elf.sgot) + off;
1923                       outrel.r_info =
1924                         ELFNN_R_INFO (0, R_RISCV_RELATIVE);
1925                       outrel.r_addend = relocation;
1926                       relocation = 0;
1927                       riscv_elf_append_rela (output_bfd, s, &outrel);
1928                     }
1929
1930                   bfd_put_NN (output_bfd, relocation,
1931                               htab->elf.sgot->contents + off);
1932                   local_got_offsets[r_symndx] |= 1;
1933                 }
1934             }
1935           relocation = sec_addr (htab->elf.sgot) + off;
1936           absolute = riscv_zero_pcrel_hi_reloc (rel,
1937                                                 info,
1938                                                 pc,
1939                                                 relocation,
1940                                                 contents,
1941                                                 howto,
1942                                                 input_bfd);
1943           r_type = ELFNN_R_TYPE (rel->r_info);
1944           howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
1945           if (howto == NULL)
1946             r = bfd_reloc_notsupported;
1947           else if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
1948                                                  relocation, absolute))
1949             r = bfd_reloc_overflow;
1950           break;
1951
1952         case R_RISCV_ADD8:
1953         case R_RISCV_ADD16:
1954         case R_RISCV_ADD32:
1955         case R_RISCV_ADD64:
1956           {
1957             bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1958                                          contents + rel->r_offset);
1959             relocation = old_value + relocation;
1960           }
1961           break;
1962
1963         case R_RISCV_SUB6:
1964         case R_RISCV_SUB8:
1965         case R_RISCV_SUB16:
1966         case R_RISCV_SUB32:
1967         case R_RISCV_SUB64:
1968           {
1969             bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1970                                          contents + rel->r_offset);
1971             relocation = old_value - relocation;
1972           }
1973           break;
1974
1975         case R_RISCV_CALL:
1976           /* Handle a call to an undefined weak function.  This won't be
1977              relaxed, so we have to handle it here.  */
1978           if (h != NULL && h->root.type == bfd_link_hash_undefweak
1979               && h->plt.offset == MINUS_ONE)
1980             {
1981               /* We can use x0 as the base register.  */
1982               bfd_vma insn = bfd_get_32 (input_bfd,
1983                                          contents + rel->r_offset + 4);
1984               insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1985               bfd_put_32 (input_bfd, insn, contents + rel->r_offset + 4);
1986               /* Set the relocation value so that we get 0 after the pc
1987                  relative adjustment.  */
1988               relocation = sec_addr (input_section) + rel->r_offset;
1989             }
1990           /* Fall through.  */
1991
1992         case R_RISCV_CALL_PLT:
1993         case R_RISCV_JAL:
1994         case R_RISCV_RVC_JUMP:
1995           if (bfd_link_pic (info) && h != NULL && h->plt.offset != MINUS_ONE)
1996             {
1997               /* Refer to the PLT entry.  */
1998               relocation = sec_addr (htab->elf.splt) + h->plt.offset;
1999               unresolved_reloc = FALSE;
2000             }
2001           break;
2002
2003         case R_RISCV_TPREL_HI20:
2004           relocation = tpoff (info, relocation);
2005           break;
2006
2007         case R_RISCV_TPREL_LO12_I:
2008         case R_RISCV_TPREL_LO12_S:
2009           relocation = tpoff (info, relocation);
2010           break;
2011
2012         case R_RISCV_TPREL_I:
2013         case R_RISCV_TPREL_S:
2014           relocation = tpoff (info, relocation);
2015           if (VALID_ITYPE_IMM (relocation + rel->r_addend))
2016             {
2017               /* We can use tp as the base register.  */
2018               bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2019               insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
2020               insn |= X_TP << OP_SH_RS1;
2021               bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
2022             }
2023           else
2024             r = bfd_reloc_overflow;
2025           break;
2026
2027         case R_RISCV_GPREL_I:
2028         case R_RISCV_GPREL_S:
2029           {
2030             bfd_vma gp = riscv_global_pointer_value (info);
2031             bfd_boolean x0_base = VALID_ITYPE_IMM (relocation + rel->r_addend);
2032             if (x0_base || VALID_ITYPE_IMM (relocation + rel->r_addend - gp))
2033               {
2034                 /* We can use x0 or gp as the base register.  */
2035                 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2036                 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
2037                 if (!x0_base)
2038                   {
2039                     rel->r_addend -= gp;
2040                     insn |= X_GP << OP_SH_RS1;
2041                   }
2042                 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
2043               }
2044             else
2045               r = bfd_reloc_overflow;
2046             break;
2047           }
2048
2049         case R_RISCV_PCREL_HI20:
2050           absolute = riscv_zero_pcrel_hi_reloc (rel,
2051                                                 info,
2052                                                 pc,
2053                                                 relocation,
2054                                                 contents,
2055                                                 howto,
2056                                                 input_bfd);
2057           r_type = ELFNN_R_TYPE (rel->r_info);
2058           howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
2059           if (howto == NULL)
2060             r = bfd_reloc_notsupported;
2061           else if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2062                                                  relocation + rel->r_addend,
2063                                                  absolute))
2064             r = bfd_reloc_overflow;
2065           break;
2066
2067         case R_RISCV_PCREL_LO12_I:
2068         case R_RISCV_PCREL_LO12_S:
2069           /* We don't allow section symbols plus addends as the auipc address,
2070              because then riscv_relax_delete_bytes would have to search through
2071              all relocs to update these addends.  This is also ambiguous, as
2072              we do allow offsets to be added to the target address, which are
2073              not to be used to find the auipc address.  */
2074           if (((sym != NULL && (ELF_ST_TYPE (sym->st_info) == STT_SECTION))
2075                || (h != NULL && h->type == STT_SECTION))
2076               && rel->r_addend)
2077             {
2078               r = bfd_reloc_dangerous;
2079               break;
2080             }
2081
2082           if (riscv_record_pcrel_lo_reloc (&pcrel_relocs, input_section, info,
2083                                            howto, rel, relocation, name,
2084                                            contents))
2085             continue;
2086           r = bfd_reloc_overflow;
2087           break;
2088
2089         case R_RISCV_TLS_DTPREL32:
2090         case R_RISCV_TLS_DTPREL64:
2091           relocation = dtpoff (info, relocation);
2092           break;
2093
2094         case R_RISCV_32:
2095         case R_RISCV_64:
2096           if ((input_section->flags & SEC_ALLOC) == 0)
2097             break;
2098
2099           if ((bfd_link_pic (info)
2100                && (h == NULL
2101                    || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2102                        && !resolved_to_zero)
2103                    || h->root.type != bfd_link_hash_undefweak)
2104                && (! howto->pc_relative
2105                    || !SYMBOL_CALLS_LOCAL (info, h)))
2106               || (!bfd_link_pic (info)
2107                   && h != NULL
2108                   && h->dynindx != -1
2109                   && !h->non_got_ref
2110                   && ((h->def_dynamic
2111                        && !h->def_regular)
2112                       || h->root.type == bfd_link_hash_undefweak
2113                       || h->root.type == bfd_link_hash_undefined)))
2114             {
2115               Elf_Internal_Rela outrel;
2116               bfd_boolean skip_static_relocation, skip_dynamic_relocation;
2117
2118               /* When generating a shared object, these relocations
2119                  are copied into the output file to be resolved at run
2120                  time.  */
2121
2122               outrel.r_offset =
2123                 _bfd_elf_section_offset (output_bfd, info, input_section,
2124                                          rel->r_offset);
2125               skip_static_relocation = outrel.r_offset != (bfd_vma) -2;
2126               skip_dynamic_relocation = outrel.r_offset >= (bfd_vma) -2;
2127               outrel.r_offset += sec_addr (input_section);
2128
2129               if (skip_dynamic_relocation)
2130                 memset (&outrel, 0, sizeof outrel);
2131               else if (h != NULL && h->dynindx != -1
2132                        && !(bfd_link_pic (info)
2133                             && SYMBOLIC_BIND (info, h)
2134                             && h->def_regular))
2135                 {
2136                   outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
2137                   outrel.r_addend = rel->r_addend;
2138                 }
2139               else
2140                 {
2141                   outrel.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2142                   outrel.r_addend = relocation + rel->r_addend;
2143                 }
2144
2145               riscv_elf_append_rela (output_bfd, sreloc, &outrel);
2146               if (skip_static_relocation)
2147                 continue;
2148             }
2149           break;
2150
2151         case R_RISCV_TLS_GOT_HI20:
2152           is_ie = TRUE;
2153           /* Fall through.  */
2154
2155         case R_RISCV_TLS_GD_HI20:
2156           if (h != NULL)
2157             {
2158               off = h->got.offset;
2159               h->got.offset |= 1;
2160             }
2161           else
2162             {
2163               off = local_got_offsets[r_symndx];
2164               local_got_offsets[r_symndx] |= 1;
2165             }
2166
2167           tls_type = _bfd_riscv_elf_tls_type (input_bfd, h, r_symndx);
2168           BFD_ASSERT (tls_type & (GOT_TLS_IE | GOT_TLS_GD));
2169           /* If this symbol is referenced by both GD and IE TLS, the IE
2170              reference's GOT slot follows the GD reference's slots.  */
2171           ie_off = 0;
2172           if ((tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_IE))
2173             ie_off = 2 * GOT_ENTRY_SIZE;
2174
2175           if ((off & 1) != 0)
2176             off &= ~1;
2177           else
2178             {
2179               Elf_Internal_Rela outrel;
2180               int indx = 0;
2181               bfd_boolean need_relocs = FALSE;
2182
2183               if (htab->elf.srelgot == NULL)
2184                 abort ();
2185
2186               if (h != NULL)
2187                 {
2188                   bfd_boolean dyn, pic;
2189                   dyn = htab->elf.dynamic_sections_created;
2190                   pic = bfd_link_pic (info);
2191
2192                   if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
2193                       && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
2194                     indx = h->dynindx;
2195                 }
2196
2197               /* The GOT entries have not been initialized yet.  Do it
2198                  now, and emit any relocations.  */
2199               if ((bfd_link_pic (info) || indx != 0)
2200                   && (h == NULL
2201                       || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2202                       || h->root.type != bfd_link_hash_undefweak))
2203                     need_relocs = TRUE;
2204
2205               if (tls_type & GOT_TLS_GD)
2206                 {
2207                   if (need_relocs)
2208                     {
2209                       outrel.r_offset = sec_addr (htab->elf.sgot) + off;
2210                       outrel.r_addend = 0;
2211                       outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPMODNN);
2212                       bfd_put_NN (output_bfd, 0,
2213                                   htab->elf.sgot->contents + off);
2214                       riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2215                       if (indx == 0)
2216                         {
2217                           BFD_ASSERT (! unresolved_reloc);
2218                           bfd_put_NN (output_bfd,
2219                                       dtpoff (info, relocation),
2220                                       (htab->elf.sgot->contents + off +
2221                                        RISCV_ELF_WORD_BYTES));
2222                         }
2223                       else
2224                         {
2225                           bfd_put_NN (output_bfd, 0,
2226                                       (htab->elf.sgot->contents + off +
2227                                        RISCV_ELF_WORD_BYTES));
2228                           outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPRELNN);
2229                           outrel.r_offset += RISCV_ELF_WORD_BYTES;
2230                           riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2231                         }
2232                     }
2233                   else
2234                     {
2235                       /* If we are not emitting relocations for a
2236                          general dynamic reference, then we must be in a
2237                          static link or an executable link with the
2238                          symbol binding locally.  Mark it as belonging
2239                          to module 1, the executable.  */
2240                       bfd_put_NN (output_bfd, 1,
2241                                   htab->elf.sgot->contents + off);
2242                       bfd_put_NN (output_bfd,
2243                                   dtpoff (info, relocation),
2244                                   (htab->elf.sgot->contents + off +
2245                                    RISCV_ELF_WORD_BYTES));
2246                    }
2247                 }
2248
2249               if (tls_type & GOT_TLS_IE)
2250                 {
2251                   if (need_relocs)
2252                     {
2253                       bfd_put_NN (output_bfd, 0,
2254                                   htab->elf.sgot->contents + off + ie_off);
2255                       outrel.r_offset = sec_addr (htab->elf.sgot)
2256                                        + off + ie_off;
2257                       outrel.r_addend = 0;
2258                       if (indx == 0)
2259                         outrel.r_addend = tpoff (info, relocation);
2260                       outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_TPRELNN);
2261                       riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2262                     }
2263                   else
2264                     {
2265                       bfd_put_NN (output_bfd, tpoff (info, relocation),
2266                                   htab->elf.sgot->contents + off + ie_off);
2267                     }
2268                 }
2269             }
2270
2271           BFD_ASSERT (off < (bfd_vma) -2);
2272           relocation = sec_addr (htab->elf.sgot) + off + (is_ie ? ie_off : 0);
2273           if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2274                                             relocation, FALSE))
2275             r = bfd_reloc_overflow;
2276           unresolved_reloc = FALSE;
2277           break;
2278
2279         default:
2280           r = bfd_reloc_notsupported;
2281         }
2282
2283       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2284          because such sections are not SEC_ALLOC and thus ld.so will
2285          not process them.  */
2286       if (unresolved_reloc
2287           && !((input_section->flags & SEC_DEBUGGING) != 0
2288                && h->def_dynamic)
2289           && _bfd_elf_section_offset (output_bfd, info, input_section,
2290                                       rel->r_offset) != (bfd_vma) -1)
2291         {
2292           (*_bfd_error_handler)
2293             (_("%pB(%pA+%#" PRIx64 "): "
2294                "unresolvable %s relocation against symbol `%s'"),
2295              input_bfd,
2296              input_section,
2297              (uint64_t) rel->r_offset,
2298              howto->name,
2299              h->root.root.string);
2300           continue;
2301         }
2302
2303       if (r == bfd_reloc_ok)
2304         r = perform_relocation (howto, rel, relocation, input_section,
2305                                 input_bfd, contents);
2306
2307       switch (r)
2308         {
2309         case bfd_reloc_ok:
2310           continue;
2311
2312         case bfd_reloc_overflow:
2313           info->callbacks->reloc_overflow
2314             (info, (h ? &h->root : NULL), name, howto->name,
2315              (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
2316           break;
2317
2318         case bfd_reloc_undefined:
2319           info->callbacks->undefined_symbol
2320             (info, name, input_bfd, input_section, rel->r_offset,
2321              TRUE);
2322           break;
2323
2324         case bfd_reloc_outofrange:
2325           msg = _("%X%P: internal error: out of range error\n");
2326           break;
2327
2328         case bfd_reloc_notsupported:
2329           msg = _("%X%P: internal error: unsupported relocation error\n");
2330           break;
2331
2332         case bfd_reloc_dangerous:
2333           info->callbacks->reloc_dangerous
2334             (info, "%pcrel_lo section symbol with an addend", input_bfd,
2335              input_section, rel->r_offset);
2336           break;
2337
2338         default:
2339           msg = _("%X%P: internal error: unknown error\n");
2340           break;
2341         }
2342
2343       if (msg)
2344         info->callbacks->einfo (msg);
2345
2346       /* We already reported the error via a callback, so don't try to report
2347          it again by returning false.  That leads to spurious errors.  */
2348       ret = TRUE;
2349       goto out;
2350     }
2351
2352   ret = riscv_resolve_pcrel_lo_relocs (&pcrel_relocs);
2353 out:
2354   riscv_free_pcrel_relocs (&pcrel_relocs);
2355   return ret;
2356 }
2357
2358 /* Finish up dynamic symbol handling.  We set the contents of various
2359    dynamic sections here.  */
2360
2361 static bfd_boolean
2362 riscv_elf_finish_dynamic_symbol (bfd *output_bfd,
2363                                  struct bfd_link_info *info,
2364                                  struct elf_link_hash_entry *h,
2365                                  Elf_Internal_Sym *sym)
2366 {
2367   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2368   const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2369
2370   if (h->plt.offset != (bfd_vma) -1)
2371     {
2372       /* We've decided to create a PLT entry for this symbol.  */
2373       bfd_byte *loc;
2374       bfd_vma i, header_address, plt_idx, got_address;
2375       uint32_t plt_entry[PLT_ENTRY_INSNS];
2376       Elf_Internal_Rela rela;
2377
2378       BFD_ASSERT (h->dynindx != -1);
2379
2380       /* Calculate the address of the PLT header.  */
2381       header_address = sec_addr (htab->elf.splt);
2382
2383       /* Calculate the index of the entry.  */
2384       plt_idx = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
2385
2386       /* Calculate the address of the .got.plt entry.  */
2387       got_address = riscv_elf_got_plt_val (plt_idx, info);
2388
2389       /* Find out where the .plt entry should go.  */
2390       loc = htab->elf.splt->contents + h->plt.offset;
2391
2392       /* Fill in the PLT entry itself.  */
2393       if (! riscv_make_plt_entry (output_bfd, got_address,
2394                                   header_address + h->plt.offset,
2395                                   plt_entry))
2396         return FALSE;
2397
2398       for (i = 0; i < PLT_ENTRY_INSNS; i++)
2399         bfd_put_32 (output_bfd, plt_entry[i], loc + 4*i);
2400
2401       /* Fill in the initial value of the .got.plt entry.  */
2402       loc = htab->elf.sgotplt->contents
2403             + (got_address - sec_addr (htab->elf.sgotplt));
2404       bfd_put_NN (output_bfd, sec_addr (htab->elf.splt), loc);
2405
2406       /* Fill in the entry in the .rela.plt section.  */
2407       rela.r_offset = got_address;
2408       rela.r_addend = 0;
2409       rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_JUMP_SLOT);
2410
2411       loc = htab->elf.srelplt->contents + plt_idx * sizeof (ElfNN_External_Rela);
2412       bed->s->swap_reloca_out (output_bfd, &rela, loc);
2413
2414       if (!h->def_regular)
2415         {
2416           /* Mark the symbol as undefined, rather than as defined in
2417              the .plt section.  Leave the value alone.  */
2418           sym->st_shndx = SHN_UNDEF;
2419           /* If the symbol is weak, we do need to clear the value.
2420              Otherwise, the PLT entry would provide a definition for
2421              the symbol even if the symbol wasn't defined anywhere,
2422              and so the symbol would never be NULL.  */
2423           if (!h->ref_regular_nonweak)
2424             sym->st_value = 0;
2425         }
2426     }
2427
2428   if (h->got.offset != (bfd_vma) -1
2429       && !(riscv_elf_hash_entry (h)->tls_type & (GOT_TLS_GD | GOT_TLS_IE))
2430       && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
2431     {
2432       asection *sgot;
2433       asection *srela;
2434       Elf_Internal_Rela rela;
2435
2436       /* This symbol has an entry in the GOT.  Set it up.  */
2437
2438       sgot = htab->elf.sgot;
2439       srela = htab->elf.srelgot;
2440       BFD_ASSERT (sgot != NULL && srela != NULL);
2441
2442       rela.r_offset = sec_addr (sgot) + (h->got.offset &~ (bfd_vma) 1);
2443
2444       /* If this is a local symbol reference, we just want to emit a RELATIVE
2445          reloc.  This can happen if it is a -Bsymbolic link, or a pie link, or
2446          the symbol was forced to be local because of a version file.
2447          The entry in the global offset table will already have been
2448          initialized in the relocate_section function.  */
2449       if (bfd_link_pic (info)
2450           && SYMBOL_REFERENCES_LOCAL (info, h))
2451         {
2452           BFD_ASSERT((h->got.offset & 1) != 0);
2453           asection *sec = h->root.u.def.section;
2454           rela.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2455           rela.r_addend = (h->root.u.def.value
2456                            + sec->output_section->vma
2457                            + sec->output_offset);
2458         }
2459       else
2460         {
2461           BFD_ASSERT((h->got.offset & 1) == 0);
2462           BFD_ASSERT (h->dynindx != -1);
2463           rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_NN);
2464           rela.r_addend = 0;
2465         }
2466
2467       bfd_put_NN (output_bfd, 0,
2468                   sgot->contents + (h->got.offset & ~(bfd_vma) 1));
2469       riscv_elf_append_rela (output_bfd, srela, &rela);
2470     }
2471
2472   if (h->needs_copy)
2473     {
2474       Elf_Internal_Rela rela;
2475       asection *s;
2476
2477       /* This symbols needs a copy reloc.  Set it up.  */
2478       BFD_ASSERT (h->dynindx != -1);
2479
2480       rela.r_offset = sec_addr (h->root.u.def.section) + h->root.u.def.value;
2481       rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_COPY);
2482       rela.r_addend = 0;
2483       if (h->root.u.def.section == htab->elf.sdynrelro)
2484         s = htab->elf.sreldynrelro;
2485       else
2486         s = htab->elf.srelbss;
2487       riscv_elf_append_rela (output_bfd, s, &rela);
2488     }
2489
2490   /* Mark some specially defined symbols as absolute.  */
2491   if (h == htab->elf.hdynamic
2492       || (h == htab->elf.hgot || h == htab->elf.hplt))
2493     sym->st_shndx = SHN_ABS;
2494
2495   return TRUE;
2496 }
2497
2498 /* Finish up the dynamic sections.  */
2499
2500 static bfd_boolean
2501 riscv_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
2502                   bfd *dynobj, asection *sdyn)
2503 {
2504   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2505   const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2506   size_t dynsize = bed->s->sizeof_dyn;
2507   bfd_byte *dyncon, *dynconend;
2508
2509   dynconend = sdyn->contents + sdyn->size;
2510   for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
2511     {
2512       Elf_Internal_Dyn dyn;
2513       asection *s;
2514
2515       bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
2516
2517       switch (dyn.d_tag)
2518         {
2519         case DT_PLTGOT:
2520           s = htab->elf.sgotplt;
2521           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2522           break;
2523         case DT_JMPREL:
2524           s = htab->elf.srelplt;
2525           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2526           break;
2527         case DT_PLTRELSZ:
2528           s = htab->elf.srelplt;
2529           dyn.d_un.d_val = s->size;
2530           break;
2531         default:
2532           continue;
2533         }
2534
2535       bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
2536     }
2537   return TRUE;
2538 }
2539
2540 static bfd_boolean
2541 riscv_elf_finish_dynamic_sections (bfd *output_bfd,
2542                                    struct bfd_link_info *info)
2543 {
2544   bfd *dynobj;
2545   asection *sdyn;
2546   struct riscv_elf_link_hash_table *htab;
2547
2548   htab = riscv_elf_hash_table (info);
2549   BFD_ASSERT (htab != NULL);
2550   dynobj = htab->elf.dynobj;
2551
2552   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
2553
2554   if (elf_hash_table (info)->dynamic_sections_created)
2555     {
2556       asection *splt;
2557       bfd_boolean ret;
2558
2559       splt = htab->elf.splt;
2560       BFD_ASSERT (splt != NULL && sdyn != NULL);
2561
2562       ret = riscv_finish_dyn (output_bfd, info, dynobj, sdyn);
2563
2564       if (!ret)
2565         return ret;
2566
2567       /* Fill in the head and tail entries in the procedure linkage table.  */
2568       if (splt->size > 0)
2569         {
2570           int i;
2571           uint32_t plt_header[PLT_HEADER_INSNS];
2572           ret = riscv_make_plt_header (output_bfd,
2573                                        sec_addr (htab->elf.sgotplt),
2574                                        sec_addr (splt), plt_header);
2575           if (!ret)
2576             return ret;
2577
2578           for (i = 0; i < PLT_HEADER_INSNS; i++)
2579             bfd_put_32 (output_bfd, plt_header[i], splt->contents + 4*i);
2580
2581           elf_section_data (splt->output_section)->this_hdr.sh_entsize
2582             = PLT_ENTRY_SIZE;
2583         }
2584     }
2585
2586   if (htab->elf.sgotplt)
2587     {
2588       asection *output_section = htab->elf.sgotplt->output_section;
2589
2590       if (bfd_is_abs_section (output_section))
2591         {
2592           (*_bfd_error_handler)
2593             (_("discarded output section: `%pA'"), htab->elf.sgotplt);
2594           return FALSE;
2595         }
2596
2597       if (htab->elf.sgotplt->size > 0)
2598         {
2599           /* Write the first two entries in .got.plt, needed for the dynamic
2600              linker.  */
2601           bfd_put_NN (output_bfd, (bfd_vma) -1, htab->elf.sgotplt->contents);
2602           bfd_put_NN (output_bfd, (bfd_vma) 0,
2603                       htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
2604         }
2605
2606       elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2607     }
2608
2609   if (htab->elf.sgot)
2610     {
2611       asection *output_section = htab->elf.sgot->output_section;
2612
2613       if (htab->elf.sgot->size > 0)
2614         {
2615           /* Set the first entry in the global offset table to the address of
2616              the dynamic section.  */
2617           bfd_vma val = sdyn ? sec_addr (sdyn) : 0;
2618           bfd_put_NN (output_bfd, val, htab->elf.sgot->contents);
2619         }
2620
2621       elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2622     }
2623
2624   return TRUE;
2625 }
2626
2627 /* Return address for Ith PLT stub in section PLT, for relocation REL
2628    or (bfd_vma) -1 if it should not be included.  */
2629
2630 static bfd_vma
2631 riscv_elf_plt_sym_val (bfd_vma i, const asection *plt,
2632                        const arelent *rel ATTRIBUTE_UNUSED)
2633 {
2634   return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
2635 }
2636
2637 static enum elf_reloc_type_class
2638 riscv_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2639                         const asection *rel_sec ATTRIBUTE_UNUSED,
2640                         const Elf_Internal_Rela *rela)
2641 {
2642   switch (ELFNN_R_TYPE (rela->r_info))
2643     {
2644     case R_RISCV_RELATIVE:
2645       return reloc_class_relative;
2646     case R_RISCV_JUMP_SLOT:
2647       return reloc_class_plt;
2648     case R_RISCV_COPY:
2649       return reloc_class_copy;
2650     default:
2651       return reloc_class_normal;
2652     }
2653 }
2654
2655 /* Given the ELF header flags in FLAGS, it returns a string that describes the
2656    float ABI.  */
2657
2658 static const char *
2659 riscv_float_abi_string (flagword flags)
2660 {
2661   switch (flags & EF_RISCV_FLOAT_ABI)
2662     {
2663     case EF_RISCV_FLOAT_ABI_SOFT:
2664       return "soft-float";
2665       break;
2666     case EF_RISCV_FLOAT_ABI_SINGLE:
2667       return "single-float";
2668       break;
2669     case EF_RISCV_FLOAT_ABI_DOUBLE:
2670       return "double-float";
2671       break;
2672     case EF_RISCV_FLOAT_ABI_QUAD:
2673       return "quad-float";
2674       break;
2675     default:
2676       abort ();
2677     }
2678 }
2679
2680 /* The information of architecture attribute.  */
2681 static riscv_subset_list_t in_subsets;
2682 static riscv_subset_list_t out_subsets;
2683 static riscv_subset_list_t merged_subsets;
2684
2685 /* Predicator for standard extension.  */
2686
2687 static bfd_boolean
2688 riscv_std_ext_p (const char *name)
2689 {
2690   return (strlen (name) == 1) && (name[0] != 'x') && (name[0] != 's');
2691 }
2692
2693 /* Predicator for non-standard extension.  */
2694
2695 static bfd_boolean
2696 riscv_non_std_ext_p (const char *name)
2697 {
2698   return (strlen (name) >= 2) && (name[0] == 'x');
2699 }
2700
2701 /* Predicator for standard supervisor extension.  */
2702
2703 static bfd_boolean
2704 riscv_std_sv_ext_p (const char *name)
2705 {
2706   return (strlen (name) >= 2) && (name[0] == 's') && (name[1] != 'x');
2707 }
2708
2709 /* Predicator for non-standard supervisor extension.  */
2710
2711 static bfd_boolean
2712 riscv_non_std_sv_ext_p (const char *name)
2713 {
2714   return (strlen (name) >= 3) && (name[0] == 's') && (name[1] == 'x');
2715 }
2716
2717 /* Error handler when version mis-match.  */
2718
2719 static void
2720 riscv_version_mismatch (bfd *ibfd,
2721                         struct riscv_subset_t *in,
2722                         struct riscv_subset_t *out)
2723 {
2724   _bfd_error_handler
2725     (_("error: %pB: Mis-matched ISA version for '%s' extension. "
2726        "%d.%d vs %d.%d"),
2727        ibfd, in->name,
2728        in->major_version, in->minor_version,
2729        out->major_version, out->minor_version);
2730 }
2731
2732 /* Return true if subset is 'i' or 'e'.  */
2733
2734 static bfd_boolean
2735 riscv_i_or_e_p (bfd *ibfd,
2736                 const char *arch,
2737                 struct riscv_subset_t *subset)
2738 {
2739   if ((strcasecmp (subset->name, "e") != 0)
2740       && (strcasecmp (subset->name, "i") != 0))
2741     {
2742       _bfd_error_handler
2743         (_("error: %pB: corrupted ISA string '%s'. "
2744            "First letter should be 'i' or 'e' but got '%s'."),
2745            ibfd, arch, subset->name);
2746       return FALSE;
2747     }
2748   return TRUE;
2749 }
2750
2751 /* Merge standard extensions.
2752
2753    Return Value:
2754      Return FALSE if failed to merge.
2755
2756    Arguments:
2757      `bfd`: bfd handler.
2758      `in_arch`: Raw arch string for input object.
2759      `out_arch`: Raw arch string for output object.
2760      `pin`: subset list for input object, and it'll skip all merged subset after
2761             merge.
2762      `pout`: Like `pin`, but for output object.  */
2763
2764 static bfd_boolean
2765 riscv_merge_std_ext (bfd *ibfd,
2766                      const char *in_arch,
2767                      const char *out_arch,
2768                      struct riscv_subset_t **pin,
2769                      struct riscv_subset_t **pout)
2770 {
2771   const char *standard_exts = riscv_supported_std_ext ();
2772   const char *p;
2773   struct riscv_subset_t *in = *pin;
2774   struct riscv_subset_t *out = *pout;
2775
2776   /* First letter should be 'i' or 'e'.  */
2777   if (!riscv_i_or_e_p (ibfd, in_arch, in))
2778     return FALSE;
2779
2780   if (!riscv_i_or_e_p (ibfd, out_arch, out))
2781     return FALSE;
2782
2783   if (in->name[0] != out->name[0])
2784     {
2785       /* TODO: We might allow merge 'i' with 'e'.  */
2786       _bfd_error_handler
2787         (_("error: %pB: Mis-matched ISA string to merge '%s' and '%s'."),
2788          ibfd, in->name, out->name);
2789       return FALSE;
2790     }
2791   else if ((in->major_version != out->major_version) ||
2792            (in->minor_version != out->minor_version))
2793     {
2794       /* TODO: Allow different merge policy.  */
2795       riscv_version_mismatch (ibfd, in, out);
2796       return FALSE;
2797     }
2798   else
2799     riscv_add_subset (&merged_subsets,
2800                       in->name, in->major_version, in->minor_version);
2801
2802   in = in->next;
2803   out = out->next;
2804
2805   /* Handle standard extension first.  */
2806   for (p = standard_exts; *p; ++p)
2807     {
2808       char find_ext[2] = {*p, '\0'};
2809       struct riscv_subset_t *find_in =
2810         riscv_lookup_subset (&in_subsets, find_ext);
2811       struct riscv_subset_t *find_out =
2812         riscv_lookup_subset (&out_subsets, find_ext);
2813
2814       if (find_in == NULL && find_out == NULL)
2815         continue;
2816
2817       /* Check version is same or not.  */
2818       /* TODO: Allow different merge policy.  */
2819       if ((find_in != NULL && find_out != NULL)
2820           && ((find_in->major_version != find_out->major_version)
2821               || (find_in->minor_version != find_out->minor_version)))
2822         {
2823           riscv_version_mismatch (ibfd, in, out);
2824           return FALSE;
2825         }
2826
2827       struct riscv_subset_t *merged = find_in ? find_in : find_out;
2828       riscv_add_subset (&merged_subsets, merged->name,
2829                         merged->major_version, merged->minor_version);
2830     }
2831
2832   /* Skip all standard extensions.  */
2833   while ((in != NULL) && riscv_std_ext_p (in->name)) in = in->next;
2834   while ((out != NULL) && riscv_std_ext_p (out->name)) out = out->next;
2835
2836   *pin = in;
2837   *pout = out;
2838
2839   return TRUE;
2840 }
2841
2842 /* Merge non-standard and supervisor extensions.
2843    Return Value:
2844      Return FALSE if failed to merge.
2845
2846    Arguments:
2847      `bfd`: bfd handler.
2848      `in_arch`: Raw arch string for input object.
2849      `out_arch`: Raw arch string for output object.
2850      `pin`: subset list for input object, and it'll skip all merged subset after
2851             merge.
2852      `pout`: Like `pin`, but for output object. */
2853
2854 static bfd_boolean
2855 riscv_merge_non_std_and_sv_ext (bfd *ibfd,
2856                                 riscv_subset_t **pin,
2857                                 riscv_subset_t **pout,
2858                                 bfd_boolean (*predicate_func) (const char *))
2859 {
2860   riscv_subset_t *in = *pin;
2861   riscv_subset_t *out = *pout;
2862
2863   for (in = *pin; in != NULL && predicate_func (in->name); in = in->next)
2864     riscv_add_subset (&merged_subsets, in->name, in->major_version,
2865                       in->minor_version);
2866
2867   for (out = *pout; out != NULL && predicate_func (out->name); out = out->next)
2868     {
2869       riscv_subset_t *find_ext =
2870         riscv_lookup_subset (&merged_subsets, out->name);
2871       if (find_ext != NULL)
2872         {
2873           /* Check version is same or not. */
2874           /* TODO: Allow different merge policy.  */
2875           if ((find_ext->major_version != out->major_version)
2876               || (find_ext->minor_version != out->minor_version))
2877             {
2878               riscv_version_mismatch (ibfd, find_ext, out);
2879               return FALSE;
2880             }
2881         }
2882       else
2883         riscv_add_subset (&merged_subsets, out->name,
2884                           out->major_version, out->minor_version);
2885     }
2886
2887   *pin = in;
2888   *pout = out;
2889   return TRUE;
2890 }
2891
2892 /* Merge Tag_RISCV_arch attribute.  */
2893
2894 static char *
2895 riscv_merge_arch_attr_info (bfd *ibfd, char *in_arch, char *out_arch)
2896 {
2897   riscv_subset_t *in, *out;
2898   char *merged_arch_str;
2899
2900   unsigned xlen_in, xlen_out;
2901   merged_subsets.head = NULL;
2902   merged_subsets.tail = NULL;
2903
2904   riscv_parse_subset_t rpe_in;
2905   riscv_parse_subset_t rpe_out;
2906
2907   rpe_in.subset_list = &in_subsets;
2908   rpe_in.error_handler = _bfd_error_handler;
2909   rpe_in.xlen = &xlen_in;
2910
2911   rpe_out.subset_list = &out_subsets;
2912   rpe_out.error_handler = _bfd_error_handler;
2913   rpe_out.xlen = &xlen_out;
2914
2915   if (in_arch == NULL && out_arch == NULL)
2916     return NULL;
2917
2918   if (in_arch == NULL && out_arch != NULL)
2919     return out_arch;
2920
2921   if (in_arch != NULL && out_arch == NULL)
2922     return in_arch;
2923
2924   /* Parse subset from arch string.  */
2925   if (!riscv_parse_subset (&rpe_in, in_arch))
2926     return NULL;
2927
2928   if (!riscv_parse_subset (&rpe_out, out_arch))
2929     return NULL;
2930
2931   /* Checking XLEN.  */
2932   if (xlen_out != xlen_in)
2933     {
2934       _bfd_error_handler
2935         (_("error: %pB: ISA string of input (%s) doesn't match "
2936            "output (%s)."), ibfd, in_arch, out_arch);
2937       return NULL;
2938     }
2939
2940   /* Merge subset list.  */
2941   in = in_subsets.head;
2942   out = out_subsets.head;
2943
2944   /* Merge standard extension.  */
2945   if (!riscv_merge_std_ext (ibfd, in_arch, out_arch, &in, &out))
2946     return NULL;
2947   /* Merge non-standard extension.  */
2948   if (!riscv_merge_non_std_and_sv_ext (ibfd, &in, &out, riscv_non_std_ext_p))
2949     return NULL;
2950   /* Merge standard supervisor extension.  */
2951   if (!riscv_merge_non_std_and_sv_ext (ibfd, &in, &out, riscv_std_sv_ext_p))
2952     return NULL;
2953   /* Merge non-standard supervisor extension.  */
2954   if (!riscv_merge_non_std_and_sv_ext (ibfd, &in, &out, riscv_non_std_sv_ext_p))
2955     return NULL;
2956
2957   if (xlen_in != xlen_out)
2958     {
2959       _bfd_error_handler
2960         (_("error: %pB: XLEN of input (%u) doesn't match "
2961            "output (%u)."), ibfd, xlen_in, xlen_out);
2962       return NULL;
2963     }
2964
2965   if (xlen_in != ARCH_SIZE)
2966     {
2967       _bfd_error_handler
2968         (_("error: %pB: Unsupported XLEN (%u), you might be "
2969            "using wrong emulation."), ibfd, xlen_in);
2970       return NULL;
2971     }
2972
2973   merged_arch_str = riscv_arch_str (ARCH_SIZE, &merged_subsets);
2974
2975   /* Release the subset lists.  */
2976   riscv_release_subset_list (&in_subsets);
2977   riscv_release_subset_list (&out_subsets);
2978   riscv_release_subset_list (&merged_subsets);
2979
2980   return merged_arch_str;
2981 }
2982
2983 /* Merge object attributes from IBFD into output_bfd of INFO.
2984    Raise an error if there are conflicting attributes.  */
2985
2986 static bfd_boolean
2987 riscv_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
2988 {
2989   bfd *obfd = info->output_bfd;
2990   obj_attribute *in_attr;
2991   obj_attribute *out_attr;
2992   bfd_boolean result = TRUE;
2993   const char *sec_name = get_elf_backend_data (ibfd)->obj_attrs_section;
2994   unsigned int i;
2995
2996   /* Skip linker created files.  */
2997   if (ibfd->flags & BFD_LINKER_CREATED)
2998     return TRUE;
2999
3000   /* Skip any input that doesn't have an attribute section.
3001      This enables to link object files without attribute section with
3002      any others.  */
3003   if (bfd_get_section_by_name (ibfd, sec_name) == NULL)
3004     return TRUE;
3005
3006   if (!elf_known_obj_attributes_proc (obfd)[0].i)
3007     {
3008       /* This is the first object.  Copy the attributes.  */
3009       _bfd_elf_copy_obj_attributes (ibfd, obfd);
3010
3011       out_attr = elf_known_obj_attributes_proc (obfd);
3012
3013       /* Use the Tag_null value to indicate the attributes have been
3014          initialized.  */
3015       out_attr[0].i = 1;
3016
3017       return TRUE;
3018     }
3019
3020   in_attr = elf_known_obj_attributes_proc (ibfd);
3021   out_attr = elf_known_obj_attributes_proc (obfd);
3022
3023   for (i = LEAST_KNOWN_OBJ_ATTRIBUTE; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
3024     {
3025     switch (i)
3026       {
3027       case Tag_RISCV_arch:
3028         if (!out_attr[Tag_RISCV_arch].s)
3029           out_attr[Tag_RISCV_arch].s = in_attr[Tag_RISCV_arch].s;
3030         else if (in_attr[Tag_RISCV_arch].s
3031                  && out_attr[Tag_RISCV_arch].s)
3032           {
3033             /* Check arch compatible.  */
3034             char *merged_arch =
3035                 riscv_merge_arch_attr_info (ibfd,
3036                                             in_attr[Tag_RISCV_arch].s,
3037                                             out_attr[Tag_RISCV_arch].s);
3038             if (merged_arch == NULL)
3039               {
3040                 result = FALSE;
3041                 out_attr[Tag_RISCV_arch].s = "";
3042               }
3043             else
3044               out_attr[Tag_RISCV_arch].s = merged_arch;
3045           }
3046         break;
3047       case Tag_RISCV_priv_spec:
3048       case Tag_RISCV_priv_spec_minor:
3049       case Tag_RISCV_priv_spec_revision:
3050         if (out_attr[i].i != in_attr[i].i)
3051           {
3052             _bfd_error_handler
3053               (_("error: %pB: conflicting priv spec version "
3054                  "(major/minor/revision)."), ibfd);
3055             result = FALSE;
3056           }
3057         break;
3058       case Tag_RISCV_unaligned_access:
3059         out_attr[i].i |= in_attr[i].i;
3060         break;
3061       case Tag_RISCV_stack_align:
3062         if (out_attr[i].i == 0)
3063           out_attr[i].i = in_attr[i].i;
3064         else if (in_attr[i].i != 0
3065                  && out_attr[i].i != 0
3066                  && out_attr[i].i != in_attr[i].i)
3067           {
3068             _bfd_error_handler
3069               (_("error: %pB use %u-byte stack aligned but the output "
3070                  "use %u-byte stack aligned."),
3071                ibfd, in_attr[i].i, out_attr[i].i);
3072             result = FALSE;
3073           }
3074         break;
3075       default:
3076         result &= _bfd_elf_merge_unknown_attribute_low (ibfd, obfd, i);
3077       }
3078
3079       /* If out_attr was copied from in_attr then it won't have a type yet.  */
3080       if (in_attr[i].type && !out_attr[i].type)
3081         out_attr[i].type = in_attr[i].type;
3082     }
3083
3084   /* Merge Tag_compatibility attributes and any common GNU ones.  */
3085   if (!_bfd_elf_merge_object_attributes (ibfd, info))
3086     return FALSE;
3087
3088   /* Check for any attributes not known on RISC-V.  */
3089   result &= _bfd_elf_merge_unknown_attribute_list (ibfd, obfd);
3090
3091   return result;
3092 }
3093
3094 /* Merge backend specific data from an object file to the output
3095    object file when linking.  */
3096
3097 static bfd_boolean
3098 _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
3099 {
3100   bfd *obfd = info->output_bfd;
3101   flagword new_flags, old_flags;
3102
3103   if (!is_riscv_elf (ibfd) || !is_riscv_elf (obfd))
3104     return TRUE;
3105
3106   if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
3107     {
3108       (*_bfd_error_handler)
3109         (_("%pB: ABI is incompatible with that of the selected emulation:\n"
3110            "  target emulation `%s' does not match `%s'"),
3111          ibfd, bfd_get_target (ibfd), bfd_get_target (obfd));
3112       return FALSE;
3113     }
3114
3115   if (!_bfd_elf_merge_object_attributes (ibfd, info))
3116     return FALSE;
3117
3118   if (!riscv_merge_attributes (ibfd, info))
3119     return FALSE;
3120
3121   new_flags = elf_elfheader (ibfd)->e_flags;
3122   old_flags = elf_elfheader (obfd)->e_flags;
3123
3124   if (! elf_flags_init (obfd))
3125     {
3126       elf_flags_init (obfd) = TRUE;
3127       elf_elfheader (obfd)->e_flags = new_flags;
3128       return TRUE;
3129     }
3130
3131   /* Check to see if the input BFD actually contains any sections.  If not,
3132      its flags may not have been initialized either, but it cannot actually
3133      cause any incompatibility.  Do not short-circuit dynamic objects; their
3134      section list may be emptied by elf_link_add_object_symbols.
3135
3136      Also check to see if there are no code sections in the input.  In this
3137      case, there is no need to check for code specific flags.  */
3138   if (!(ibfd->flags & DYNAMIC))
3139     {
3140       bfd_boolean null_input_bfd = TRUE;
3141       bfd_boolean only_data_sections = TRUE;
3142       asection *sec;
3143
3144       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3145         {
3146           if ((bfd_get_section_flags (ibfd, sec)
3147                & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
3148               == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
3149             only_data_sections = FALSE;
3150
3151           null_input_bfd = FALSE;
3152           break;
3153         }
3154
3155       if (null_input_bfd || only_data_sections)
3156         return TRUE;
3157     }
3158
3159   /* Disallow linking different float ABIs.  */
3160   if ((old_flags ^ new_flags) & EF_RISCV_FLOAT_ABI)
3161     {
3162       (*_bfd_error_handler)
3163         (_("%pB: can't link %s modules with %s modules"), ibfd,
3164          riscv_float_abi_string (new_flags),
3165          riscv_float_abi_string (old_flags));
3166       goto fail;
3167     }
3168
3169   /* Disallow linking RVE and non-RVE.  */
3170   if ((old_flags ^ new_flags) & EF_RISCV_RVE)
3171     {
3172       (*_bfd_error_handler)
3173        (_("%pB: can't link RVE with other target"), ibfd);
3174       goto fail;
3175     }
3176
3177   /* Allow linking RVC and non-RVC, and keep the RVC flag.  */
3178   elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC;
3179
3180   return TRUE;
3181
3182 fail:
3183   bfd_set_error (bfd_error_bad_value);
3184   return FALSE;
3185 }
3186
3187 /* Delete some bytes from a section while relaxing.  */
3188
3189 static bfd_boolean
3190 riscv_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, size_t count,
3191                           struct bfd_link_info *link_info)
3192 {
3193   unsigned int i, symcount;
3194   bfd_vma toaddr = sec->size;
3195   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
3196   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3197   unsigned int sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
3198   struct bfd_elf_section_data *data = elf_section_data (sec);
3199   bfd_byte *contents = data->this_hdr.contents;
3200
3201   /* Actually delete the bytes.  */
3202   sec->size -= count;
3203   memmove (contents + addr, contents + addr + count, toaddr - addr - count);
3204
3205   /* Adjust the location of all of the relocs.  Note that we need not
3206      adjust the addends, since all PC-relative references must be against
3207      symbols, which we will adjust below.  */
3208   for (i = 0; i < sec->reloc_count; i++)
3209     if (data->relocs[i].r_offset > addr && data->relocs[i].r_offset < toaddr)
3210       data->relocs[i].r_offset -= count;
3211
3212   /* Adjust the local symbols defined in this section.  */
3213   for (i = 0; i < symtab_hdr->sh_info; i++)
3214     {
3215       Elf_Internal_Sym *sym = (Elf_Internal_Sym *) symtab_hdr->contents + i;
3216       if (sym->st_shndx == sec_shndx)
3217         {
3218           /* If the symbol is in the range of memory we just moved, we
3219              have to adjust its value.  */
3220           if (sym->st_value > addr && sym->st_value <= toaddr)
3221             sym->st_value -= count;
3222
3223           /* If the symbol *spans* the bytes we just deleted (i.e. its
3224              *end* is in the moved bytes but its *start* isn't), then we
3225              must adjust its size.
3226
3227              This test needs to use the original value of st_value, otherwise
3228              we might accidentally decrease size when deleting bytes right
3229              before the symbol.  But since deleted relocs can't span across
3230              symbols, we can't have both a st_value and a st_size decrease,
3231              so it is simpler to just use an else.  */
3232           else if (sym->st_value <= addr
3233                    && sym->st_value + sym->st_size > addr
3234                    && sym->st_value + sym->st_size <= toaddr)
3235             sym->st_size -= count;
3236         }
3237     }
3238
3239   /* Now adjust the global symbols defined in this section.  */
3240   symcount = ((symtab_hdr->sh_size / sizeof (ElfNN_External_Sym))
3241               - symtab_hdr->sh_info);
3242
3243   for (i = 0; i < symcount; i++)
3244     {
3245       struct elf_link_hash_entry *sym_hash = sym_hashes[i];
3246
3247       /* The '--wrap SYMBOL' option is causing a pain when the object file,
3248          containing the definition of __wrap_SYMBOL, includes a direct
3249          call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
3250          the same symbol (which is __wrap_SYMBOL), but still exist as two
3251          different symbols in 'sym_hashes', we don't want to adjust
3252          the global symbol __wrap_SYMBOL twice.  */
3253       /* The same problem occurs with symbols that are versioned_hidden, as
3254          foo becomes an alias for foo@BAR, and hence they need the same
3255          treatment.  */
3256       if (link_info->wrap_hash != NULL
3257           || sym_hash->versioned == versioned_hidden)
3258         {
3259           struct elf_link_hash_entry **cur_sym_hashes;
3260
3261           /* Loop only over the symbols which have already been checked.  */
3262           for (cur_sym_hashes = sym_hashes; cur_sym_hashes < &sym_hashes[i];
3263                cur_sym_hashes++)
3264             {
3265               /* If the current symbol is identical to 'sym_hash', that means
3266                  the symbol was already adjusted (or at least checked).  */
3267               if (*cur_sym_hashes == sym_hash)
3268                 break;
3269             }
3270           /* Don't adjust the symbol again.  */
3271           if (cur_sym_hashes < &sym_hashes[i])
3272             continue;
3273         }
3274
3275       if ((sym_hash->root.type == bfd_link_hash_defined
3276            || sym_hash->root.type == bfd_link_hash_defweak)
3277           && sym_hash->root.u.def.section == sec)
3278         {
3279           /* As above, adjust the value if needed.  */
3280           if (sym_hash->root.u.def.value > addr
3281               && sym_hash->root.u.def.value <= toaddr)
3282             sym_hash->root.u.def.value -= count;
3283
3284           /* As above, adjust the size if needed.  */
3285           else if (sym_hash->root.u.def.value <= addr
3286                    && sym_hash->root.u.def.value + sym_hash->size > addr
3287                    && sym_hash->root.u.def.value + sym_hash->size <= toaddr)
3288             sym_hash->size -= count;
3289         }
3290     }
3291
3292   return TRUE;
3293 }
3294
3295 /* A second format for recording PC-relative hi relocations.  This stores the
3296    information required to relax them to GP-relative addresses.  */
3297
3298 typedef struct riscv_pcgp_hi_reloc riscv_pcgp_hi_reloc;
3299 struct riscv_pcgp_hi_reloc
3300 {
3301   bfd_vma hi_sec_off;
3302   bfd_vma hi_addend;
3303   bfd_vma hi_addr;
3304   unsigned hi_sym;
3305   asection *sym_sec;
3306   riscv_pcgp_hi_reloc *next;
3307 };
3308
3309 typedef struct riscv_pcgp_lo_reloc riscv_pcgp_lo_reloc;
3310 struct riscv_pcgp_lo_reloc
3311 {
3312   bfd_vma hi_sec_off;
3313   riscv_pcgp_lo_reloc *next;
3314 };
3315
3316 typedef struct
3317 {
3318   riscv_pcgp_hi_reloc *hi;
3319   riscv_pcgp_lo_reloc *lo;
3320 } riscv_pcgp_relocs;
3321
3322 /* Initialize the pcgp reloc info in P.  */
3323
3324 static bfd_boolean
3325 riscv_init_pcgp_relocs (riscv_pcgp_relocs *p)
3326 {
3327   p->hi = NULL;
3328   p->lo = NULL;
3329   return TRUE;
3330 }
3331
3332 /* Free the pcgp reloc info in P.  */
3333
3334 static void
3335 riscv_free_pcgp_relocs (riscv_pcgp_relocs *p,
3336                         bfd *abfd ATTRIBUTE_UNUSED,
3337                         asection *sec ATTRIBUTE_UNUSED)
3338 {
3339   riscv_pcgp_hi_reloc *c;
3340   riscv_pcgp_lo_reloc *l;
3341
3342   for (c = p->hi; c != NULL;)
3343     {
3344       riscv_pcgp_hi_reloc *next = c->next;
3345       free (c);
3346       c = next;
3347     }
3348
3349   for (l = p->lo; l != NULL;)
3350     {
3351       riscv_pcgp_lo_reloc *next = l->next;
3352       free (l);
3353       l = next;
3354     }
3355 }
3356
3357 /* Record pcgp hi part reloc info in P, using HI_SEC_OFF as the lookup index.
3358    The HI_ADDEND, HI_ADDR, HI_SYM, and SYM_SEC args contain info required to
3359    relax the corresponding lo part reloc.  */
3360
3361 static bfd_boolean
3362 riscv_record_pcgp_hi_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off,
3363                             bfd_vma hi_addend, bfd_vma hi_addr,
3364                             unsigned hi_sym, asection *sym_sec)
3365 {
3366   riscv_pcgp_hi_reloc *new = bfd_malloc (sizeof(*new));
3367   if (!new)
3368     return FALSE;
3369   new->hi_sec_off = hi_sec_off;
3370   new->hi_addend = hi_addend;
3371   new->hi_addr = hi_addr;
3372   new->hi_sym = hi_sym;
3373   new->sym_sec = sym_sec;
3374   new->next = p->hi;
3375   p->hi = new;
3376   return TRUE;
3377 }
3378
3379 /* Look up hi part pcgp reloc info in P, using HI_SEC_OFF as the lookup index.
3380    This is used by a lo part reloc to find the corresponding hi part reloc.  */
3381
3382 static riscv_pcgp_hi_reloc *
3383 riscv_find_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
3384 {
3385   riscv_pcgp_hi_reloc *c;
3386
3387   for (c = p->hi; c != NULL; c = c->next)
3388     if (c->hi_sec_off == hi_sec_off)
3389       return c;
3390   return NULL;
3391 }
3392
3393 /* Record pcgp lo part reloc info in P, using HI_SEC_OFF as the lookup info.
3394    This is used to record relocs that can't be relaxed.  */
3395
3396 static bfd_boolean
3397 riscv_record_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
3398 {
3399   riscv_pcgp_lo_reloc *new = bfd_malloc (sizeof(*new));
3400   if (!new)
3401     return FALSE;
3402   new->hi_sec_off = hi_sec_off;
3403   new->next = p->lo;
3404   p->lo = new;
3405   return TRUE;
3406 }
3407
3408 /* Look up lo part pcgp reloc info in P, using HI_SEC_OFF as the lookup index.
3409    This is used by a hi part reloc to find the corresponding lo part reloc.  */
3410
3411 static bfd_boolean
3412 riscv_find_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
3413 {
3414   riscv_pcgp_lo_reloc *c;
3415
3416   for (c = p->lo; c != NULL; c = c->next)
3417     if (c->hi_sec_off == hi_sec_off)
3418       return TRUE;
3419   return FALSE;
3420 }
3421
3422 typedef bfd_boolean (*relax_func_t) (bfd *, asection *, asection *,
3423                                      struct bfd_link_info *,
3424                                      Elf_Internal_Rela *,
3425                                      bfd_vma, bfd_vma, bfd_vma, bfd_boolean *,
3426                                      riscv_pcgp_relocs *);
3427
3428 /* Relax AUIPC + JALR into JAL.  */
3429
3430 static bfd_boolean
3431 _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec,
3432                        struct bfd_link_info *link_info,
3433                        Elf_Internal_Rela *rel,
3434                        bfd_vma symval,
3435                        bfd_vma max_alignment,
3436                        bfd_vma reserve_size ATTRIBUTE_UNUSED,
3437                        bfd_boolean *again,
3438                        riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
3439 {
3440   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
3441   bfd_signed_vma foff = symval - (sec_addr (sec) + rel->r_offset);
3442   bfd_boolean near_zero = (symval + RISCV_IMM_REACH/2) < RISCV_IMM_REACH;
3443   bfd_vma auipc, jalr;
3444   int rd, r_type, len = 4, rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
3445
3446   /* If the call crosses section boundaries, an alignment directive could
3447      cause the PC-relative offset to later increase.  */
3448   if (VALID_UJTYPE_IMM (foff) && sym_sec->output_section != sec->output_section)
3449     foff += (foff < 0 ? -max_alignment : max_alignment);
3450
3451   /* See if this function call can be shortened.  */
3452   if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero))
3453     return TRUE;
3454
3455   /* Shorten the function call.  */
3456   BFD_ASSERT (rel->r_offset + 8 <= sec->size);
3457
3458   auipc = bfd_get_32 (abfd, contents + rel->r_offset);
3459   jalr = bfd_get_32 (abfd, contents + rel->r_offset + 4);
3460   rd = (jalr >> OP_SH_RD) & OP_MASK_RD;
3461   rvc = rvc && VALID_RVC_J_IMM (foff);
3462
3463   /* C.J exists on RV32 and RV64, but C.JAL is RV32-only.  */
3464   rvc = rvc && (rd == 0 || (rd == X_RA && ARCH_SIZE == 32));
3465
3466   if (rvc)
3467     {
3468       /* Relax to C.J[AL] rd, addr.  */
3469       r_type = R_RISCV_RVC_JUMP;
3470       auipc = rd == 0 ? MATCH_C_J : MATCH_C_JAL;
3471       len = 2;
3472     }
3473   else if (VALID_UJTYPE_IMM (foff))
3474     {
3475       /* Relax to JAL rd, addr.  */
3476       r_type = R_RISCV_JAL;
3477       auipc = MATCH_JAL | (rd << OP_SH_RD);
3478     }
3479   else /* near_zero */
3480     {
3481       /* Relax to JALR rd, x0, addr.  */
3482       r_type = R_RISCV_LO12_I;
3483       auipc = MATCH_JALR | (rd << OP_SH_RD);
3484     }
3485
3486   /* Replace the R_RISCV_CALL reloc.  */
3487   rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), r_type);
3488   /* Replace the AUIPC.  */
3489   bfd_put (8 * len, abfd, auipc, contents + rel->r_offset);
3490
3491   /* Delete unnecessary JALR.  */
3492   *again = TRUE;
3493   return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + len, 8 - len,
3494                                    link_info);
3495 }
3496
3497 /* Traverse all output sections and return the max alignment.  */
3498
3499 static bfd_vma
3500 _bfd_riscv_get_max_alignment (asection *sec)
3501 {
3502   unsigned int max_alignment_power = 0;
3503   asection *o;
3504
3505   for (o = sec->output_section->owner->sections; o != NULL; o = o->next)
3506     {
3507       if (o->alignment_power > max_alignment_power)
3508         max_alignment_power = o->alignment_power;
3509     }
3510
3511   return (bfd_vma) 1 << max_alignment_power;
3512 }
3513
3514 /* Relax non-PIC global variable references.  */
3515
3516 static bfd_boolean
3517 _bfd_riscv_relax_lui (bfd *abfd,
3518                       asection *sec,
3519                       asection *sym_sec,
3520                       struct bfd_link_info *link_info,
3521                       Elf_Internal_Rela *rel,
3522                       bfd_vma symval,
3523                       bfd_vma max_alignment,
3524                       bfd_vma reserve_size,
3525                       bfd_boolean *again,
3526                       riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
3527 {
3528   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
3529   bfd_vma gp = riscv_global_pointer_value (link_info);
3530   int use_rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
3531
3532   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3533
3534   if (gp)
3535     {
3536       /* If gp and the symbol are in the same output section, which is not the
3537          abs section, then consider only that output section's alignment.  */
3538       struct bfd_link_hash_entry *h =
3539         bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE,
3540                               TRUE);
3541       if (h->u.def.section->output_section == sym_sec->output_section
3542           && sym_sec->output_section != bfd_abs_section_ptr)
3543         max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
3544     }
3545
3546   /* Is the reference in range of x0 or gp?
3547      Valid gp range conservatively because of alignment issue.  */
3548   if (VALID_ITYPE_IMM (symval)
3549       || (symval >= gp
3550           && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
3551       || (symval < gp
3552           && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
3553     {
3554       unsigned sym = ELFNN_R_SYM (rel->r_info);
3555       switch (ELFNN_R_TYPE (rel->r_info))
3556         {
3557         case R_RISCV_LO12_I:
3558           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
3559           return TRUE;
3560
3561         case R_RISCV_LO12_S:
3562           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
3563           return TRUE;
3564
3565         case R_RISCV_HI20:
3566           /* We can delete the unnecessary LUI and reloc.  */
3567           rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3568           *again = TRUE;
3569           return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4,
3570                                            link_info);
3571
3572         default:
3573           abort ();
3574         }
3575     }
3576
3577   /* Can we relax LUI to C.LUI?  Alignment might move the section forward;
3578      account for this assuming page alignment at worst. In the presence of 
3579      RELRO segment the linker aligns it by one page size, therefore sections
3580      after the segment can be moved more than one page. */
3581
3582   if (use_rvc
3583       && ELFNN_R_TYPE (rel->r_info) == R_RISCV_HI20
3584       && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval))
3585       && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval)
3586                             + (link_info->relro ? 2 * ELF_MAXPAGESIZE
3587                                : ELF_MAXPAGESIZE)))
3588     {
3589       /* Replace LUI with C.LUI if legal (i.e., rd != x0 and rd != x2/sp).  */
3590       bfd_vma lui = bfd_get_32 (abfd, contents + rel->r_offset);
3591       unsigned rd = ((unsigned)lui >> OP_SH_RD) & OP_MASK_RD;
3592       if (rd == 0 || rd == X_SP)
3593         return TRUE;
3594
3595       lui = (lui & (OP_MASK_RD << OP_SH_RD)) | MATCH_C_LUI;
3596       bfd_put_32 (abfd, lui, contents + rel->r_offset);
3597
3598       /* Replace the R_RISCV_HI20 reloc.  */
3599       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_RVC_LUI);
3600
3601       *again = TRUE;
3602       return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + 2, 2,
3603                                        link_info);
3604     }
3605
3606   return TRUE;
3607 }
3608
3609 /* Relax non-PIC TLS references.  */
3610
3611 static bfd_boolean
3612 _bfd_riscv_relax_tls_le (bfd *abfd,
3613                          asection *sec,
3614                          asection *sym_sec ATTRIBUTE_UNUSED,
3615                          struct bfd_link_info *link_info,
3616                          Elf_Internal_Rela *rel,
3617                          bfd_vma symval,
3618                          bfd_vma max_alignment ATTRIBUTE_UNUSED,
3619                          bfd_vma reserve_size ATTRIBUTE_UNUSED,
3620                          bfd_boolean *again,
3621                          riscv_pcgp_relocs *prcel_relocs ATTRIBUTE_UNUSED)
3622 {
3623   /* See if this symbol is in range of tp.  */
3624   if (RISCV_CONST_HIGH_PART (tpoff (link_info, symval)) != 0)
3625     return TRUE;
3626
3627   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3628   switch (ELFNN_R_TYPE (rel->r_info))
3629     {
3630     case R_RISCV_TPREL_LO12_I:
3631       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_I);
3632       return TRUE;
3633
3634     case R_RISCV_TPREL_LO12_S:
3635       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_S);
3636       return TRUE;
3637
3638     case R_RISCV_TPREL_HI20:
3639     case R_RISCV_TPREL_ADD:
3640       /* We can delete the unnecessary instruction and reloc.  */
3641       rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3642       *again = TRUE;
3643       return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4, link_info);
3644
3645     default:
3646       abort ();
3647     }
3648 }
3649
3650 /* Implement R_RISCV_ALIGN by deleting excess alignment NOPs.  */
3651
3652 static bfd_boolean
3653 _bfd_riscv_relax_align (bfd *abfd, asection *sec,
3654                         asection *sym_sec,
3655                         struct bfd_link_info *link_info,
3656                         Elf_Internal_Rela *rel,
3657                         bfd_vma symval,
3658                         bfd_vma max_alignment ATTRIBUTE_UNUSED,
3659                         bfd_vma reserve_size ATTRIBUTE_UNUSED,
3660                         bfd_boolean *again ATTRIBUTE_UNUSED,
3661                         riscv_pcgp_relocs *pcrel_relocs ATTRIBUTE_UNUSED)
3662 {
3663   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
3664   bfd_vma alignment = 1, pos;
3665   while (alignment <= rel->r_addend)
3666     alignment *= 2;
3667
3668   symval -= rel->r_addend;
3669   bfd_vma aligned_addr = ((symval - 1) & ~(alignment - 1)) + alignment;
3670   bfd_vma nop_bytes = aligned_addr - symval;
3671
3672   /* Once we've handled an R_RISCV_ALIGN, we can't relax anything else.  */
3673   sec->sec_flg0 = TRUE;
3674
3675   /* Make sure there are enough NOPs to actually achieve the alignment.  */
3676   if (rel->r_addend < nop_bytes)
3677     {
3678       _bfd_error_handler
3679         (_("%pB(%pA+%#" PRIx64 "): %" PRId64 " bytes required for alignment "
3680            "to %" PRId64 "-byte boundary, but only %" PRId64 " present"),
3681          abfd, sym_sec, (uint64_t) rel->r_offset,
3682          (int64_t) nop_bytes, (int64_t) alignment, (int64_t) rel->r_addend);
3683       bfd_set_error (bfd_error_bad_value);
3684       return FALSE;
3685     }
3686
3687   /* Delete the reloc.  */
3688   rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3689
3690   /* If the number of NOPs is already correct, there's nothing to do.  */
3691   if (nop_bytes == rel->r_addend)
3692     return TRUE;
3693
3694   /* Write as many RISC-V NOPs as we need.  */
3695   for (pos = 0; pos < (nop_bytes & -4); pos += 4)
3696     bfd_put_32 (abfd, RISCV_NOP, contents + rel->r_offset + pos);
3697
3698   /* Write a final RVC NOP if need be.  */
3699   if (nop_bytes % 4 != 0)
3700     bfd_put_16 (abfd, RVC_NOP, contents + rel->r_offset + pos);
3701
3702   /* Delete the excess bytes.  */
3703   return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + nop_bytes,
3704                                    rel->r_addend - nop_bytes, link_info);
3705 }
3706
3707 /* Relax PC-relative references to GP-relative references.  */
3708
3709 static bfd_boolean
3710 _bfd_riscv_relax_pc  (bfd *abfd ATTRIBUTE_UNUSED,
3711                       asection *sec,
3712                       asection *sym_sec,
3713                       struct bfd_link_info *link_info,
3714                       Elf_Internal_Rela *rel,
3715                       bfd_vma symval,
3716                       bfd_vma max_alignment,
3717                       bfd_vma reserve_size,
3718                       bfd_boolean *again ATTRIBUTE_UNUSED,
3719                       riscv_pcgp_relocs *pcgp_relocs)
3720 {
3721   bfd_vma gp = riscv_global_pointer_value (link_info);
3722
3723   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3724
3725   /* Chain the _LO relocs to their cooresponding _HI reloc to compute the
3726    * actual target address.  */
3727   riscv_pcgp_hi_reloc hi_reloc;
3728   memset (&hi_reloc, 0, sizeof (hi_reloc));
3729   switch (ELFNN_R_TYPE (rel->r_info))
3730     {
3731     case R_RISCV_PCREL_LO12_I:
3732     case R_RISCV_PCREL_LO12_S:
3733       {
3734         /* If the %lo has an addend, it isn't for the label pointing at the
3735            hi part instruction, but rather for the symbol pointed at by the
3736            hi part instruction.  So we must subtract it here for the lookup.
3737            It is still used below in the final symbol address.  */
3738         bfd_vma hi_sec_off = symval - sec_addr (sym_sec) - rel->r_addend;
3739         riscv_pcgp_hi_reloc *hi = riscv_find_pcgp_hi_reloc (pcgp_relocs,
3740                                                             hi_sec_off);
3741         if (hi == NULL)
3742           {
3743             riscv_record_pcgp_lo_reloc (pcgp_relocs, hi_sec_off);
3744             return TRUE;
3745           }
3746
3747         hi_reloc = *hi;
3748         symval = hi_reloc.hi_addr;
3749         sym_sec = hi_reloc.sym_sec;
3750       }
3751       break;
3752
3753     case R_RISCV_PCREL_HI20:
3754       /* Mergeable symbols and code might later move out of range.  */
3755       if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
3756         return TRUE;
3757
3758       /* If the cooresponding lo relocation has already been seen then it's not
3759        * safe to relax this relocation.  */
3760       if (riscv_find_pcgp_lo_reloc (pcgp_relocs, rel->r_offset))
3761         return TRUE;
3762
3763       break;
3764
3765     default:
3766       abort ();
3767     }
3768
3769   if (gp)
3770     {
3771       /* If gp and the symbol are in the same output section, which is not the
3772          abs section, then consider only that output section's alignment.  */
3773       struct bfd_link_hash_entry *h =
3774         bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE,
3775                               TRUE);
3776       if (h->u.def.section->output_section == sym_sec->output_section
3777           && sym_sec->output_section != bfd_abs_section_ptr)
3778         max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
3779     }
3780
3781   /* Is the reference in range of x0 or gp?
3782      Valid gp range conservatively because of alignment issue.  */
3783   if (VALID_ITYPE_IMM (symval)
3784       || (symval >= gp
3785           && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
3786       || (symval < gp
3787           && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
3788     {
3789       unsigned sym = hi_reloc.hi_sym;
3790       switch (ELFNN_R_TYPE (rel->r_info))
3791         {
3792         case R_RISCV_PCREL_LO12_I:
3793           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
3794           rel->r_addend += hi_reloc.hi_addend;
3795           return TRUE;
3796
3797         case R_RISCV_PCREL_LO12_S:
3798           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
3799           rel->r_addend += hi_reloc.hi_addend;
3800           return TRUE;
3801
3802         case R_RISCV_PCREL_HI20:
3803           riscv_record_pcgp_hi_reloc (pcgp_relocs,
3804                                       rel->r_offset,
3805                                       rel->r_addend,
3806                                       symval,
3807                                       ELFNN_R_SYM(rel->r_info),
3808                                       sym_sec);
3809           /* We can delete the unnecessary AUIPC and reloc.  */
3810           rel->r_info = ELFNN_R_INFO (0, R_RISCV_DELETE);
3811           rel->r_addend = 4;
3812           return TRUE;
3813
3814         default:
3815           abort ();
3816         }
3817     }
3818
3819   return TRUE;
3820 }
3821
3822 /* Relax PC-relative references to GP-relative references.  */
3823
3824 static bfd_boolean
3825 _bfd_riscv_relax_delete (bfd *abfd,
3826                          asection *sec,
3827                          asection *sym_sec ATTRIBUTE_UNUSED,
3828                          struct bfd_link_info *link_info,
3829                          Elf_Internal_Rela *rel,
3830                          bfd_vma symval ATTRIBUTE_UNUSED,
3831                          bfd_vma max_alignment ATTRIBUTE_UNUSED,
3832                          bfd_vma reserve_size ATTRIBUTE_UNUSED,
3833                          bfd_boolean *again ATTRIBUTE_UNUSED,
3834                          riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
3835 {
3836   if (!riscv_relax_delete_bytes(abfd, sec, rel->r_offset, rel->r_addend,
3837                                 link_info))
3838     return FALSE;
3839   rel->r_info = ELFNN_R_INFO(0, R_RISCV_NONE);
3840   return TRUE;
3841 }
3842
3843 /* Relax a section.  Pass 0 shortens code sequences unless disabled.  Pass 1
3844    deletes the bytes that pass 0 made obselete.  Pass 2, which cannot be
3845    disabled, handles code alignment directives.  */
3846
3847 static bfd_boolean
3848 _bfd_riscv_relax_section (bfd *abfd, asection *sec,
3849                           struct bfd_link_info *info,
3850                           bfd_boolean *again)
3851 {
3852   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
3853   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
3854   struct bfd_elf_section_data *data = elf_section_data (sec);
3855   Elf_Internal_Rela *relocs;
3856   bfd_boolean ret = FALSE;
3857   unsigned int i;
3858   bfd_vma max_alignment, reserve_size = 0;
3859   riscv_pcgp_relocs pcgp_relocs;
3860
3861   *again = FALSE;
3862
3863   if (bfd_link_relocatable (info)
3864       || sec->sec_flg0
3865       || (sec->flags & SEC_RELOC) == 0
3866       || sec->reloc_count == 0
3867       || (info->disable_target_specific_optimizations
3868           && info->relax_pass == 0))
3869     return TRUE;
3870
3871   riscv_init_pcgp_relocs (&pcgp_relocs);
3872
3873   /* Read this BFD's relocs if we haven't done so already.  */
3874   if (data->relocs)
3875     relocs = data->relocs;
3876   else if (!(relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
3877                                                  info->keep_memory)))
3878     goto fail;
3879
3880   if (htab)
3881     {
3882       max_alignment = htab->max_alignment;
3883       if (max_alignment == (bfd_vma) -1)
3884         {
3885           max_alignment = _bfd_riscv_get_max_alignment (sec);
3886           htab->max_alignment = max_alignment;
3887         }
3888     }
3889   else
3890     max_alignment = _bfd_riscv_get_max_alignment (sec);
3891
3892   /* Examine and consider relaxing each reloc.  */
3893   for (i = 0; i < sec->reloc_count; i++)
3894     {
3895       asection *sym_sec;
3896       Elf_Internal_Rela *rel = relocs + i;
3897       relax_func_t relax_func;
3898       int type = ELFNN_R_TYPE (rel->r_info);
3899       bfd_vma symval;
3900       char symtype;
3901
3902       relax_func = NULL;
3903       if (info->relax_pass == 0)
3904         {
3905           if (type == R_RISCV_CALL || type == R_RISCV_CALL_PLT)
3906             relax_func = _bfd_riscv_relax_call;
3907           else if (type == R_RISCV_HI20
3908                    || type == R_RISCV_LO12_I
3909                    || type == R_RISCV_LO12_S)
3910             relax_func = _bfd_riscv_relax_lui;
3911           else if (!bfd_link_pic(info)
3912                    && (type == R_RISCV_PCREL_HI20
3913                    || type == R_RISCV_PCREL_LO12_I
3914                    || type == R_RISCV_PCREL_LO12_S))
3915             relax_func = _bfd_riscv_relax_pc;
3916           else if (type == R_RISCV_TPREL_HI20
3917                    || type == R_RISCV_TPREL_ADD
3918                    || type == R_RISCV_TPREL_LO12_I
3919                    || type == R_RISCV_TPREL_LO12_S)
3920             relax_func = _bfd_riscv_relax_tls_le;
3921           else
3922             continue;
3923
3924           /* Only relax this reloc if it is paired with R_RISCV_RELAX.  */
3925           if (i == sec->reloc_count - 1
3926               || ELFNN_R_TYPE ((rel + 1)->r_info) != R_RISCV_RELAX
3927               || rel->r_offset != (rel + 1)->r_offset)
3928             continue;
3929
3930           /* Skip over the R_RISCV_RELAX.  */
3931           i++;
3932         }
3933       else if (info->relax_pass == 1 && type == R_RISCV_DELETE)
3934         relax_func = _bfd_riscv_relax_delete;
3935       else if (info->relax_pass == 2 && type == R_RISCV_ALIGN)
3936         relax_func = _bfd_riscv_relax_align;
3937       else
3938         continue;
3939
3940       data->relocs = relocs;
3941
3942       /* Read this BFD's contents if we haven't done so already.  */
3943       if (!data->this_hdr.contents
3944           && !bfd_malloc_and_get_section (abfd, sec, &data->this_hdr.contents))
3945         goto fail;
3946
3947       /* Read this BFD's symbols if we haven't done so already.  */
3948       if (symtab_hdr->sh_info != 0
3949           && !symtab_hdr->contents
3950           && !(symtab_hdr->contents =
3951                (unsigned char *) bfd_elf_get_elf_syms (abfd, symtab_hdr,
3952                                                        symtab_hdr->sh_info,
3953                                                        0, NULL, NULL, NULL)))
3954         goto fail;
3955
3956       /* Get the value of the symbol referred to by the reloc.  */
3957       if (ELFNN_R_SYM (rel->r_info) < symtab_hdr->sh_info)
3958         {
3959           /* A local symbol.  */
3960           Elf_Internal_Sym *isym = ((Elf_Internal_Sym *) symtab_hdr->contents
3961                                     + ELFNN_R_SYM (rel->r_info));
3962           reserve_size = (isym->st_size - rel->r_addend) > isym->st_size
3963             ? 0 : isym->st_size - rel->r_addend;
3964
3965           if (isym->st_shndx == SHN_UNDEF)
3966             sym_sec = sec, symval = rel->r_offset;
3967           else
3968             {
3969               BFD_ASSERT (isym->st_shndx < elf_numsections (abfd));
3970               sym_sec = elf_elfsections (abfd)[isym->st_shndx]->bfd_section;
3971 #if 0
3972               /* The purpose of this code is unknown.  It breaks linker scripts
3973                  for embedded development that place sections at address zero.
3974                  This code is believed to be unnecessary.  Disabling it but not
3975                  yet removing it, in case something breaks.  */
3976               if (sec_addr (sym_sec) == 0)
3977                 continue;
3978 #endif
3979               symval = isym->st_value;
3980             }
3981           symtype = ELF_ST_TYPE (isym->st_info);
3982         }
3983       else
3984         {
3985           unsigned long indx;
3986           struct elf_link_hash_entry *h;
3987
3988           indx = ELFNN_R_SYM (rel->r_info) - symtab_hdr->sh_info;
3989           h = elf_sym_hashes (abfd)[indx];
3990
3991           while (h->root.type == bfd_link_hash_indirect
3992                  || h->root.type == bfd_link_hash_warning)
3993             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3994
3995           if (h->plt.offset != MINUS_ONE)
3996             {
3997               sym_sec = htab->elf.splt;
3998               symval = h->plt.offset;
3999             }
4000           else if (h->root.u.def.section->output_section == NULL
4001                    || (h->root.type != bfd_link_hash_defined
4002                        && h->root.type != bfd_link_hash_defweak))
4003             continue;
4004           else
4005             {
4006               symval = h->root.u.def.value;
4007               sym_sec = h->root.u.def.section;
4008             }
4009
4010           if (h->type != STT_FUNC)
4011             reserve_size =
4012               (h->size - rel->r_addend) > h->size ? 0 : h->size - rel->r_addend;
4013           symtype = h->type;
4014         }
4015
4016       if (sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE
4017           && (sym_sec->flags & SEC_MERGE))
4018         {
4019           /* At this stage in linking, no SEC_MERGE symbol has been
4020              adjusted, so all references to such symbols need to be
4021              passed through _bfd_merged_section_offset.  (Later, in
4022              relocate_section, all SEC_MERGE symbols *except* for
4023              section symbols have been adjusted.)
4024
4025              gas may reduce relocations against symbols in SEC_MERGE
4026              sections to a relocation against the section symbol when
4027              the original addend was zero.  When the reloc is against
4028              a section symbol we should include the addend in the
4029              offset passed to _bfd_merged_section_offset, since the
4030              location of interest is the original symbol.  On the
4031              other hand, an access to "sym+addend" where "sym" is not
4032              a section symbol should not include the addend;  Such an
4033              access is presumed to be an offset from "sym";  The
4034              location of interest is just "sym".  */
4035            if (symtype == STT_SECTION)
4036              symval += rel->r_addend;
4037
4038            symval = _bfd_merged_section_offset (abfd, &sym_sec,
4039                                                 elf_section_data (sym_sec)->sec_info,
4040                                                 symval);
4041
4042            if (symtype != STT_SECTION)
4043              symval += rel->r_addend;
4044         }
4045       else
4046         symval += rel->r_addend;
4047
4048       symval += sec_addr (sym_sec);
4049
4050       if (!relax_func (abfd, sec, sym_sec, info, rel, symval,
4051                        max_alignment, reserve_size, again,
4052                        &pcgp_relocs))
4053         goto fail;
4054     }
4055
4056   ret = TRUE;
4057
4058 fail:
4059   if (relocs != data->relocs)
4060     free (relocs);
4061   riscv_free_pcgp_relocs(&pcgp_relocs, abfd, sec);
4062
4063   return ret;
4064 }
4065
4066 #if ARCH_SIZE == 32
4067 # define PRSTATUS_SIZE                  204
4068 # define PRSTATUS_OFFSET_PR_CURSIG      12
4069 # define PRSTATUS_OFFSET_PR_PID         24
4070 # define PRSTATUS_OFFSET_PR_REG         72
4071 # define ELF_GREGSET_T_SIZE             128
4072 # define PRPSINFO_SIZE                  128
4073 # define PRPSINFO_OFFSET_PR_PID         16
4074 # define PRPSINFO_OFFSET_PR_FNAME       32
4075 # define PRPSINFO_OFFSET_PR_PSARGS      48
4076 #else
4077 # define PRSTATUS_SIZE                  376
4078 # define PRSTATUS_OFFSET_PR_CURSIG      12
4079 # define PRSTATUS_OFFSET_PR_PID         32
4080 # define PRSTATUS_OFFSET_PR_REG         112
4081 # define ELF_GREGSET_T_SIZE             256
4082 # define PRPSINFO_SIZE                  136
4083 # define PRPSINFO_OFFSET_PR_PID         24
4084 # define PRPSINFO_OFFSET_PR_FNAME       40
4085 # define PRPSINFO_OFFSET_PR_PSARGS      56
4086 #endif
4087
4088 /* Support for core dump NOTE sections.  */
4089
4090 static bfd_boolean
4091 riscv_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
4092 {
4093   switch (note->descsz)
4094     {
4095       default:
4096         return FALSE;
4097
4098       case PRSTATUS_SIZE:  /* sizeof(struct elf_prstatus) on Linux/RISC-V.  */
4099         /* pr_cursig */
4100         elf_tdata (abfd)->core->signal
4101           = bfd_get_16 (abfd, note->descdata + PRSTATUS_OFFSET_PR_CURSIG);
4102
4103         /* pr_pid */
4104         elf_tdata (abfd)->core->lwpid
4105           = bfd_get_32 (abfd, note->descdata + PRSTATUS_OFFSET_PR_PID);
4106         break;
4107     }
4108
4109   /* Make a ".reg/999" section.  */
4110   return _bfd_elfcore_make_pseudosection (abfd, ".reg", ELF_GREGSET_T_SIZE,
4111                                           note->descpos + PRSTATUS_OFFSET_PR_REG);
4112 }
4113
4114 static bfd_boolean
4115 riscv_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
4116 {
4117   switch (note->descsz)
4118     {
4119       default:
4120         return FALSE;
4121
4122       case PRPSINFO_SIZE: /* sizeof(struct elf_prpsinfo) on Linux/RISC-V.  */
4123         /* pr_pid */
4124         elf_tdata (abfd)->core->pid
4125           = bfd_get_32 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PID);
4126
4127         /* pr_fname */
4128         elf_tdata (abfd)->core->program = _bfd_elfcore_strndup
4129           (abfd, note->descdata + PRPSINFO_OFFSET_PR_FNAME, 16);
4130
4131         /* pr_psargs */
4132         elf_tdata (abfd)->core->command = _bfd_elfcore_strndup
4133           (abfd, note->descdata + PRPSINFO_OFFSET_PR_PSARGS, 80);
4134         break;
4135     }
4136
4137   /* Note that for some reason, a spurious space is tacked
4138      onto the end of the args in some (at least one anyway)
4139      implementations, so strip it off if it exists.  */
4140
4141   {
4142     char *command = elf_tdata (abfd)->core->command;
4143     int n = strlen (command);
4144
4145     if (0 < n && command[n - 1] == ' ')
4146       command[n - 1] = '\0';
4147   }
4148
4149   return TRUE;
4150 }
4151
4152 /* Set the right mach type.  */
4153 static bfd_boolean
4154 riscv_elf_object_p (bfd *abfd)
4155 {
4156   /* There are only two mach types in RISCV currently.  */
4157   if (strcmp (abfd->xvec->name, "elf32-littleriscv") == 0)
4158     bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv32);
4159   else
4160     bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv64);
4161
4162   return TRUE;
4163 }
4164
4165 /* Determine whether an object attribute tag takes an integer, a
4166    string or both.  */
4167
4168 static int
4169 riscv_elf_obj_attrs_arg_type (int tag)
4170 {
4171   return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL;
4172 }
4173
4174 #define TARGET_LITTLE_SYM               riscv_elfNN_vec
4175 #define TARGET_LITTLE_NAME              "elfNN-littleriscv"
4176
4177 #define elf_backend_reloc_type_class         riscv_reloc_type_class
4178
4179 #define bfd_elfNN_bfd_reloc_name_lookup      riscv_reloc_name_lookup
4180 #define bfd_elfNN_bfd_link_hash_table_create riscv_elf_link_hash_table_create
4181 #define bfd_elfNN_bfd_reloc_type_lookup      riscv_reloc_type_lookup
4182 #define bfd_elfNN_bfd_merge_private_bfd_data \
4183   _bfd_riscv_elf_merge_private_bfd_data
4184
4185 #define elf_backend_copy_indirect_symbol     riscv_elf_copy_indirect_symbol
4186 #define elf_backend_create_dynamic_sections  riscv_elf_create_dynamic_sections
4187 #define elf_backend_check_relocs             riscv_elf_check_relocs
4188 #define elf_backend_adjust_dynamic_symbol    riscv_elf_adjust_dynamic_symbol
4189 #define elf_backend_size_dynamic_sections    riscv_elf_size_dynamic_sections
4190 #define elf_backend_relocate_section         riscv_elf_relocate_section
4191 #define elf_backend_finish_dynamic_symbol    riscv_elf_finish_dynamic_symbol
4192 #define elf_backend_finish_dynamic_sections  riscv_elf_finish_dynamic_sections
4193 #define elf_backend_gc_mark_hook             riscv_elf_gc_mark_hook
4194 #define elf_backend_plt_sym_val              riscv_elf_plt_sym_val
4195 #define elf_backend_grok_prstatus            riscv_elf_grok_prstatus
4196 #define elf_backend_grok_psinfo              riscv_elf_grok_psinfo
4197 #define elf_backend_object_p                 riscv_elf_object_p
4198 #define elf_info_to_howto_rel                NULL
4199 #define elf_info_to_howto                    riscv_info_to_howto_rela
4200 #define bfd_elfNN_bfd_relax_section          _bfd_riscv_relax_section
4201
4202 #define elf_backend_init_index_section       _bfd_elf_init_1_index_section
4203
4204 #define elf_backend_can_gc_sections     1
4205 #define elf_backend_can_refcount        1
4206 #define elf_backend_want_got_plt        1
4207 #define elf_backend_plt_readonly        1
4208 #define elf_backend_plt_alignment       4
4209 #define elf_backend_want_plt_sym        1
4210 #define elf_backend_got_header_size     (ARCH_SIZE / 8)
4211 #define elf_backend_want_dynrelro       1
4212 #define elf_backend_rela_normal         1
4213 #define elf_backend_default_execstack   0
4214
4215 #undef  elf_backend_obj_attrs_vendor
4216 #define elf_backend_obj_attrs_vendor            "riscv"
4217 #undef  elf_backend_obj_attrs_arg_type
4218 #define elf_backend_obj_attrs_arg_type          riscv_elf_obj_attrs_arg_type
4219 #undef  elf_backend_obj_attrs_section_type
4220 #define elf_backend_obj_attrs_section_type      SHT_RISCV_ATTRIBUTES
4221 #undef  elf_backend_obj_attrs_section
4222 #define elf_backend_obj_attrs_section           ".riscv.attributes"
4223
4224 #include "elfNN-target.h"