RISC-V: Fix TLS copy relocs
[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 long 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_record_pcrel_hi_reloc (riscv_pcrel_relocs *p, bfd_vma addr, bfd_vma value)
1655 {
1656   riscv_pcrel_hi_reloc entry = {addr, value - addr};
1657   riscv_pcrel_hi_reloc **slot =
1658     (riscv_pcrel_hi_reloc **) htab_find_slot (p->hi_relocs, &entry, INSERT);
1659
1660   BFD_ASSERT (*slot == NULL);
1661   *slot = (riscv_pcrel_hi_reloc *) bfd_malloc (sizeof (riscv_pcrel_hi_reloc));
1662   if (*slot == NULL)
1663     return FALSE;
1664   **slot = entry;
1665   return TRUE;
1666 }
1667
1668 static bfd_boolean
1669 riscv_record_pcrel_lo_reloc (riscv_pcrel_relocs *p,
1670                              asection *input_section,
1671                              struct bfd_link_info *info,
1672                              reloc_howto_type *howto,
1673                              const Elf_Internal_Rela *reloc,
1674                              bfd_vma addr,
1675                              const char *name,
1676                              bfd_byte *contents)
1677 {
1678   riscv_pcrel_lo_reloc *entry;
1679   entry = (riscv_pcrel_lo_reloc *) bfd_malloc (sizeof (riscv_pcrel_lo_reloc));
1680   if (entry == NULL)
1681     return FALSE;
1682   *entry = (riscv_pcrel_lo_reloc) {input_section, info, howto, reloc, addr,
1683                                    name, contents, p->lo_relocs};
1684   p->lo_relocs = entry;
1685   return TRUE;
1686 }
1687
1688 static bfd_boolean
1689 riscv_resolve_pcrel_lo_relocs (riscv_pcrel_relocs *p)
1690 {
1691   riscv_pcrel_lo_reloc *r;
1692
1693   for (r = p->lo_relocs; r != NULL; r = r->next)
1694     {
1695       bfd *input_bfd = r->input_section->owner;
1696
1697       riscv_pcrel_hi_reloc search = {r->addr, 0};
1698       riscv_pcrel_hi_reloc *entry = htab_find (p->hi_relocs, &search);
1699       if (entry == NULL)
1700         {
1701           ((*r->info->callbacks->reloc_overflow)
1702            (r->info, NULL, r->name, r->howto->name, (bfd_vma) 0,
1703             input_bfd, r->input_section, r->reloc->r_offset));
1704           return TRUE;
1705         }
1706
1707       perform_relocation (r->howto, r->reloc, entry->value, r->input_section,
1708                           input_bfd, r->contents);
1709     }
1710
1711   return TRUE;
1712 }
1713
1714 /* Relocate a RISC-V ELF section.
1715
1716    The RELOCATE_SECTION function is called by the new ELF backend linker
1717    to handle the relocations for a section.
1718
1719    The relocs are always passed as Rela structures.
1720
1721    This function is responsible for adjusting the section contents as
1722    necessary, and (if generating a relocatable output file) adjusting
1723    the reloc addend as necessary.
1724
1725    This function does not have to worry about setting the reloc
1726    address or the reloc symbol index.
1727
1728    LOCAL_SYMS is a pointer to the swapped in local symbols.
1729
1730    LOCAL_SECTIONS is an array giving the section in the input file
1731    corresponding to the st_shndx field of each local symbol.
1732
1733    The global hash table entry for the global symbols can be found
1734    via elf_sym_hashes (input_bfd).
1735
1736    When generating relocatable output, this function must handle
1737    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1738    going to be the section symbol corresponding to the output
1739    section, which means that the addend must be adjusted
1740    accordingly.  */
1741
1742 static bfd_boolean
1743 riscv_elf_relocate_section (bfd *output_bfd,
1744                             struct bfd_link_info *info,
1745                             bfd *input_bfd,
1746                             asection *input_section,
1747                             bfd_byte *contents,
1748                             Elf_Internal_Rela *relocs,
1749                             Elf_Internal_Sym *local_syms,
1750                             asection **local_sections)
1751 {
1752   Elf_Internal_Rela *rel;
1753   Elf_Internal_Rela *relend;
1754   riscv_pcrel_relocs pcrel_relocs;
1755   bfd_boolean ret = FALSE;
1756   asection *sreloc = elf_section_data (input_section)->sreloc;
1757   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
1758   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_bfd);
1759   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
1760   bfd_vma *local_got_offsets = elf_local_got_offsets (input_bfd);
1761
1762   if (!riscv_init_pcrel_relocs (&pcrel_relocs))
1763     return FALSE;
1764
1765   relend = relocs + input_section->reloc_count;
1766   for (rel = relocs; rel < relend; rel++)
1767     {
1768       unsigned long r_symndx;
1769       struct elf_link_hash_entry *h;
1770       Elf_Internal_Sym *sym;
1771       asection *sec;
1772       bfd_vma relocation;
1773       bfd_reloc_status_type r = bfd_reloc_ok;
1774       const char *name;
1775       bfd_vma off, ie_off;
1776       bfd_boolean unresolved_reloc, is_ie = FALSE;
1777       bfd_vma pc = sec_addr (input_section) + rel->r_offset;
1778       int r_type = ELFNN_R_TYPE (rel->r_info), tls_type;
1779       reloc_howto_type *howto = riscv_elf_rtype_to_howto (r_type);
1780       const char *msg = NULL;
1781
1782       if (r_type == R_RISCV_GNU_VTINHERIT || r_type == R_RISCV_GNU_VTENTRY)
1783         continue;
1784
1785       /* This is a final link.  */
1786       r_symndx = ELFNN_R_SYM (rel->r_info);
1787       h = NULL;
1788       sym = NULL;
1789       sec = NULL;
1790       unresolved_reloc = FALSE;
1791       if (r_symndx < symtab_hdr->sh_info)
1792         {
1793           sym = local_syms + r_symndx;
1794           sec = local_sections[r_symndx];
1795           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1796         }
1797       else
1798         {
1799           bfd_boolean warned, ignored;
1800
1801           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1802                                    r_symndx, symtab_hdr, sym_hashes,
1803                                    h, sec, relocation,
1804                                    unresolved_reloc, warned, ignored);
1805           if (warned)
1806             {
1807               /* To avoid generating warning messages about truncated
1808                  relocations, set the relocation's address to be the same as
1809                  the start of this section.  */
1810               if (input_section->output_section != NULL)
1811                 relocation = input_section->output_section->vma;
1812               else
1813                 relocation = 0;
1814             }
1815         }
1816
1817       if (sec != NULL && discarded_section (sec))
1818         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1819                                          rel, 1, relend, howto, 0, contents);
1820
1821       if (bfd_link_relocatable (info))
1822         continue;
1823
1824       if (h != NULL)
1825         name = h->root.root.string;
1826       else
1827         {
1828           name = (bfd_elf_string_from_elf_section
1829                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
1830           if (name == NULL || *name == '\0')
1831             name = bfd_section_name (input_bfd, sec);
1832         }
1833
1834       switch (r_type)
1835         {
1836         case R_RISCV_NONE:
1837         case R_RISCV_RELAX:
1838         case R_RISCV_TPREL_ADD:
1839         case R_RISCV_COPY:
1840         case R_RISCV_JUMP_SLOT:
1841         case R_RISCV_RELATIVE:
1842           /* These require nothing of us at all.  */
1843           continue;
1844
1845         case R_RISCV_HI20:
1846         case R_RISCV_BRANCH:
1847         case R_RISCV_RVC_BRANCH:
1848         case R_RISCV_RVC_LUI:
1849         case R_RISCV_LO12_I:
1850         case R_RISCV_LO12_S:
1851         case R_RISCV_SET6:
1852         case R_RISCV_SET8:
1853         case R_RISCV_SET16:
1854         case R_RISCV_SET32:
1855         case R_RISCV_32_PCREL:
1856           /* These require no special handling beyond perform_relocation.  */
1857           break;
1858
1859         case R_RISCV_GOT_HI20:
1860           if (h != NULL)
1861             {
1862               bfd_boolean dyn, pic;
1863
1864               off = h->got.offset;
1865               BFD_ASSERT (off != (bfd_vma) -1);
1866               dyn = elf_hash_table (info)->dynamic_sections_created;
1867               pic = bfd_link_pic (info);
1868
1869               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
1870                   || (pic && SYMBOL_REFERENCES_LOCAL (info, h)))
1871                 {
1872                   /* This is actually a static link, or it is a
1873                      -Bsymbolic link and the symbol is defined
1874                      locally, or the symbol was forced to be local
1875                      because of a version file.  We must initialize
1876                      this entry in the global offset table.  Since the
1877                      offset must always be a multiple of the word size,
1878                      we use the least significant bit to record whether
1879                      we have initialized it already.
1880
1881                      When doing a dynamic link, we create a .rela.got
1882                      relocation entry to initialize the value.  This
1883                      is done in the finish_dynamic_symbol routine.  */
1884                   if ((off & 1) != 0)
1885                     off &= ~1;
1886                   else
1887                     {
1888                       bfd_put_NN (output_bfd, relocation,
1889                                   htab->elf.sgot->contents + off);
1890                       h->got.offset |= 1;
1891                     }
1892                 }
1893               else
1894                 unresolved_reloc = FALSE;
1895             }
1896           else
1897             {
1898               BFD_ASSERT (local_got_offsets != NULL
1899                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
1900
1901               off = local_got_offsets[r_symndx];
1902
1903               /* The offset must always be a multiple of the word size.
1904                  So, we can use the least significant bit to record
1905                  whether we have already processed this entry.  */
1906               if ((off & 1) != 0)
1907                 off &= ~1;
1908               else
1909                 {
1910                   if (bfd_link_pic (info))
1911                     {
1912                       asection *s;
1913                       Elf_Internal_Rela outrel;
1914
1915                       /* We need to generate a R_RISCV_RELATIVE reloc
1916                          for the dynamic linker.  */
1917                       s = htab->elf.srelgot;
1918                       BFD_ASSERT (s != NULL);
1919
1920                       outrel.r_offset = sec_addr (htab->elf.sgot) + off;
1921                       outrel.r_info =
1922                         ELFNN_R_INFO (0, R_RISCV_RELATIVE);
1923                       outrel.r_addend = relocation;
1924                       relocation = 0;
1925                       riscv_elf_append_rela (output_bfd, s, &outrel);
1926                     }
1927
1928                   bfd_put_NN (output_bfd, relocation,
1929                               htab->elf.sgot->contents + off);
1930                   local_got_offsets[r_symndx] |= 1;
1931                 }
1932             }
1933           relocation = sec_addr (htab->elf.sgot) + off;
1934           if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc, relocation))
1935             r = bfd_reloc_overflow;
1936           break;
1937
1938         case R_RISCV_ADD8:
1939         case R_RISCV_ADD16:
1940         case R_RISCV_ADD32:
1941         case R_RISCV_ADD64:
1942           {
1943             bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1944                                          contents + rel->r_offset);
1945             relocation = old_value + relocation;
1946           }
1947           break;
1948
1949         case R_RISCV_SUB6:
1950         case R_RISCV_SUB8:
1951         case R_RISCV_SUB16:
1952         case R_RISCV_SUB32:
1953         case R_RISCV_SUB64:
1954           {
1955             bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1956                                          contents + rel->r_offset);
1957             relocation = old_value - relocation;
1958           }
1959           break;
1960
1961         case R_RISCV_CALL_PLT:
1962         case R_RISCV_CALL:
1963         case R_RISCV_JAL:
1964         case R_RISCV_RVC_JUMP:
1965           if (bfd_link_pic (info) && h != NULL && h->plt.offset != MINUS_ONE)
1966             {
1967               /* Refer to the PLT entry.  */
1968               relocation = sec_addr (htab->elf.splt) + h->plt.offset;
1969               unresolved_reloc = FALSE;
1970             }
1971           break;
1972
1973         case R_RISCV_TPREL_HI20:
1974           relocation = tpoff (info, relocation);
1975           break;
1976
1977         case R_RISCV_TPREL_LO12_I:
1978         case R_RISCV_TPREL_LO12_S:
1979           relocation = tpoff (info, relocation);
1980           break;
1981
1982         case R_RISCV_TPREL_I:
1983         case R_RISCV_TPREL_S:
1984           relocation = tpoff (info, relocation);
1985           if (VALID_ITYPE_IMM (relocation + rel->r_addend))
1986             {
1987               /* We can use tp as the base register.  */
1988               bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
1989               insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1990               insn |= X_TP << OP_SH_RS1;
1991               bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
1992             }
1993           else
1994             r = bfd_reloc_overflow;
1995           break;
1996
1997         case R_RISCV_GPREL_I:
1998         case R_RISCV_GPREL_S:
1999           {
2000             bfd_vma gp = riscv_global_pointer_value (info);
2001             bfd_boolean x0_base = VALID_ITYPE_IMM (relocation + rel->r_addend);
2002             if (x0_base || VALID_ITYPE_IMM (relocation + rel->r_addend - gp))
2003               {
2004                 /* We can use x0 or gp as the base register.  */
2005                 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2006                 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
2007                 if (!x0_base)
2008                   {
2009                     rel->r_addend -= gp;
2010                     insn |= X_GP << OP_SH_RS1;
2011                   }
2012                 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
2013               }
2014             else
2015               r = bfd_reloc_overflow;
2016             break;
2017           }
2018
2019         case R_RISCV_PCREL_HI20:
2020           if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2021                                             relocation + rel->r_addend))
2022             r = bfd_reloc_overflow;
2023           break;
2024
2025         case R_RISCV_PCREL_LO12_I:
2026         case R_RISCV_PCREL_LO12_S:
2027           if (riscv_record_pcrel_lo_reloc (&pcrel_relocs, input_section, info,
2028                                            howto, rel, relocation, name,
2029                                            contents))
2030             continue;
2031           r = bfd_reloc_overflow;
2032           break;
2033
2034         case R_RISCV_TLS_DTPREL32:
2035         case R_RISCV_TLS_DTPREL64:
2036           relocation = dtpoff (info, relocation);
2037           break;
2038
2039         case R_RISCV_32:
2040         case R_RISCV_64:
2041           if ((input_section->flags & SEC_ALLOC) == 0)
2042             break;
2043
2044           if ((bfd_link_pic (info)
2045                && (h == NULL
2046                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2047                    || h->root.type != bfd_link_hash_undefweak)
2048                && (! howto->pc_relative
2049                    || !SYMBOL_CALLS_LOCAL (info, h)))
2050               || (!bfd_link_pic (info)
2051                   && h != NULL
2052                   && h->dynindx != -1
2053                   && !h->non_got_ref
2054                   && ((h->def_dynamic
2055                        && !h->def_regular)
2056                       || h->root.type == bfd_link_hash_undefweak
2057                       || h->root.type == bfd_link_hash_undefined)))
2058             {
2059               Elf_Internal_Rela outrel;
2060               bfd_boolean skip_static_relocation, skip_dynamic_relocation;
2061
2062               /* When generating a shared object, these relocations
2063                  are copied into the output file to be resolved at run
2064                  time.  */
2065
2066               outrel.r_offset =
2067                 _bfd_elf_section_offset (output_bfd, info, input_section,
2068                                          rel->r_offset);
2069               skip_static_relocation = outrel.r_offset != (bfd_vma) -2;
2070               skip_dynamic_relocation = outrel.r_offset >= (bfd_vma) -2;
2071               outrel.r_offset += sec_addr (input_section);
2072
2073               if (skip_dynamic_relocation)
2074                 memset (&outrel, 0, sizeof outrel);
2075               else if (h != NULL && h->dynindx != -1
2076                        && !(bfd_link_pic (info)
2077                             && SYMBOLIC_BIND (info, h)
2078                             && h->def_regular))
2079                 {
2080                   outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
2081                   outrel.r_addend = rel->r_addend;
2082                 }
2083               else
2084                 {
2085                   outrel.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2086                   outrel.r_addend = relocation + rel->r_addend;
2087                 }
2088
2089               riscv_elf_append_rela (output_bfd, sreloc, &outrel);
2090               if (skip_static_relocation)
2091                 continue;
2092             }
2093           break;
2094
2095         case R_RISCV_TLS_GOT_HI20:
2096           is_ie = TRUE;
2097           /* Fall through.  */
2098
2099         case R_RISCV_TLS_GD_HI20:
2100           if (h != NULL)
2101             {
2102               off = h->got.offset;
2103               h->got.offset |= 1;
2104             }
2105           else
2106             {
2107               off = local_got_offsets[r_symndx];
2108               local_got_offsets[r_symndx] |= 1;
2109             }
2110
2111           tls_type = _bfd_riscv_elf_tls_type (input_bfd, h, r_symndx);
2112           BFD_ASSERT (tls_type & (GOT_TLS_IE | GOT_TLS_GD));
2113           /* If this symbol is referenced by both GD and IE TLS, the IE
2114              reference's GOT slot follows the GD reference's slots.  */
2115           ie_off = 0;
2116           if ((tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_IE))
2117             ie_off = 2 * GOT_ENTRY_SIZE;
2118
2119           if ((off & 1) != 0)
2120             off &= ~1;
2121           else
2122             {
2123               Elf_Internal_Rela outrel;
2124               int indx = 0;
2125               bfd_boolean need_relocs = FALSE;
2126
2127               if (htab->elf.srelgot == NULL)
2128                 abort ();
2129
2130               if (h != NULL)
2131                 {
2132                   bfd_boolean dyn, pic;
2133                   dyn = htab->elf.dynamic_sections_created;
2134                   pic = bfd_link_pic (info);
2135
2136                   if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
2137                       && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
2138                     indx = h->dynindx;
2139                 }
2140
2141               /* The GOT entries have not been initialized yet.  Do it
2142                  now, and emit any relocations.  */
2143               if ((bfd_link_pic (info) || indx != 0)
2144                   && (h == NULL
2145                       || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2146                       || h->root.type != bfd_link_hash_undefweak))
2147                     need_relocs = TRUE;
2148
2149               if (tls_type & GOT_TLS_GD)
2150                 {
2151                   if (need_relocs)
2152                     {
2153                       outrel.r_offset = sec_addr (htab->elf.sgot) + off;
2154                       outrel.r_addend = 0;
2155                       outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPMODNN);
2156                       bfd_put_NN (output_bfd, 0,
2157                                   htab->elf.sgot->contents + off);
2158                       riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2159                       if (indx == 0)
2160                         {
2161                           BFD_ASSERT (! unresolved_reloc);
2162                           bfd_put_NN (output_bfd,
2163                                       dtpoff (info, relocation),
2164                                       (htab->elf.sgot->contents + off +
2165                                        RISCV_ELF_WORD_BYTES));
2166                         }
2167                       else
2168                         {
2169                           bfd_put_NN (output_bfd, 0,
2170                                       (htab->elf.sgot->contents + off +
2171                                        RISCV_ELF_WORD_BYTES));
2172                           outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPRELNN);
2173                           outrel.r_offset += RISCV_ELF_WORD_BYTES;
2174                           riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2175                         }
2176                     }
2177                   else
2178                     {
2179                       /* If we are not emitting relocations for a
2180                          general dynamic reference, then we must be in a
2181                          static link or an executable link with the
2182                          symbol binding locally.  Mark it as belonging
2183                          to module 1, the executable.  */
2184                       bfd_put_NN (output_bfd, 1,
2185                                   htab->elf.sgot->contents + off);
2186                       bfd_put_NN (output_bfd,
2187                                   dtpoff (info, relocation),
2188                                   (htab->elf.sgot->contents + off +
2189                                    RISCV_ELF_WORD_BYTES));
2190                    }
2191                 }
2192
2193               if (tls_type & GOT_TLS_IE)
2194                 {
2195                   if (need_relocs)
2196                     {
2197                       bfd_put_NN (output_bfd, 0,
2198                                   htab->elf.sgot->contents + off + ie_off);
2199                       outrel.r_offset = sec_addr (htab->elf.sgot)
2200                                        + off + ie_off;
2201                       outrel.r_addend = 0;
2202                       if (indx == 0)
2203                         outrel.r_addend = tpoff (info, relocation);
2204                       outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_TPRELNN);
2205                       riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2206                     }
2207                   else
2208                     {
2209                       bfd_put_NN (output_bfd, tpoff (info, relocation),
2210                                   htab->elf.sgot->contents + off + ie_off);
2211                     }
2212                 }
2213             }
2214
2215           BFD_ASSERT (off < (bfd_vma) -2);
2216           relocation = sec_addr (htab->elf.sgot) + off + (is_ie ? ie_off : 0);
2217           if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc, relocation))
2218             r = bfd_reloc_overflow;
2219           unresolved_reloc = FALSE;
2220           break;
2221
2222         default:
2223           r = bfd_reloc_notsupported;
2224         }
2225
2226       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2227          because such sections are not SEC_ALLOC and thus ld.so will
2228          not process them.  */
2229       if (unresolved_reloc
2230           && !((input_section->flags & SEC_DEBUGGING) != 0
2231                && h->def_dynamic)
2232           && _bfd_elf_section_offset (output_bfd, info, input_section,
2233                                       rel->r_offset) != (bfd_vma) -1)
2234         {
2235           (*_bfd_error_handler)
2236             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
2237              input_bfd,
2238              input_section,
2239              (long) rel->r_offset,
2240              howto->name,
2241              h->root.root.string);
2242           continue;
2243         }
2244
2245       if (r == bfd_reloc_ok)
2246         r = perform_relocation (howto, rel, relocation, input_section,
2247                                 input_bfd, contents);
2248
2249       switch (r)
2250         {
2251         case bfd_reloc_ok:
2252           continue;
2253
2254         case bfd_reloc_overflow:
2255           info->callbacks->reloc_overflow
2256             (info, (h ? &h->root : NULL), name, howto->name,
2257              (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
2258           break;
2259
2260         case bfd_reloc_undefined:
2261           info->callbacks->undefined_symbol
2262             (info, name, input_bfd, input_section, rel->r_offset,
2263              TRUE);
2264           break;
2265
2266         case bfd_reloc_outofrange:
2267           msg = _("internal error: out of range error");
2268           break;
2269
2270         case bfd_reloc_notsupported:
2271           msg = _("internal error: unsupported relocation error");
2272           break;
2273
2274         case bfd_reloc_dangerous:
2275           msg = _("internal error: dangerous relocation");
2276           break;
2277
2278         default:
2279           msg = _("internal error: unknown error");
2280           break;
2281         }
2282
2283       if (msg)
2284         info->callbacks->warning
2285           (info, msg, name, input_bfd, input_section, rel->r_offset);
2286       goto out;
2287     }
2288
2289   ret = riscv_resolve_pcrel_lo_relocs (&pcrel_relocs);
2290 out:
2291   riscv_free_pcrel_relocs (&pcrel_relocs);
2292   return ret;
2293 }
2294
2295 /* Finish up dynamic symbol handling.  We set the contents of various
2296    dynamic sections here.  */
2297
2298 static bfd_boolean
2299 riscv_elf_finish_dynamic_symbol (bfd *output_bfd,
2300                                  struct bfd_link_info *info,
2301                                  struct elf_link_hash_entry *h,
2302                                  Elf_Internal_Sym *sym)
2303 {
2304   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2305   const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2306
2307   if (h->plt.offset != (bfd_vma) -1)
2308     {
2309       /* We've decided to create a PLT entry for this symbol.  */
2310       bfd_byte *loc;
2311       bfd_vma i, header_address, plt_idx, got_address;
2312       uint32_t plt_entry[PLT_ENTRY_INSNS];
2313       Elf_Internal_Rela rela;
2314
2315       BFD_ASSERT (h->dynindx != -1);
2316
2317       /* Calculate the address of the PLT header.  */
2318       header_address = sec_addr (htab->elf.splt);
2319
2320       /* Calculate the index of the entry.  */
2321       plt_idx = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
2322
2323       /* Calculate the address of the .got.plt entry.  */
2324       got_address = riscv_elf_got_plt_val (plt_idx, info);
2325
2326       /* Find out where the .plt entry should go.  */
2327       loc = htab->elf.splt->contents + h->plt.offset;
2328
2329       /* Fill in the PLT entry itself.  */
2330       riscv_make_plt_entry (got_address, header_address + h->plt.offset,
2331                             plt_entry);
2332       for (i = 0; i < PLT_ENTRY_INSNS; i++)
2333         bfd_put_32 (output_bfd, plt_entry[i], loc + 4*i);
2334
2335       /* Fill in the initial value of the .got.plt entry.  */
2336       loc = htab->elf.sgotplt->contents
2337             + (got_address - sec_addr (htab->elf.sgotplt));
2338       bfd_put_NN (output_bfd, sec_addr (htab->elf.splt), loc);
2339
2340       /* Fill in the entry in the .rela.plt section.  */
2341       rela.r_offset = got_address;
2342       rela.r_addend = 0;
2343       rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_JUMP_SLOT);
2344
2345       loc = htab->elf.srelplt->contents + plt_idx * sizeof (ElfNN_External_Rela);
2346       bed->s->swap_reloca_out (output_bfd, &rela, loc);
2347
2348       if (!h->def_regular)
2349         {
2350           /* Mark the symbol as undefined, rather than as defined in
2351              the .plt section.  Leave the value alone.  */
2352           sym->st_shndx = SHN_UNDEF;
2353           /* If the symbol is weak, we do need to clear the value.
2354              Otherwise, the PLT entry would provide a definition for
2355              the symbol even if the symbol wasn't defined anywhere,
2356              and so the symbol would never be NULL.  */
2357           if (!h->ref_regular_nonweak)
2358             sym->st_value = 0;
2359         }
2360     }
2361
2362   if (h->got.offset != (bfd_vma) -1
2363       && !(riscv_elf_hash_entry (h)->tls_type & (GOT_TLS_GD | GOT_TLS_IE)))
2364     {
2365       asection *sgot;
2366       asection *srela;
2367       Elf_Internal_Rela rela;
2368
2369       /* This symbol has an entry in the GOT.  Set it up.  */
2370
2371       sgot = htab->elf.sgot;
2372       srela = htab->elf.srelgot;
2373       BFD_ASSERT (sgot != NULL && srela != NULL);
2374
2375       rela.r_offset = sec_addr (sgot) + (h->got.offset &~ (bfd_vma) 1);
2376
2377       /* If this is a -Bsymbolic link, and the symbol is defined
2378          locally, we just want to emit a RELATIVE reloc.  Likewise if
2379          the symbol was forced to be local because of a version file.
2380          The entry in the global offset table will already have been
2381          initialized in the relocate_section function.  */
2382       if (bfd_link_pic (info)
2383           && (info->symbolic || h->dynindx == -1)
2384           && h->def_regular)
2385         {
2386           asection *sec = h->root.u.def.section;
2387           rela.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2388           rela.r_addend = (h->root.u.def.value
2389                            + sec->output_section->vma
2390                            + sec->output_offset);
2391         }
2392       else
2393         {
2394           BFD_ASSERT (h->dynindx != -1);
2395           rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_NN);
2396           rela.r_addend = 0;
2397         }
2398
2399       bfd_put_NN (output_bfd, 0,
2400                   sgot->contents + (h->got.offset & ~(bfd_vma) 1));
2401       riscv_elf_append_rela (output_bfd, srela, &rela);
2402     }
2403
2404   if (h->needs_copy)
2405     {
2406       Elf_Internal_Rela rela;
2407       asection *s;
2408
2409       /* This symbols needs a copy reloc.  Set it up.  */
2410       BFD_ASSERT (h->dynindx != -1);
2411
2412       rela.r_offset = sec_addr (h->root.u.def.section) + h->root.u.def.value;
2413       rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_COPY);
2414       rela.r_addend = 0;
2415       if (h->root.u.def.section == htab->elf.sdynrelro)
2416         s = htab->elf.sreldynrelro;
2417       else
2418         s = htab->elf.srelbss;
2419       riscv_elf_append_rela (output_bfd, s, &rela);
2420     }
2421
2422   /* Mark some specially defined symbols as absolute.  */
2423   if (h == htab->elf.hdynamic
2424       || (h == htab->elf.hgot || h == htab->elf.hplt))
2425     sym->st_shndx = SHN_ABS;
2426
2427   return TRUE;
2428 }
2429
2430 /* Finish up the dynamic sections.  */
2431
2432 static bfd_boolean
2433 riscv_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
2434                   bfd *dynobj, asection *sdyn)
2435 {
2436   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2437   const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2438   size_t dynsize = bed->s->sizeof_dyn;
2439   bfd_byte *dyncon, *dynconend;
2440
2441   dynconend = sdyn->contents + sdyn->size;
2442   for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
2443     {
2444       Elf_Internal_Dyn dyn;
2445       asection *s;
2446
2447       bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
2448
2449       switch (dyn.d_tag)
2450         {
2451         case DT_PLTGOT:
2452           s = htab->elf.sgotplt;
2453           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2454           break;
2455         case DT_JMPREL:
2456           s = htab->elf.srelplt;
2457           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2458           break;
2459         case DT_PLTRELSZ:
2460           s = htab->elf.srelplt;
2461           dyn.d_un.d_val = s->size;
2462           break;
2463         default:
2464           continue;
2465         }
2466
2467       bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
2468     }
2469   return TRUE;
2470 }
2471
2472 static bfd_boolean
2473 riscv_elf_finish_dynamic_sections (bfd *output_bfd,
2474                                    struct bfd_link_info *info)
2475 {
2476   bfd *dynobj;
2477   asection *sdyn;
2478   struct riscv_elf_link_hash_table *htab;
2479
2480   htab = riscv_elf_hash_table (info);
2481   BFD_ASSERT (htab != NULL);
2482   dynobj = htab->elf.dynobj;
2483
2484   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
2485
2486   if (elf_hash_table (info)->dynamic_sections_created)
2487     {
2488       asection *splt;
2489       bfd_boolean ret;
2490
2491       splt = htab->elf.splt;
2492       BFD_ASSERT (splt != NULL && sdyn != NULL);
2493
2494       ret = riscv_finish_dyn (output_bfd, info, dynobj, sdyn);
2495
2496       if (!ret)
2497         return ret;
2498
2499       /* Fill in the head and tail entries in the procedure linkage table.  */
2500       if (splt->size > 0)
2501         {
2502           int i;
2503           uint32_t plt_header[PLT_HEADER_INSNS];
2504           riscv_make_plt_header (sec_addr (htab->elf.sgotplt),
2505                                  sec_addr (splt), plt_header);
2506
2507           for (i = 0; i < PLT_HEADER_INSNS; i++)
2508             bfd_put_32 (output_bfd, plt_header[i], splt->contents + 4*i);
2509
2510           elf_section_data (splt->output_section)->this_hdr.sh_entsize
2511             = PLT_ENTRY_SIZE;
2512         }
2513     }
2514
2515   if (htab->elf.sgotplt)
2516     {
2517       asection *output_section = htab->elf.sgotplt->output_section;
2518
2519       if (bfd_is_abs_section (output_section))
2520         {
2521           (*_bfd_error_handler)
2522             (_("discarded output section: `%A'"), htab->elf.sgotplt);
2523           return FALSE;
2524         }
2525
2526       if (htab->elf.sgotplt->size > 0)
2527         {
2528           /* Write the first two entries in .got.plt, needed for the dynamic
2529              linker.  */
2530           bfd_put_NN (output_bfd, (bfd_vma) -1, htab->elf.sgotplt->contents);
2531           bfd_put_NN (output_bfd, (bfd_vma) 0,
2532                       htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
2533         }
2534
2535       elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2536     }
2537
2538   if (htab->elf.sgot)
2539     {
2540       asection *output_section = htab->elf.sgot->output_section;
2541
2542       if (htab->elf.sgot->size > 0)
2543         {
2544           /* Set the first entry in the global offset table to the address of
2545              the dynamic section.  */
2546           bfd_vma val = sdyn ? sec_addr (sdyn) : 0;
2547           bfd_put_NN (output_bfd, val, htab->elf.sgot->contents);
2548         }
2549
2550       elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2551     }
2552
2553   return TRUE;
2554 }
2555
2556 /* Return address for Ith PLT stub in section PLT, for relocation REL
2557    or (bfd_vma) -1 if it should not be included.  */
2558
2559 static bfd_vma
2560 riscv_elf_plt_sym_val (bfd_vma i, const asection *plt,
2561                        const arelent *rel ATTRIBUTE_UNUSED)
2562 {
2563   return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
2564 }
2565
2566 static enum elf_reloc_type_class
2567 riscv_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2568                         const asection *rel_sec ATTRIBUTE_UNUSED,
2569                         const Elf_Internal_Rela *rela)
2570 {
2571   switch (ELFNN_R_TYPE (rela->r_info))
2572     {
2573     case R_RISCV_RELATIVE:
2574       return reloc_class_relative;
2575     case R_RISCV_JUMP_SLOT:
2576       return reloc_class_plt;
2577     case R_RISCV_COPY:
2578       return reloc_class_copy;
2579     default:
2580       return reloc_class_normal;
2581     }
2582 }
2583
2584 /* Merge backend specific data from an object file to the output
2585    object file when linking.  */
2586
2587 static bfd_boolean
2588 _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2589 {
2590   bfd *obfd = info->output_bfd;
2591   flagword new_flags = elf_elfheader (ibfd)->e_flags;
2592   flagword old_flags = elf_elfheader (obfd)->e_flags;
2593
2594   if (!is_riscv_elf (ibfd) || !is_riscv_elf (obfd))
2595     return TRUE;
2596
2597   if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
2598     {
2599       (*_bfd_error_handler)
2600         (_("%B: ABI is incompatible with that of the selected emulation:\n"
2601            "  target emulation `%s' does not match `%s'"),
2602          ibfd, bfd_get_target (ibfd), bfd_get_target (obfd));
2603       return FALSE;
2604     }
2605
2606   if (!_bfd_elf_merge_object_attributes (ibfd, info))
2607     return FALSE;
2608
2609   if (! elf_flags_init (obfd))
2610     {
2611       elf_flags_init (obfd) = TRUE;
2612       elf_elfheader (obfd)->e_flags = new_flags;
2613       return TRUE;
2614     }
2615
2616   /* Disallow linking different float ABIs.  */
2617   if ((old_flags ^ new_flags) & EF_RISCV_FLOAT_ABI)
2618     {
2619       (*_bfd_error_handler)
2620         (_("%B: can't link hard-float modules with soft-float modules"), ibfd);
2621       goto fail;
2622     }
2623
2624   /* Allow linking RVC and non-RVC, and keep the RVC flag.  */
2625   elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC;
2626
2627   return TRUE;
2628
2629 fail:
2630   bfd_set_error (bfd_error_bad_value);
2631   return FALSE;
2632 }
2633
2634 /* Delete some bytes from a section while relaxing.  */
2635
2636 static bfd_boolean
2637 riscv_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, size_t count)
2638 {
2639   unsigned int i, symcount;
2640   bfd_vma toaddr = sec->size;
2641   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
2642   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2643   unsigned int sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2644   struct bfd_elf_section_data *data = elf_section_data (sec);
2645   bfd_byte *contents = data->this_hdr.contents;
2646
2647   /* Actually delete the bytes.  */
2648   sec->size -= count;
2649   memmove (contents + addr, contents + addr + count, toaddr - addr - count);
2650
2651   /* Adjust the location of all of the relocs.  Note that we need not
2652      adjust the addends, since all PC-relative references must be against
2653      symbols, which we will adjust below.  */
2654   for (i = 0; i < sec->reloc_count; i++)
2655     if (data->relocs[i].r_offset > addr && data->relocs[i].r_offset < toaddr)
2656       data->relocs[i].r_offset -= count;
2657
2658   /* Adjust the local symbols defined in this section.  */
2659   for (i = 0; i < symtab_hdr->sh_info; i++)
2660     {
2661       Elf_Internal_Sym *sym = (Elf_Internal_Sym *) symtab_hdr->contents + i;
2662       if (sym->st_shndx == sec_shndx)
2663         {
2664           /* If the symbol is in the range of memory we just moved, we
2665              have to adjust its value.  */
2666           if (sym->st_value > addr && sym->st_value <= toaddr)
2667             sym->st_value -= count;
2668
2669           /* If the symbol *spans* the bytes we just deleted (i.e. its
2670              *end* is in the moved bytes but its *start* isn't), then we
2671              must adjust its size.  */
2672           if (sym->st_value <= addr
2673               && sym->st_value + sym->st_size > addr
2674               && sym->st_value + sym->st_size <= toaddr)
2675             sym->st_size -= count;
2676         }
2677     }
2678
2679   /* Now adjust the global symbols defined in this section.  */
2680   symcount = ((symtab_hdr->sh_size / sizeof (ElfNN_External_Sym))
2681               - symtab_hdr->sh_info);
2682
2683   for (i = 0; i < symcount; i++)
2684     {
2685       struct elf_link_hash_entry *sym_hash = sym_hashes[i];
2686
2687       if ((sym_hash->root.type == bfd_link_hash_defined
2688            || sym_hash->root.type == bfd_link_hash_defweak)
2689           && sym_hash->root.u.def.section == sec)
2690         {
2691           /* As above, adjust the value if needed.  */
2692           if (sym_hash->root.u.def.value > addr
2693               && sym_hash->root.u.def.value <= toaddr)
2694             sym_hash->root.u.def.value -= count;
2695
2696           /* As above, adjust the size if needed.  */
2697           if (sym_hash->root.u.def.value <= addr
2698               && sym_hash->root.u.def.value + sym_hash->size > addr
2699               && sym_hash->root.u.def.value + sym_hash->size <= toaddr)
2700             sym_hash->size -= count;
2701         }
2702     }
2703
2704   return TRUE;
2705 }
2706
2707 typedef bfd_boolean (*relax_func_t) (bfd *, asection *, asection *,
2708                                      struct bfd_link_info *,
2709                                      Elf_Internal_Rela *,
2710                                      bfd_vma, bfd_vma, bfd_vma, bfd_boolean *);
2711
2712 /* Relax AUIPC + JALR into JAL.  */
2713
2714 static bfd_boolean
2715 _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec,
2716                        struct bfd_link_info *link_info,
2717                        Elf_Internal_Rela *rel,
2718                        bfd_vma symval,
2719                        bfd_vma max_alignment,
2720                        bfd_vma reserve_size ATTRIBUTE_UNUSED,
2721                        bfd_boolean *again)
2722 {
2723   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2724   bfd_signed_vma foff = symval - (sec_addr (sec) + rel->r_offset);
2725   bfd_boolean near_zero = (symval + RISCV_IMM_REACH/2) < RISCV_IMM_REACH;
2726   bfd_vma auipc, jalr;
2727   int rd, r_type, len = 4, rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
2728
2729   /* If the call crosses section boundaries, an alignment directive could
2730      cause the PC-relative offset to later increase.  */
2731   if (VALID_UJTYPE_IMM (foff) && sym_sec->output_section != sec->output_section)
2732     foff += (foff < 0 ? -max_alignment : max_alignment);
2733
2734   /* See if this function call can be shortened.  */
2735   if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero))
2736     return TRUE;
2737
2738   /* Shorten the function call.  */
2739   BFD_ASSERT (rel->r_offset + 8 <= sec->size);
2740
2741   auipc = bfd_get_32 (abfd, contents + rel->r_offset);
2742   jalr = bfd_get_32 (abfd, contents + rel->r_offset + 4);
2743   rd = (jalr >> OP_SH_RD) & OP_MASK_RD;
2744   rvc = rvc && VALID_RVC_J_IMM (foff) && ARCH_SIZE == 32;
2745
2746   if (rvc && (rd == 0 || rd == X_RA))
2747     {
2748       /* Relax to C.J[AL] rd, addr.  */
2749       r_type = R_RISCV_RVC_JUMP;
2750       auipc = rd == 0 ? MATCH_C_J : MATCH_C_JAL;
2751       len = 2;
2752     }
2753   else if (VALID_UJTYPE_IMM (foff))
2754     {
2755       /* Relax to JAL rd, addr.  */
2756       r_type = R_RISCV_JAL;
2757       auipc = MATCH_JAL | (rd << OP_SH_RD);
2758     }
2759   else /* near_zero */
2760     {
2761       /* Relax to JALR rd, x0, addr.  */
2762       r_type = R_RISCV_LO12_I;
2763       auipc = MATCH_JALR | (rd << OP_SH_RD);
2764     }
2765
2766   /* Replace the R_RISCV_CALL reloc.  */
2767   rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), r_type);
2768   /* Replace the AUIPC.  */
2769   bfd_put (8 * len, abfd, auipc, contents + rel->r_offset);
2770
2771   /* Delete unnecessary JALR.  */
2772   *again = TRUE;
2773   return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + len, 8 - len);
2774 }
2775
2776 /* Traverse all output sections and return the max alignment.  */
2777
2778 static bfd_vma
2779 _bfd_riscv_get_max_alignment (asection *sec)
2780 {
2781   unsigned int max_alignment_power = 0;
2782   asection *o;
2783
2784   for (o = sec->output_section->owner->sections; o != NULL; o = o->next)
2785     {
2786       if (o->alignment_power > max_alignment_power)
2787         max_alignment_power = o->alignment_power;
2788     }
2789
2790   return (bfd_vma) 1 << max_alignment_power;
2791 }
2792
2793 /* Relax non-PIC global variable references.  */
2794
2795 static bfd_boolean
2796 _bfd_riscv_relax_lui (bfd *abfd,
2797                       asection *sec,
2798                       asection *sym_sec,
2799                       struct bfd_link_info *link_info,
2800                       Elf_Internal_Rela *rel,
2801                       bfd_vma symval,
2802                       bfd_vma max_alignment,
2803                       bfd_vma reserve_size,
2804                       bfd_boolean *again)
2805 {
2806   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2807   bfd_vma gp = riscv_global_pointer_value (link_info);
2808   int use_rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
2809
2810   /* Mergeable symbols and code might later move out of range.  */
2811   if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
2812     return TRUE;
2813
2814   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
2815
2816   if (gp)
2817     {
2818       /* If gp and the symbol are in the same output section, then
2819          consider only that section's alignment.  */
2820       struct bfd_link_hash_entry *h =
2821         bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE,
2822                               TRUE);
2823       if (h->u.def.section->output_section == sym_sec->output_section)
2824         max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
2825     }
2826
2827   /* Is the reference in range of x0 or gp?
2828      Valid gp range conservatively because of alignment issue.  */
2829   if (VALID_ITYPE_IMM (symval)
2830       || (symval >= gp
2831           && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
2832       || (symval < gp
2833           && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
2834     {
2835       unsigned sym = ELFNN_R_SYM (rel->r_info);
2836       switch (ELFNN_R_TYPE (rel->r_info))
2837         {
2838         case R_RISCV_LO12_I:
2839           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
2840           return TRUE;
2841
2842         case R_RISCV_LO12_S:
2843           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
2844           return TRUE;
2845
2846         case R_RISCV_HI20:
2847           /* We can delete the unnecessary LUI and reloc.  */
2848           rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
2849           *again = TRUE;
2850           return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4);
2851
2852         default:
2853           abort ();
2854         }
2855     }
2856
2857   /* Can we relax LUI to C.LUI?  Alignment might move the section forward;
2858      account for this assuming page alignment at worst.  */
2859   if (use_rvc
2860       && ELFNN_R_TYPE (rel->r_info) == R_RISCV_HI20
2861       && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval))
2862       && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval + ELF_MAXPAGESIZE)))
2863     {
2864       /* Replace LUI with C.LUI if legal (i.e., rd != x2/sp).  */
2865       bfd_vma lui = bfd_get_32 (abfd, contents + rel->r_offset);
2866       if (((lui >> OP_SH_RD) & OP_MASK_RD) == X_SP)
2867         return TRUE;
2868
2869       lui = (lui & (OP_MASK_RD << OP_SH_RD)) | MATCH_C_LUI;
2870       bfd_put_32 (abfd, lui, contents + rel->r_offset);
2871
2872       /* Replace the R_RISCV_HI20 reloc.  */
2873       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_RVC_LUI);
2874
2875       *again = TRUE;
2876       return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + 2, 2);
2877     }
2878
2879   return TRUE;
2880 }
2881
2882 /* Relax non-PIC TLS references.  */
2883
2884 static bfd_boolean
2885 _bfd_riscv_relax_tls_le (bfd *abfd,
2886                          asection *sec,
2887                          asection *sym_sec ATTRIBUTE_UNUSED,
2888                          struct bfd_link_info *link_info,
2889                          Elf_Internal_Rela *rel,
2890                          bfd_vma symval,
2891                          bfd_vma max_alignment ATTRIBUTE_UNUSED,
2892                          bfd_vma reserve_size ATTRIBUTE_UNUSED,
2893                          bfd_boolean *again)
2894 {
2895   /* See if this symbol is in range of tp.  */
2896   if (RISCV_CONST_HIGH_PART (tpoff (link_info, symval)) != 0)
2897     return TRUE;
2898
2899   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
2900   switch (ELFNN_R_TYPE (rel->r_info))
2901     {
2902     case R_RISCV_TPREL_LO12_I:
2903       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_I);
2904       return TRUE;
2905
2906     case R_RISCV_TPREL_LO12_S:
2907       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_S);
2908       return TRUE;
2909
2910     case R_RISCV_TPREL_HI20:
2911     case R_RISCV_TPREL_ADD:
2912       /* We can delete the unnecessary instruction and reloc.  */
2913       rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
2914       *again = TRUE;
2915       return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4);
2916
2917     default:
2918       abort ();
2919     }
2920 }
2921
2922 /* Implement R_RISCV_ALIGN by deleting excess alignment NOPs.  */
2923
2924 static bfd_boolean
2925 _bfd_riscv_relax_align (bfd *abfd, asection *sec,
2926                         asection *sym_sec ATTRIBUTE_UNUSED,
2927                         struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
2928                         Elf_Internal_Rela *rel,
2929                         bfd_vma symval,
2930                         bfd_vma max_alignment ATTRIBUTE_UNUSED,
2931                         bfd_vma reserve_size ATTRIBUTE_UNUSED,
2932                         bfd_boolean *again ATTRIBUTE_UNUSED)
2933 {
2934   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2935   bfd_vma alignment = 1, pos;
2936   while (alignment <= rel->r_addend)
2937     alignment *= 2;
2938
2939   symval -= rel->r_addend;
2940   bfd_vma aligned_addr = ((symval - 1) & ~(alignment - 1)) + alignment;
2941   bfd_vma nop_bytes = aligned_addr - symval;
2942
2943   /* Once we've handled an R_RISCV_ALIGN, we can't relax anything else.  */
2944   sec->sec_flg0 = TRUE;
2945
2946   /* Make sure there are enough NOPs to actually achieve the alignment.  */
2947   if (rel->r_addend < nop_bytes)
2948     return FALSE;
2949
2950   /* Delete the reloc.  */
2951   rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
2952
2953   /* If the number of NOPs is already correct, there's nothing to do.  */
2954   if (nop_bytes == rel->r_addend)
2955     return TRUE;
2956
2957   /* Write as many RISC-V NOPs as we need.  */
2958   for (pos = 0; pos < (nop_bytes & -4); pos += 4)
2959     bfd_put_32 (abfd, RISCV_NOP, contents + rel->r_offset + pos);
2960
2961   /* Write a final RVC NOP if need be.  */
2962   if (nop_bytes % 4 != 0)
2963     bfd_put_16 (abfd, RVC_NOP, contents + rel->r_offset + pos);
2964
2965   /* Delete the excess bytes.  */
2966   return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + nop_bytes,
2967                                    rel->r_addend - nop_bytes);
2968 }
2969
2970 /* Relax a section.  Pass 0 shortens code sequences unless disabled.
2971    Pass 1, which cannot be disabled, handles code alignment directives.  */
2972
2973 static bfd_boolean
2974 _bfd_riscv_relax_section (bfd *abfd, asection *sec,
2975                           struct bfd_link_info *info,
2976                           bfd_boolean *again)
2977 {
2978   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
2979   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2980   struct bfd_elf_section_data *data = elf_section_data (sec);
2981   Elf_Internal_Rela *relocs;
2982   bfd_boolean ret = FALSE;
2983   unsigned int i;
2984   bfd_vma max_alignment, reserve_size = 0;
2985
2986   *again = FALSE;
2987
2988   if (bfd_link_relocatable (info)
2989       || sec->sec_flg0
2990       || (sec->flags & SEC_RELOC) == 0
2991       || sec->reloc_count == 0
2992       || (info->disable_target_specific_optimizations
2993           && info->relax_pass == 0))
2994     return TRUE;
2995
2996   /* Read this BFD's relocs if we haven't done so already.  */
2997   if (data->relocs)
2998     relocs = data->relocs;
2999   else if (!(relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
3000                                                  info->keep_memory)))
3001     goto fail;
3002
3003   max_alignment = _bfd_riscv_get_max_alignment (sec);
3004
3005   /* Examine and consider relaxing each reloc.  */
3006   for (i = 0; i < sec->reloc_count; i++)
3007     {
3008       asection *sym_sec;
3009       Elf_Internal_Rela *rel = relocs + i;
3010       relax_func_t relax_func;
3011       int type = ELFNN_R_TYPE (rel->r_info);
3012       bfd_vma symval;
3013
3014       if (info->relax_pass == 0)
3015         {
3016           if (type == R_RISCV_CALL || type == R_RISCV_CALL_PLT)
3017             relax_func = _bfd_riscv_relax_call;
3018           else if (type == R_RISCV_HI20
3019                    || type == R_RISCV_LO12_I
3020                    || type == R_RISCV_LO12_S)
3021             relax_func = _bfd_riscv_relax_lui;
3022           else if (type == R_RISCV_TPREL_HI20
3023                    || type == R_RISCV_TPREL_ADD
3024                    || type == R_RISCV_TPREL_LO12_I
3025                    || type == R_RISCV_TPREL_LO12_S)
3026             relax_func = _bfd_riscv_relax_tls_le;
3027           else
3028             continue;
3029
3030           /* Only relax this reloc if it is paired with R_RISCV_RELAX.  */
3031           if (i == sec->reloc_count - 1
3032               || ELFNN_R_TYPE ((rel + 1)->r_info) != R_RISCV_RELAX
3033               || rel->r_offset != (rel + 1)->r_offset)
3034             continue;
3035
3036           /* Skip over the R_RISCV_RELAX.  */
3037           i++;
3038         }
3039       else if (type == R_RISCV_ALIGN)
3040         relax_func = _bfd_riscv_relax_align;
3041       else
3042         continue;
3043
3044       data->relocs = relocs;
3045
3046       /* Read this BFD's contents if we haven't done so already.  */
3047       if (!data->this_hdr.contents
3048           && !bfd_malloc_and_get_section (abfd, sec, &data->this_hdr.contents))
3049         goto fail;
3050
3051       /* Read this BFD's symbols if we haven't done so already.  */
3052       if (symtab_hdr->sh_info != 0
3053           && !symtab_hdr->contents
3054           && !(symtab_hdr->contents =
3055                (unsigned char *) bfd_elf_get_elf_syms (abfd, symtab_hdr,
3056                                                        symtab_hdr->sh_info,
3057                                                        0, NULL, NULL, NULL)))
3058         goto fail;
3059
3060       /* Get the value of the symbol referred to by the reloc.  */
3061       if (ELFNN_R_SYM (rel->r_info) < symtab_hdr->sh_info)
3062         {
3063           /* A local symbol.  */
3064           Elf_Internal_Sym *isym = ((Elf_Internal_Sym *) symtab_hdr->contents
3065                                     + ELFNN_R_SYM (rel->r_info));
3066           reserve_size = (isym->st_size - rel->r_addend) > isym->st_size
3067             ? 0 : isym->st_size - rel->r_addend;
3068
3069           if (isym->st_shndx == SHN_UNDEF)
3070             sym_sec = sec, symval = sec_addr (sec) + rel->r_offset;
3071           else
3072             {
3073               BFD_ASSERT (isym->st_shndx < elf_numsections (abfd));
3074               sym_sec = elf_elfsections (abfd)[isym->st_shndx]->bfd_section;
3075               if (sec_addr (sym_sec) == 0)
3076                 continue;
3077               symval = sec_addr (sym_sec) + isym->st_value;
3078             }
3079         }
3080       else
3081         {
3082           unsigned long indx;
3083           struct elf_link_hash_entry *h;
3084
3085           indx = ELFNN_R_SYM (rel->r_info) - symtab_hdr->sh_info;
3086           h = elf_sym_hashes (abfd)[indx];
3087
3088           while (h->root.type == bfd_link_hash_indirect
3089                  || h->root.type == bfd_link_hash_warning)
3090             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3091
3092           if (h->plt.offset != MINUS_ONE)
3093             symval = sec_addr (htab->elf.splt) + h->plt.offset;
3094           else if (h->root.u.def.section->output_section == NULL
3095                    || (h->root.type != bfd_link_hash_defined
3096                        && h->root.type != bfd_link_hash_defweak))
3097             continue;
3098           else
3099             symval = sec_addr (h->root.u.def.section) + h->root.u.def.value;
3100
3101           if (h->type != STT_FUNC)
3102             reserve_size =
3103               (h->size - rel->r_addend) > h->size ? 0 : h->size - rel->r_addend;
3104           sym_sec = h->root.u.def.section;
3105         }
3106
3107       symval += rel->r_addend;
3108
3109       if (!relax_func (abfd, sec, sym_sec, info, rel, symval,
3110                        max_alignment, reserve_size, again))
3111         goto fail;
3112     }
3113
3114   ret = TRUE;
3115
3116 fail:
3117   if (relocs != data->relocs)
3118     free (relocs);
3119
3120   return ret;
3121 }
3122
3123 #if ARCH_SIZE == 32
3124 # define PRSTATUS_SIZE                  0 /* FIXME */
3125 # define PRSTATUS_OFFSET_PR_CURSIG      12
3126 # define PRSTATUS_OFFSET_PR_PID         24
3127 # define PRSTATUS_OFFSET_PR_REG         72
3128 # define ELF_GREGSET_T_SIZE             128
3129 # define PRPSINFO_SIZE                  128
3130 # define PRPSINFO_OFFSET_PR_PID         16
3131 # define PRPSINFO_OFFSET_PR_FNAME       32
3132 # define PRPSINFO_OFFSET_PR_PSARGS      48
3133 #else
3134 # define PRSTATUS_SIZE                  376
3135 # define PRSTATUS_OFFSET_PR_CURSIG      12
3136 # define PRSTATUS_OFFSET_PR_PID         32
3137 # define PRSTATUS_OFFSET_PR_REG         112
3138 # define ELF_GREGSET_T_SIZE             256
3139 # define PRPSINFO_SIZE                  136
3140 # define PRPSINFO_OFFSET_PR_PID         24
3141 # define PRPSINFO_OFFSET_PR_FNAME       40
3142 # define PRPSINFO_OFFSET_PR_PSARGS      56
3143 #endif
3144
3145 /* Support for core dump NOTE sections.  */
3146
3147 static bfd_boolean
3148 riscv_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3149 {
3150   switch (note->descsz)
3151     {
3152       default:
3153         return FALSE;
3154
3155       case PRSTATUS_SIZE:  /* sizeof(struct elf_prstatus) on Linux/RISC-V.  */
3156         /* pr_cursig */
3157         elf_tdata (abfd)->core->signal
3158           = bfd_get_16 (abfd, note->descdata + PRSTATUS_OFFSET_PR_CURSIG);
3159
3160         /* pr_pid */
3161         elf_tdata (abfd)->core->lwpid
3162           = bfd_get_32 (abfd, note->descdata + PRSTATUS_OFFSET_PR_PID);
3163         break;
3164     }
3165
3166   /* Make a ".reg/999" section.  */
3167   return _bfd_elfcore_make_pseudosection (abfd, ".reg", ELF_GREGSET_T_SIZE,
3168                                           note->descpos + PRSTATUS_OFFSET_PR_REG);
3169 }
3170
3171 static bfd_boolean
3172 riscv_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3173 {
3174   switch (note->descsz)
3175     {
3176       default:
3177         return FALSE;
3178
3179       case PRPSINFO_SIZE: /* sizeof(struct elf_prpsinfo) on Linux/RISC-V.  */
3180         /* pr_pid */
3181         elf_tdata (abfd)->core->pid
3182           = bfd_get_32 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PID);
3183
3184         /* pr_fname */
3185         elf_tdata (abfd)->core->program = _bfd_elfcore_strndup
3186           (abfd, note->descdata + PRPSINFO_OFFSET_PR_FNAME, 16);
3187
3188         /* pr_psargs */
3189         elf_tdata (abfd)->core->command = _bfd_elfcore_strndup
3190           (abfd, note->descdata + PRPSINFO_OFFSET_PR_PSARGS, 80);
3191         break;
3192     }
3193
3194   /* Note that for some reason, a spurious space is tacked
3195      onto the end of the args in some (at least one anyway)
3196      implementations, so strip it off if it exists.  */
3197
3198   {
3199     char *command = elf_tdata (abfd)->core->command;
3200     int n = strlen (command);
3201
3202     if (0 < n && command[n - 1] == ' ')
3203       command[n - 1] = '\0';
3204   }
3205
3206   return TRUE;
3207 }
3208
3209 /* Set the right mach type.  */
3210 static bfd_boolean
3211 riscv_elf_object_p (bfd *abfd)
3212 {
3213   /* There are only two mach types in RISCV currently.  */
3214   if (strcmp (abfd->xvec->name, "elf32-littleriscv") == 0)
3215     bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv32);
3216   else
3217     bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv64);
3218
3219   return TRUE;
3220 }
3221
3222
3223 #define TARGET_LITTLE_SYM               riscv_elfNN_vec
3224 #define TARGET_LITTLE_NAME              "elfNN-littleriscv"
3225
3226 #define elf_backend_reloc_type_class         riscv_reloc_type_class
3227
3228 #define bfd_elfNN_bfd_reloc_name_lookup      riscv_reloc_name_lookup
3229 #define bfd_elfNN_bfd_link_hash_table_create riscv_elf_link_hash_table_create
3230 #define bfd_elfNN_bfd_reloc_type_lookup      riscv_reloc_type_lookup
3231 #define bfd_elfNN_bfd_merge_private_bfd_data \
3232   _bfd_riscv_elf_merge_private_bfd_data
3233
3234 #define elf_backend_copy_indirect_symbol     riscv_elf_copy_indirect_symbol
3235 #define elf_backend_create_dynamic_sections  riscv_elf_create_dynamic_sections
3236 #define elf_backend_check_relocs             riscv_elf_check_relocs
3237 #define elf_backend_adjust_dynamic_symbol    riscv_elf_adjust_dynamic_symbol
3238 #define elf_backend_size_dynamic_sections    riscv_elf_size_dynamic_sections
3239 #define elf_backend_relocate_section         riscv_elf_relocate_section
3240 #define elf_backend_finish_dynamic_symbol    riscv_elf_finish_dynamic_symbol
3241 #define elf_backend_finish_dynamic_sections  riscv_elf_finish_dynamic_sections
3242 #define elf_backend_gc_mark_hook             riscv_elf_gc_mark_hook
3243 #define elf_backend_gc_sweep_hook            riscv_elf_gc_sweep_hook
3244 #define elf_backend_plt_sym_val              riscv_elf_plt_sym_val
3245 #define elf_backend_grok_prstatus            riscv_elf_grok_prstatus
3246 #define elf_backend_grok_psinfo              riscv_elf_grok_psinfo
3247 #define elf_backend_object_p                 riscv_elf_object_p
3248 #define elf_info_to_howto_rel                NULL
3249 #define elf_info_to_howto                    riscv_info_to_howto_rela
3250 #define bfd_elfNN_bfd_relax_section          _bfd_riscv_relax_section
3251
3252 #define elf_backend_init_index_section       _bfd_elf_init_1_index_section
3253
3254 #define elf_backend_can_gc_sections     1
3255 #define elf_backend_can_refcount        1
3256 #define elf_backend_want_got_plt        1
3257 #define elf_backend_plt_readonly        1
3258 #define elf_backend_plt_alignment       4
3259 #define elf_backend_want_plt_sym        1
3260 #define elf_backend_got_header_size     (ARCH_SIZE / 8)
3261 #define elf_backend_want_dynrelro       1
3262 #define elf_backend_rela_normal         1
3263 #define elf_backend_default_execstack   0
3264
3265 #include "elfNN-target.h"