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