RISC-V: Use pc-relative relocation for FDE initial location
[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 ((h->root.u.def.section->flags & SEC_READONLY) != 0)
969     {
970       s = htab->elf.sdynrelro;
971       srel = htab->elf.sreldynrelro;
972     }
973   else
974     {
975       s = htab->elf.sdynbss;
976       srel = htab->elf.srelbss;
977     }
978   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
979     {
980       srel->size += sizeof (ElfNN_External_Rela);
981       h->needs_copy = 1;
982     }
983
984   if (eh->tls_type & ~GOT_NORMAL)
985     return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdyntdata);
986
987   return _bfd_elf_adjust_dynamic_copy (info, h, s);
988 }
989
990 /* Allocate space in .plt, .got and associated reloc sections for
991    dynamic relocs.  */
992
993 static bfd_boolean
994 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
995 {
996   struct bfd_link_info *info;
997   struct riscv_elf_link_hash_table *htab;
998   struct riscv_elf_link_hash_entry *eh;
999   struct riscv_elf_dyn_relocs *p;
1000
1001   if (h->root.type == bfd_link_hash_indirect)
1002     return TRUE;
1003
1004   info = (struct bfd_link_info *) inf;
1005   htab = riscv_elf_hash_table (info);
1006   BFD_ASSERT (htab != NULL);
1007
1008   if (htab->elf.dynamic_sections_created
1009       && h->plt.refcount > 0)
1010     {
1011       /* Make sure this symbol is output as a dynamic symbol.
1012          Undefined weak syms won't yet be marked as dynamic.  */
1013       if (h->dynindx == -1
1014           && !h->forced_local)
1015         {
1016           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1017             return FALSE;
1018         }
1019
1020       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
1021         {
1022           asection *s = htab->elf.splt;
1023
1024           if (s->size == 0)
1025             s->size = PLT_HEADER_SIZE;
1026
1027           h->plt.offset = s->size;
1028
1029           /* Make room for this entry.  */
1030           s->size += PLT_ENTRY_SIZE;
1031
1032           /* We also need to make an entry in the .got.plt section.  */
1033           htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
1034
1035           /* We also need to make an entry in the .rela.plt section.  */
1036           htab->elf.srelplt->size += sizeof (ElfNN_External_Rela);
1037
1038           /* If this symbol is not defined in a regular file, and we are
1039              not generating a shared library, then set the symbol to this
1040              location in the .plt.  This is required to make function
1041              pointers compare as equal between the normal executable and
1042              the shared library.  */
1043           if (! bfd_link_pic (info)
1044               && !h->def_regular)
1045             {
1046               h->root.u.def.section = s;
1047               h->root.u.def.value = h->plt.offset;
1048             }
1049         }
1050       else
1051         {
1052           h->plt.offset = (bfd_vma) -1;
1053           h->needs_plt = 0;
1054         }
1055     }
1056   else
1057     {
1058       h->plt.offset = (bfd_vma) -1;
1059       h->needs_plt = 0;
1060     }
1061
1062   if (h->got.refcount > 0)
1063     {
1064       asection *s;
1065       bfd_boolean dyn;
1066       int tls_type = riscv_elf_hash_entry (h)->tls_type;
1067
1068       /* Make sure this symbol is output as a dynamic symbol.
1069          Undefined weak syms won't yet be marked as dynamic.  */
1070       if (h->dynindx == -1
1071           && !h->forced_local)
1072         {
1073           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1074             return FALSE;
1075         }
1076
1077       s = htab->elf.sgot;
1078       h->got.offset = s->size;
1079       dyn = htab->elf.dynamic_sections_created;
1080       if (tls_type & (GOT_TLS_GD | GOT_TLS_IE))
1081         {
1082           /* TLS_GD needs two dynamic relocs and two GOT slots.  */
1083           if (tls_type & GOT_TLS_GD)
1084             {
1085               s->size += 2 * RISCV_ELF_WORD_BYTES;
1086               htab->elf.srelgot->size += 2 * sizeof (ElfNN_External_Rela);
1087             }
1088
1089           /* TLS_IE needs one dynamic reloc and one GOT slot.  */
1090           if (tls_type & GOT_TLS_IE)
1091             {
1092               s->size += RISCV_ELF_WORD_BYTES;
1093               htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
1094             }
1095         }
1096       else
1097         {
1098           s->size += RISCV_ELF_WORD_BYTES;
1099           if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
1100             htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
1101         }
1102     }
1103   else
1104     h->got.offset = (bfd_vma) -1;
1105
1106   eh = (struct riscv_elf_link_hash_entry *) h;
1107   if (eh->dyn_relocs == NULL)
1108     return TRUE;
1109
1110   /* In the shared -Bsymbolic case, discard space allocated for
1111      dynamic pc-relative relocs against symbols which turn out to be
1112      defined in regular objects.  For the normal shared case, discard
1113      space for pc-relative relocs that have become local due to symbol
1114      visibility changes.  */
1115
1116   if (bfd_link_pic (info))
1117     {
1118       if (SYMBOL_CALLS_LOCAL (info, h))
1119         {
1120           struct riscv_elf_dyn_relocs **pp;
1121
1122           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1123             {
1124               p->count -= p->pc_count;
1125               p->pc_count = 0;
1126               if (p->count == 0)
1127                 *pp = p->next;
1128               else
1129                 pp = &p->next;
1130             }
1131         }
1132
1133       /* Also discard relocs on undefined weak syms with non-default
1134          visibility.  */
1135       if (eh->dyn_relocs != NULL
1136           && h->root.type == bfd_link_hash_undefweak)
1137         {
1138           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1139             eh->dyn_relocs = NULL;
1140
1141           /* Make sure undefined weak symbols are output as a dynamic
1142              symbol in PIEs.  */
1143           else if (h->dynindx == -1
1144                    && !h->forced_local)
1145             {
1146               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1147                 return FALSE;
1148             }
1149         }
1150     }
1151   else
1152     {
1153       /* For the non-shared case, discard space for relocs against
1154          symbols which turn out to need copy relocs or are not
1155          dynamic.  */
1156
1157       if (!h->non_got_ref
1158           && ((h->def_dynamic
1159                && !h->def_regular)
1160               || (htab->elf.dynamic_sections_created
1161                   && (h->root.type == bfd_link_hash_undefweak
1162                       || h->root.type == bfd_link_hash_undefined))))
1163         {
1164           /* Make sure this symbol is output as a dynamic symbol.
1165              Undefined weak syms won't yet be marked as dynamic.  */
1166           if (h->dynindx == -1
1167               && !h->forced_local)
1168             {
1169               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1170                 return FALSE;
1171             }
1172
1173           /* If that succeeded, we know we'll be keeping all the
1174              relocs.  */
1175           if (h->dynindx != -1)
1176             goto keep;
1177         }
1178
1179       eh->dyn_relocs = NULL;
1180
1181     keep: ;
1182     }
1183
1184   /* Finally, allocate space.  */
1185   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1186     {
1187       asection *sreloc = elf_section_data (p->sec)->sreloc;
1188       sreloc->size += p->count * sizeof (ElfNN_External_Rela);
1189     }
1190
1191   return TRUE;
1192 }
1193
1194 /* Find any dynamic relocs that apply to read-only sections.  */
1195
1196 static bfd_boolean
1197 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
1198 {
1199   struct riscv_elf_link_hash_entry *eh;
1200   struct riscv_elf_dyn_relocs *p;
1201
1202   eh = (struct riscv_elf_link_hash_entry *) h;
1203   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1204     {
1205       asection *s = p->sec->output_section;
1206
1207       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1208         {
1209           ((struct bfd_link_info *) inf)->flags |= DF_TEXTREL;
1210           return FALSE;
1211         }
1212     }
1213   return TRUE;
1214 }
1215
1216 static bfd_boolean
1217 riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1218 {
1219   struct riscv_elf_link_hash_table *htab;
1220   bfd *dynobj;
1221   asection *s;
1222   bfd *ibfd;
1223
1224   htab = riscv_elf_hash_table (info);
1225   BFD_ASSERT (htab != NULL);
1226   dynobj = htab->elf.dynobj;
1227   BFD_ASSERT (dynobj != NULL);
1228
1229   if (elf_hash_table (info)->dynamic_sections_created)
1230     {
1231       /* Set the contents of the .interp section to the interpreter.  */
1232       if (bfd_link_executable (info) && !info->nointerp)
1233         {
1234           s = bfd_get_linker_section (dynobj, ".interp");
1235           BFD_ASSERT (s != NULL);
1236           s->size = strlen (ELFNN_DYNAMIC_INTERPRETER) + 1;
1237           s->contents = (unsigned char *) ELFNN_DYNAMIC_INTERPRETER;
1238         }
1239     }
1240
1241   /* Set up .got offsets for local syms, and space for local dynamic
1242      relocs.  */
1243   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1244     {
1245       bfd_signed_vma *local_got;
1246       bfd_signed_vma *end_local_got;
1247       char *local_tls_type;
1248       bfd_size_type locsymcount;
1249       Elf_Internal_Shdr *symtab_hdr;
1250       asection *srel;
1251
1252       if (! is_riscv_elf (ibfd))
1253         continue;
1254
1255       for (s = ibfd->sections; s != NULL; s = s->next)
1256         {
1257           struct riscv_elf_dyn_relocs *p;
1258
1259           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
1260             {
1261               if (!bfd_is_abs_section (p->sec)
1262                   && bfd_is_abs_section (p->sec->output_section))
1263                 {
1264                   /* Input section has been discarded, either because
1265                      it is a copy of a linkonce section or due to
1266                      linker script /DISCARD/, so we'll be discarding
1267                      the relocs too.  */
1268                 }
1269               else if (p->count != 0)
1270                 {
1271                   srel = elf_section_data (p->sec)->sreloc;
1272                   srel->size += p->count * sizeof (ElfNN_External_Rela);
1273                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1274                     info->flags |= DF_TEXTREL;
1275                 }
1276             }
1277         }
1278
1279       local_got = elf_local_got_refcounts (ibfd);
1280       if (!local_got)
1281         continue;
1282
1283       symtab_hdr = &elf_symtab_hdr (ibfd);
1284       locsymcount = symtab_hdr->sh_info;
1285       end_local_got = local_got + locsymcount;
1286       local_tls_type = _bfd_riscv_elf_local_got_tls_type (ibfd);
1287       s = htab->elf.sgot;
1288       srel = htab->elf.srelgot;
1289       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1290         {
1291           if (*local_got > 0)
1292             {
1293               *local_got = s->size;
1294               s->size += RISCV_ELF_WORD_BYTES;
1295               if (*local_tls_type & GOT_TLS_GD)
1296                 s->size += RISCV_ELF_WORD_BYTES;
1297               if (bfd_link_pic (info)
1298                   || (*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)))
1299                 srel->size += sizeof (ElfNN_External_Rela);
1300             }
1301           else
1302             *local_got = (bfd_vma) -1;
1303         }
1304     }
1305
1306   /* Allocate global sym .plt and .got entries, and space for global
1307      sym dynamic relocs.  */
1308   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
1309
1310   if (htab->elf.sgotplt)
1311     {
1312       struct elf_link_hash_entry *got;
1313       got = elf_link_hash_lookup (elf_hash_table (info),
1314                                   "_GLOBAL_OFFSET_TABLE_",
1315                                   FALSE, FALSE, FALSE);
1316
1317       /* Don't allocate .got.plt section if there are no GOT nor PLT
1318          entries and there is no refeence to _GLOBAL_OFFSET_TABLE_.  */
1319       if ((got == NULL
1320            || !got->ref_regular_nonweak)
1321           && (htab->elf.sgotplt->size == GOTPLT_HEADER_SIZE)
1322           && (htab->elf.splt == NULL
1323               || htab->elf.splt->size == 0)
1324           && (htab->elf.sgot == NULL
1325               || (htab->elf.sgot->size
1326                   == get_elf_backend_data (output_bfd)->got_header_size)))
1327         htab->elf.sgotplt->size = 0;
1328     }
1329
1330   /* The check_relocs and adjust_dynamic_symbol entry points have
1331      determined the sizes of the various dynamic sections.  Allocate
1332      memory for them.  */
1333   for (s = dynobj->sections; s != NULL; s = s->next)
1334     {
1335       if ((s->flags & SEC_LINKER_CREATED) == 0)
1336         continue;
1337
1338       if (s == htab->elf.splt
1339           || s == htab->elf.sgot
1340           || s == htab->elf.sgotplt
1341           || s == htab->elf.sdynbss
1342           || s == htab->elf.sdynrelro)
1343         {
1344           /* Strip this section if we don't need it; see the
1345              comment below.  */
1346         }
1347       else if (strncmp (s->name, ".rela", 5) == 0)
1348         {
1349           if (s->size != 0)
1350             {
1351               /* We use the reloc_count field as a counter if we need
1352                  to copy relocs into the output file.  */
1353               s->reloc_count = 0;
1354             }
1355         }
1356       else
1357         {
1358           /* It's not one of our sections.  */
1359           continue;
1360         }
1361
1362       if (s->size == 0)
1363         {
1364           /* If we don't need this section, strip it from the
1365              output file.  This is mostly to handle .rela.bss and
1366              .rela.plt.  We must create both sections in
1367              create_dynamic_sections, because they must be created
1368              before the linker maps input sections to output
1369              sections.  The linker does that before
1370              adjust_dynamic_symbol is called, and it is that
1371              function which decides whether anything needs to go
1372              into these sections.  */
1373           s->flags |= SEC_EXCLUDE;
1374           continue;
1375         }
1376
1377       if ((s->flags & SEC_HAS_CONTENTS) == 0)
1378         continue;
1379
1380       /* Allocate memory for the section contents.  Zero the memory
1381          for the benefit of .rela.plt, which has 4 unused entries
1382          at the beginning, and we don't want garbage.  */
1383       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1384       if (s->contents == NULL)
1385         return FALSE;
1386     }
1387
1388   if (elf_hash_table (info)->dynamic_sections_created)
1389     {
1390       /* Add some entries to the .dynamic section.  We fill in the
1391          values later, in riscv_elf_finish_dynamic_sections, but we
1392          must add the entries now so that we get the correct size for
1393          the .dynamic section.  The DT_DEBUG entry is filled in by the
1394          dynamic linker and used by the debugger.  */
1395 #define add_dynamic_entry(TAG, VAL) \
1396   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1397
1398       if (bfd_link_executable (info))
1399         {
1400           if (!add_dynamic_entry (DT_DEBUG, 0))
1401             return FALSE;
1402         }
1403
1404       if (htab->elf.srelplt->size != 0)
1405         {
1406           if (!add_dynamic_entry (DT_PLTGOT, 0)
1407               || !add_dynamic_entry (DT_PLTRELSZ, 0)
1408               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1409               || !add_dynamic_entry (DT_JMPREL, 0))
1410             return FALSE;
1411         }
1412
1413       if (!add_dynamic_entry (DT_RELA, 0)
1414           || !add_dynamic_entry (DT_RELASZ, 0)
1415           || !add_dynamic_entry (DT_RELAENT, sizeof (ElfNN_External_Rela)))
1416         return FALSE;
1417
1418       /* If any dynamic relocs apply to a read-only section,
1419          then we need a DT_TEXTREL entry.  */
1420       if ((info->flags & DF_TEXTREL) == 0)
1421         elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
1422
1423       if (info->flags & DF_TEXTREL)
1424         {
1425           if (!add_dynamic_entry (DT_TEXTREL, 0))
1426             return FALSE;
1427         }
1428     }
1429 #undef add_dynamic_entry
1430
1431   return TRUE;
1432 }
1433
1434 #define TP_OFFSET 0
1435 #define DTP_OFFSET 0x800
1436
1437 /* Return the relocation value for a TLS dtp-relative reloc.  */
1438
1439 static bfd_vma
1440 dtpoff (struct bfd_link_info *info, bfd_vma address)
1441 {
1442   /* If tls_sec is NULL, we should have signalled an error already.  */
1443   if (elf_hash_table (info)->tls_sec == NULL)
1444     return 0;
1445   return address - elf_hash_table (info)->tls_sec->vma - DTP_OFFSET;
1446 }
1447
1448 /* Return the relocation value for a static TLS tp-relative relocation.  */
1449
1450 static bfd_vma
1451 tpoff (struct bfd_link_info *info, bfd_vma address)
1452 {
1453   /* If tls_sec is NULL, we should have signalled an error already.  */
1454   if (elf_hash_table (info)->tls_sec == NULL)
1455     return 0;
1456   return address - elf_hash_table (info)->tls_sec->vma - TP_OFFSET;
1457 }
1458
1459 /* Return the global pointer's value, or 0 if it is not in use.  */
1460
1461 static bfd_vma
1462 riscv_global_pointer_value (struct bfd_link_info *info)
1463 {
1464   struct bfd_link_hash_entry *h;
1465
1466   h = bfd_link_hash_lookup (info->hash, RISCV_GP_SYMBOL, FALSE, FALSE, TRUE);
1467   if (h == NULL || h->type != bfd_link_hash_defined)
1468     return 0;
1469
1470   return h->u.def.value + sec_addr (h->u.def.section);
1471 }
1472
1473 /* Emplace a static relocation.  */
1474
1475 static bfd_reloc_status_type
1476 perform_relocation (const reloc_howto_type *howto,
1477                     const Elf_Internal_Rela *rel,
1478                     bfd_vma value,
1479                     asection *input_section,
1480                     bfd *input_bfd,
1481                     bfd_byte *contents)
1482 {
1483   if (howto->pc_relative)
1484     value -= sec_addr (input_section) + rel->r_offset;
1485   value += rel->r_addend;
1486
1487   switch (ELFNN_R_TYPE (rel->r_info))
1488     {
1489     case R_RISCV_HI20:
1490     case R_RISCV_TPREL_HI20:
1491     case R_RISCV_PCREL_HI20:
1492     case R_RISCV_GOT_HI20:
1493     case R_RISCV_TLS_GOT_HI20:
1494     case R_RISCV_TLS_GD_HI20:
1495       if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)))
1496         return bfd_reloc_overflow;
1497       value = ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value));
1498       break;
1499
1500     case R_RISCV_LO12_I:
1501     case R_RISCV_GPREL_I:
1502     case R_RISCV_TPREL_LO12_I:
1503     case R_RISCV_TPREL_I:
1504     case R_RISCV_PCREL_LO12_I:
1505       value = ENCODE_ITYPE_IMM (value);
1506       break;
1507
1508     case R_RISCV_LO12_S:
1509     case R_RISCV_GPREL_S:
1510     case R_RISCV_TPREL_LO12_S:
1511     case R_RISCV_TPREL_S:
1512     case R_RISCV_PCREL_LO12_S:
1513       value = ENCODE_STYPE_IMM (value);
1514       break;
1515
1516     case R_RISCV_CALL:
1517     case R_RISCV_CALL_PLT:
1518       if (ARCH_SIZE > 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)))
1519         return bfd_reloc_overflow;
1520       value = ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value))
1521               | (ENCODE_ITYPE_IMM (value) << 32);
1522       break;
1523
1524     case R_RISCV_JAL:
1525       if (!VALID_UJTYPE_IMM (value))
1526         return bfd_reloc_overflow;
1527       value = ENCODE_UJTYPE_IMM (value);
1528       break;
1529
1530     case R_RISCV_BRANCH:
1531       if (!VALID_SBTYPE_IMM (value))
1532         return bfd_reloc_overflow;
1533       value = ENCODE_SBTYPE_IMM (value);
1534       break;
1535
1536     case R_RISCV_RVC_BRANCH:
1537       if (!VALID_RVC_B_IMM (value))
1538         return bfd_reloc_overflow;
1539       value = ENCODE_RVC_B_IMM (value);
1540       break;
1541
1542     case R_RISCV_RVC_JUMP:
1543       if (!VALID_RVC_J_IMM (value))
1544         return bfd_reloc_overflow;
1545       value = ENCODE_RVC_J_IMM (value);
1546       break;
1547
1548     case R_RISCV_RVC_LUI:
1549       if (!VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value)))
1550         return bfd_reloc_overflow;
1551       value = ENCODE_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value));
1552       break;
1553
1554     case R_RISCV_32:
1555     case R_RISCV_64:
1556     case R_RISCV_ADD8:
1557     case R_RISCV_ADD16:
1558     case R_RISCV_ADD32:
1559     case R_RISCV_ADD64:
1560     case R_RISCV_SUB6:
1561     case R_RISCV_SUB8:
1562     case R_RISCV_SUB16:
1563     case R_RISCV_SUB32:
1564     case R_RISCV_SUB64:
1565     case R_RISCV_SET6:
1566     case R_RISCV_SET8:
1567     case R_RISCV_SET16:
1568     case R_RISCV_SET32:
1569     case R_RISCV_32_PCREL:
1570     case R_RISCV_TLS_DTPREL32:
1571     case R_RISCV_TLS_DTPREL64:
1572       break;
1573
1574     default:
1575       return bfd_reloc_notsupported;
1576     }
1577
1578   bfd_vma word = bfd_get (howto->bitsize, input_bfd, contents + rel->r_offset);
1579   word = (word & ~howto->dst_mask) | (value & howto->dst_mask);
1580   bfd_put (howto->bitsize, input_bfd, word, contents + rel->r_offset);
1581
1582   return bfd_reloc_ok;
1583 }
1584
1585 /* Remember all PC-relative high-part relocs we've encountered to help us
1586    later resolve the corresponding low-part relocs.  */
1587
1588 typedef struct
1589 {
1590   bfd_vma address;
1591   bfd_vma value;
1592 } riscv_pcrel_hi_reloc;
1593
1594 typedef struct riscv_pcrel_lo_reloc
1595 {
1596   asection *                     input_section;
1597   struct bfd_link_info *         info;
1598   reloc_howto_type *             howto;
1599   const Elf_Internal_Rela *      reloc;
1600   bfd_vma                        addr;
1601   const char *                   name;
1602   bfd_byte *                     contents;
1603   struct riscv_pcrel_lo_reloc *  next;
1604 } riscv_pcrel_lo_reloc;
1605
1606 typedef struct
1607 {
1608   htab_t hi_relocs;
1609   riscv_pcrel_lo_reloc *lo_relocs;
1610 } riscv_pcrel_relocs;
1611
1612 static hashval_t
1613 riscv_pcrel_reloc_hash (const void *entry)
1614 {
1615   const riscv_pcrel_hi_reloc *e = entry;
1616   return (hashval_t)(e->address >> 2);
1617 }
1618
1619 static bfd_boolean
1620 riscv_pcrel_reloc_eq (const void *entry1, const void *entry2)
1621 {
1622   const riscv_pcrel_hi_reloc *e1 = entry1, *e2 = entry2;
1623   return e1->address == e2->address;
1624 }
1625
1626 static bfd_boolean
1627 riscv_init_pcrel_relocs (riscv_pcrel_relocs *p)
1628 {
1629
1630   p->lo_relocs = NULL;
1631   p->hi_relocs = htab_create (1024, riscv_pcrel_reloc_hash,
1632                               riscv_pcrel_reloc_eq, free);
1633   return p->hi_relocs != NULL;
1634 }
1635
1636 static void
1637 riscv_free_pcrel_relocs (riscv_pcrel_relocs *p)
1638 {
1639   riscv_pcrel_lo_reloc *cur = p->lo_relocs;
1640
1641   while (cur != NULL)
1642     {
1643       riscv_pcrel_lo_reloc *next = cur->next;
1644       free (cur);
1645       cur = next;
1646     }
1647
1648   htab_delete (p->hi_relocs);
1649 }
1650
1651 static bfd_boolean
1652 riscv_record_pcrel_hi_reloc (riscv_pcrel_relocs *p, bfd_vma addr, bfd_vma value)
1653 {
1654   riscv_pcrel_hi_reloc entry = {addr, value - addr};
1655   riscv_pcrel_hi_reloc **slot =
1656     (riscv_pcrel_hi_reloc **) htab_find_slot (p->hi_relocs, &entry, INSERT);
1657
1658   BFD_ASSERT (*slot == NULL);
1659   *slot = (riscv_pcrel_hi_reloc *) bfd_malloc (sizeof (riscv_pcrel_hi_reloc));
1660   if (*slot == NULL)
1661     return FALSE;
1662   **slot = entry;
1663   return TRUE;
1664 }
1665
1666 static bfd_boolean
1667 riscv_record_pcrel_lo_reloc (riscv_pcrel_relocs *p,
1668                              asection *input_section,
1669                              struct bfd_link_info *info,
1670                              reloc_howto_type *howto,
1671                              const Elf_Internal_Rela *reloc,
1672                              bfd_vma addr,
1673                              const char *name,
1674                              bfd_byte *contents)
1675 {
1676   riscv_pcrel_lo_reloc *entry;
1677   entry = (riscv_pcrel_lo_reloc *) bfd_malloc (sizeof (riscv_pcrel_lo_reloc));
1678   if (entry == NULL)
1679     return FALSE;
1680   *entry = (riscv_pcrel_lo_reloc) {input_section, info, howto, reloc, addr,
1681                                    name, contents, p->lo_relocs};
1682   p->lo_relocs = entry;
1683   return TRUE;
1684 }
1685
1686 static bfd_boolean
1687 riscv_resolve_pcrel_lo_relocs (riscv_pcrel_relocs *p)
1688 {
1689   riscv_pcrel_lo_reloc *r;
1690
1691   for (r = p->lo_relocs; r != NULL; r = r->next)
1692     {
1693       bfd *input_bfd = r->input_section->owner;
1694
1695       riscv_pcrel_hi_reloc search = {r->addr, 0};
1696       riscv_pcrel_hi_reloc *entry = htab_find (p->hi_relocs, &search);
1697       if (entry == NULL)
1698         {
1699           ((*r->info->callbacks->reloc_overflow)
1700            (r->info, NULL, r->name, r->howto->name, (bfd_vma) 0,
1701             input_bfd, r->input_section, r->reloc->r_offset));
1702           return TRUE;
1703         }
1704
1705       perform_relocation (r->howto, r->reloc, entry->value, r->input_section,
1706                           input_bfd, r->contents);
1707     }
1708
1709   return TRUE;
1710 }
1711
1712 /* Relocate a RISC-V ELF section.
1713
1714    The RELOCATE_SECTION function is called by the new ELF backend linker
1715    to handle the relocations for a section.
1716
1717    The relocs are always passed as Rela structures.
1718
1719    This function is responsible for adjusting the section contents as
1720    necessary, and (if generating a relocatable output file) adjusting
1721    the reloc addend as necessary.
1722
1723    This function does not have to worry about setting the reloc
1724    address or the reloc symbol index.
1725
1726    LOCAL_SYMS is a pointer to the swapped in local symbols.
1727
1728    LOCAL_SECTIONS is an array giving the section in the input file
1729    corresponding to the st_shndx field of each local symbol.
1730
1731    The global hash table entry for the global symbols can be found
1732    via elf_sym_hashes (input_bfd).
1733
1734    When generating relocatable output, this function must handle
1735    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1736    going to be the section symbol corresponding to the output
1737    section, which means that the addend must be adjusted
1738    accordingly.  */
1739
1740 static bfd_boolean
1741 riscv_elf_relocate_section (bfd *output_bfd,
1742                             struct bfd_link_info *info,
1743                             bfd *input_bfd,
1744                             asection *input_section,
1745                             bfd_byte *contents,
1746                             Elf_Internal_Rela *relocs,
1747                             Elf_Internal_Sym *local_syms,
1748                             asection **local_sections)
1749 {
1750   Elf_Internal_Rela *rel;
1751   Elf_Internal_Rela *relend;
1752   riscv_pcrel_relocs pcrel_relocs;
1753   bfd_boolean ret = FALSE;
1754   asection *sreloc = elf_section_data (input_section)->sreloc;
1755   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
1756   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_bfd);
1757   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
1758   bfd_vma *local_got_offsets = elf_local_got_offsets (input_bfd);
1759
1760   if (!riscv_init_pcrel_relocs (&pcrel_relocs))
1761     return FALSE;
1762
1763   relend = relocs + input_section->reloc_count;
1764   for (rel = relocs; rel < relend; rel++)
1765     {
1766       unsigned long r_symndx;
1767       struct elf_link_hash_entry *h;
1768       Elf_Internal_Sym *sym;
1769       asection *sec;
1770       bfd_vma relocation;
1771       bfd_reloc_status_type r = bfd_reloc_ok;
1772       const char *name;
1773       bfd_vma off, ie_off;
1774       bfd_boolean unresolved_reloc, is_ie = FALSE;
1775       bfd_vma pc = sec_addr (input_section) + rel->r_offset;
1776       int r_type = ELFNN_R_TYPE (rel->r_info), tls_type;
1777       reloc_howto_type *howto = riscv_elf_rtype_to_howto (r_type);
1778       const char *msg = NULL;
1779
1780       if (r_type == R_RISCV_GNU_VTINHERIT || r_type == R_RISCV_GNU_VTENTRY)
1781         continue;
1782
1783       /* This is a final link.  */
1784       r_symndx = ELFNN_R_SYM (rel->r_info);
1785       h = NULL;
1786       sym = NULL;
1787       sec = NULL;
1788       unresolved_reloc = FALSE;
1789       if (r_symndx < symtab_hdr->sh_info)
1790         {
1791           sym = local_syms + r_symndx;
1792           sec = local_sections[r_symndx];
1793           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1794         }
1795       else
1796         {
1797           bfd_boolean warned, ignored;
1798
1799           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1800                                    r_symndx, symtab_hdr, sym_hashes,
1801                                    h, sec, relocation,
1802                                    unresolved_reloc, warned, ignored);
1803           if (warned)
1804             {
1805               /* To avoid generating warning messages about truncated
1806                  relocations, set the relocation's address to be the same as
1807                  the start of this section.  */
1808               if (input_section->output_section != NULL)
1809                 relocation = input_section->output_section->vma;
1810               else
1811                 relocation = 0;
1812             }
1813         }
1814
1815       if (sec != NULL && discarded_section (sec))
1816         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1817                                          rel, 1, relend, howto, 0, contents);
1818
1819       if (bfd_link_relocatable (info))
1820         continue;
1821
1822       if (h != NULL)
1823         name = h->root.root.string;
1824       else
1825         {
1826           name = (bfd_elf_string_from_elf_section
1827                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
1828           if (name == NULL || *name == '\0')
1829             name = bfd_section_name (input_bfd, sec);
1830         }
1831
1832       switch (r_type)
1833         {
1834         case R_RISCV_NONE:
1835         case R_RISCV_RELAX:
1836         case R_RISCV_TPREL_ADD:
1837         case R_RISCV_COPY:
1838         case R_RISCV_JUMP_SLOT:
1839         case R_RISCV_RELATIVE:
1840           /* These require nothing of us at all.  */
1841           continue;
1842
1843         case R_RISCV_HI20:
1844         case R_RISCV_BRANCH:
1845         case R_RISCV_RVC_BRANCH:
1846         case R_RISCV_RVC_LUI:
1847         case R_RISCV_LO12_I:
1848         case R_RISCV_LO12_S:
1849         case R_RISCV_SET6:
1850         case R_RISCV_SET8:
1851         case R_RISCV_SET16:
1852         case R_RISCV_SET32:
1853         case R_RISCV_32_PCREL:
1854           /* These require no special handling beyond perform_relocation.  */
1855           break;
1856
1857         case R_RISCV_GOT_HI20:
1858           if (h != NULL)
1859             {
1860               bfd_boolean dyn, pic;
1861
1862               off = h->got.offset;
1863               BFD_ASSERT (off != (bfd_vma) -1);
1864               dyn = elf_hash_table (info)->dynamic_sections_created;
1865               pic = bfd_link_pic (info);
1866
1867               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
1868                   || (pic && SYMBOL_REFERENCES_LOCAL (info, h)))
1869                 {
1870                   /* This is actually a static link, or it is a
1871                      -Bsymbolic link and the symbol is defined
1872                      locally, or the symbol was forced to be local
1873                      because of a version file.  We must initialize
1874                      this entry in the global offset table.  Since the
1875                      offset must always be a multiple of the word size,
1876                      we use the least significant bit to record whether
1877                      we have initialized it already.
1878
1879                      When doing a dynamic link, we create a .rela.got
1880                      relocation entry to initialize the value.  This
1881                      is done in the finish_dynamic_symbol routine.  */
1882                   if ((off & 1) != 0)
1883                     off &= ~1;
1884                   else
1885                     {
1886                       bfd_put_NN (output_bfd, relocation,
1887                                   htab->elf.sgot->contents + off);
1888                       h->got.offset |= 1;
1889                     }
1890                 }
1891               else
1892                 unresolved_reloc = FALSE;
1893             }
1894           else
1895             {
1896               BFD_ASSERT (local_got_offsets != NULL
1897                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
1898
1899               off = local_got_offsets[r_symndx];
1900
1901               /* The offset must always be a multiple of the word size.
1902                  So, we can use the least significant bit to record
1903                  whether we have already processed this entry.  */
1904               if ((off & 1) != 0)
1905                 off &= ~1;
1906               else
1907                 {
1908                   if (bfd_link_pic (info))
1909                     {
1910                       asection *s;
1911                       Elf_Internal_Rela outrel;
1912
1913                       /* We need to generate a R_RISCV_RELATIVE reloc
1914                          for the dynamic linker.  */
1915                       s = htab->elf.srelgot;
1916                       BFD_ASSERT (s != NULL);
1917
1918                       outrel.r_offset = sec_addr (htab->elf.sgot) + off;
1919                       outrel.r_info =
1920                         ELFNN_R_INFO (0, R_RISCV_RELATIVE);
1921                       outrel.r_addend = relocation;
1922                       relocation = 0;
1923                       riscv_elf_append_rela (output_bfd, s, &outrel);
1924                     }
1925
1926                   bfd_put_NN (output_bfd, relocation,
1927                               htab->elf.sgot->contents + off);
1928                   local_got_offsets[r_symndx] |= 1;
1929                 }
1930             }
1931           relocation = sec_addr (htab->elf.sgot) + off;
1932           if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc, relocation))
1933             r = bfd_reloc_overflow;
1934           break;
1935
1936         case R_RISCV_ADD8:
1937         case R_RISCV_ADD16:
1938         case R_RISCV_ADD32:
1939         case R_RISCV_ADD64:
1940           {
1941             bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1942                                          contents + rel->r_offset);
1943             relocation = old_value + relocation;
1944           }
1945           break;
1946
1947         case R_RISCV_SUB6:
1948         case R_RISCV_SUB8:
1949         case R_RISCV_SUB16:
1950         case R_RISCV_SUB32:
1951         case R_RISCV_SUB64:
1952           {
1953             bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1954                                          contents + rel->r_offset);
1955             relocation = old_value - relocation;
1956           }
1957           break;
1958
1959         case R_RISCV_CALL_PLT:
1960         case R_RISCV_CALL:
1961         case R_RISCV_JAL:
1962         case R_RISCV_RVC_JUMP:
1963           if (bfd_link_pic (info) && h != NULL && h->plt.offset != MINUS_ONE)
1964             {
1965               /* Refer to the PLT entry.  */
1966               relocation = sec_addr (htab->elf.splt) + h->plt.offset;
1967               unresolved_reloc = FALSE;
1968             }
1969           break;
1970
1971         case R_RISCV_TPREL_HI20:
1972           relocation = tpoff (info, relocation);
1973           break;
1974
1975         case R_RISCV_TPREL_LO12_I:
1976         case R_RISCV_TPREL_LO12_S:
1977           relocation = tpoff (info, relocation);
1978           break;
1979
1980         case R_RISCV_TPREL_I:
1981         case R_RISCV_TPREL_S:
1982           relocation = tpoff (info, relocation);
1983           if (VALID_ITYPE_IMM (relocation + rel->r_addend))
1984             {
1985               /* We can use tp as the base register.  */
1986               bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
1987               insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1988               insn |= X_TP << OP_SH_RS1;
1989               bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
1990             }
1991           else
1992             r = bfd_reloc_overflow;
1993           break;
1994
1995         case R_RISCV_GPREL_I:
1996         case R_RISCV_GPREL_S:
1997           {
1998             bfd_vma gp = riscv_global_pointer_value (info);
1999             bfd_boolean x0_base = VALID_ITYPE_IMM (relocation + rel->r_addend);
2000             if (x0_base || VALID_ITYPE_IMM (relocation + rel->r_addend - gp))
2001               {
2002                 /* We can use x0 or gp as the base register.  */
2003                 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2004                 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
2005                 if (!x0_base)
2006                   {
2007                     rel->r_addend -= gp;
2008                     insn |= X_GP << OP_SH_RS1;
2009                   }
2010                 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
2011               }
2012             else
2013               r = bfd_reloc_overflow;
2014             break;
2015           }
2016
2017         case R_RISCV_PCREL_HI20:
2018           if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2019                                             relocation + rel->r_addend))
2020             r = bfd_reloc_overflow;
2021           break;
2022
2023         case R_RISCV_PCREL_LO12_I:
2024         case R_RISCV_PCREL_LO12_S:
2025           if (riscv_record_pcrel_lo_reloc (&pcrel_relocs, input_section, info,
2026                                            howto, rel, relocation, name,
2027                                            contents))
2028             continue;
2029           r = bfd_reloc_overflow;
2030           break;
2031
2032         case R_RISCV_TLS_DTPREL32:
2033         case R_RISCV_TLS_DTPREL64:
2034           relocation = dtpoff (info, relocation);
2035           break;
2036
2037         case R_RISCV_32:
2038         case R_RISCV_64:
2039           if ((input_section->flags & SEC_ALLOC) == 0)
2040             break;
2041
2042           if ((bfd_link_pic (info)
2043                && (h == NULL
2044                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2045                    || h->root.type != bfd_link_hash_undefweak)
2046                && (! howto->pc_relative
2047                    || !SYMBOL_CALLS_LOCAL (info, h)))
2048               || (!bfd_link_pic (info)
2049                   && h != NULL
2050                   && h->dynindx != -1
2051                   && !h->non_got_ref
2052                   && ((h->def_dynamic
2053                        && !h->def_regular)
2054                       || h->root.type == bfd_link_hash_undefweak
2055                       || h->root.type == bfd_link_hash_undefined)))
2056             {
2057               Elf_Internal_Rela outrel;
2058               bfd_boolean skip_static_relocation, skip_dynamic_relocation;
2059
2060               /* When generating a shared object, these relocations
2061                  are copied into the output file to be resolved at run
2062                  time.  */
2063
2064               outrel.r_offset =
2065                 _bfd_elf_section_offset (output_bfd, info, input_section,
2066                                          rel->r_offset);
2067               skip_static_relocation = outrel.r_offset != (bfd_vma) -2;
2068               skip_dynamic_relocation = outrel.r_offset >= (bfd_vma) -2;
2069               outrel.r_offset += sec_addr (input_section);
2070
2071               if (skip_dynamic_relocation)
2072                 memset (&outrel, 0, sizeof outrel);
2073               else if (h != NULL && h->dynindx != -1
2074                        && !(bfd_link_pic (info)
2075                             && SYMBOLIC_BIND (info, h)
2076                             && h->def_regular))
2077                 {
2078                   outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
2079                   outrel.r_addend = rel->r_addend;
2080                 }
2081               else
2082                 {
2083                   outrel.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2084                   outrel.r_addend = relocation + rel->r_addend;
2085                 }
2086
2087               riscv_elf_append_rela (output_bfd, sreloc, &outrel);
2088               if (skip_static_relocation)
2089                 continue;
2090             }
2091           break;
2092
2093         case R_RISCV_TLS_GOT_HI20:
2094           is_ie = TRUE;
2095           /* Fall through.  */
2096
2097         case R_RISCV_TLS_GD_HI20:
2098           if (h != NULL)
2099             {
2100               off = h->got.offset;
2101               h->got.offset |= 1;
2102             }
2103           else
2104             {
2105               off = local_got_offsets[r_symndx];
2106               local_got_offsets[r_symndx] |= 1;
2107             }
2108
2109           tls_type = _bfd_riscv_elf_tls_type (input_bfd, h, r_symndx);
2110           BFD_ASSERT (tls_type & (GOT_TLS_IE | GOT_TLS_GD));
2111           /* If this symbol is referenced by both GD and IE TLS, the IE
2112              reference's GOT slot follows the GD reference's slots.  */
2113           ie_off = 0;
2114           if ((tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_IE))
2115             ie_off = 2 * GOT_ENTRY_SIZE;
2116
2117           if ((off & 1) != 0)
2118             off &= ~1;
2119           else
2120             {
2121               Elf_Internal_Rela outrel;
2122               int indx = 0;
2123               bfd_boolean need_relocs = FALSE;
2124
2125               if (htab->elf.srelgot == NULL)
2126                 abort ();
2127
2128               if (h != NULL)
2129                 {
2130                   bfd_boolean dyn, pic;
2131                   dyn = htab->elf.dynamic_sections_created;
2132                   pic = bfd_link_pic (info);
2133
2134                   if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
2135                       && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
2136                     indx = h->dynindx;
2137                 }
2138
2139               /* The GOT entries have not been initialized yet.  Do it
2140                  now, and emit any relocations.  */
2141               if ((bfd_link_pic (info) || indx != 0)
2142                   && (h == NULL
2143                       || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2144                       || h->root.type != bfd_link_hash_undefweak))
2145                     need_relocs = TRUE;
2146
2147               if (tls_type & GOT_TLS_GD)
2148                 {
2149                   if (need_relocs)
2150                     {
2151                       outrel.r_offset = sec_addr (htab->elf.sgot) + off;
2152                       outrel.r_addend = 0;
2153                       outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPMODNN);
2154                       bfd_put_NN (output_bfd, 0,
2155                                   htab->elf.sgot->contents + off);
2156                       riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2157                       if (indx == 0)
2158                         {
2159                           BFD_ASSERT (! unresolved_reloc);
2160                           bfd_put_NN (output_bfd,
2161                                       dtpoff (info, relocation),
2162                                       (htab->elf.sgot->contents + off +
2163                                        RISCV_ELF_WORD_BYTES));
2164                         }
2165                       else
2166                         {
2167                           bfd_put_NN (output_bfd, 0,
2168                                       (htab->elf.sgot->contents + off +
2169                                        RISCV_ELF_WORD_BYTES));
2170                           outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPRELNN);
2171                           outrel.r_offset += RISCV_ELF_WORD_BYTES;
2172                           riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2173                         }
2174                     }
2175                   else
2176                     {
2177                       /* If we are not emitting relocations for a
2178                          general dynamic reference, then we must be in a
2179                          static link or an executable link with the
2180                          symbol binding locally.  Mark it as belonging
2181                          to module 1, the executable.  */
2182                       bfd_put_NN (output_bfd, 1,
2183                                   htab->elf.sgot->contents + off);
2184                       bfd_put_NN (output_bfd,
2185                                   dtpoff (info, relocation),
2186                                   (htab->elf.sgot->contents + off +
2187                                    RISCV_ELF_WORD_BYTES));
2188                    }
2189                 }
2190
2191               if (tls_type & GOT_TLS_IE)
2192                 {
2193                   if (need_relocs)
2194                     {
2195                       bfd_put_NN (output_bfd, 0,
2196                                   htab->elf.sgot->contents + off + ie_off);
2197                       outrel.r_offset = sec_addr (htab->elf.sgot)
2198                                        + off + ie_off;
2199                       outrel.r_addend = 0;
2200                       if (indx == 0)
2201                         outrel.r_addend = tpoff (info, relocation);
2202                       outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_TPRELNN);
2203                       riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2204                     }
2205                   else
2206                     {
2207                       bfd_put_NN (output_bfd, tpoff (info, relocation),
2208                                   htab->elf.sgot->contents + off + ie_off);
2209                     }
2210                 }
2211             }
2212
2213           BFD_ASSERT (off < (bfd_vma) -2);
2214           relocation = sec_addr (htab->elf.sgot) + off + (is_ie ? ie_off : 0);
2215           if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc, relocation))
2216             r = bfd_reloc_overflow;
2217           unresolved_reloc = FALSE;
2218           break;
2219
2220         default:
2221           r = bfd_reloc_notsupported;
2222         }
2223
2224       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2225          because such sections are not SEC_ALLOC and thus ld.so will
2226          not process them.  */
2227       if (unresolved_reloc
2228           && !((input_section->flags & SEC_DEBUGGING) != 0
2229                && h->def_dynamic)
2230           && _bfd_elf_section_offset (output_bfd, info, input_section,
2231                                       rel->r_offset) != (bfd_vma) -1)
2232         {
2233           (*_bfd_error_handler)
2234             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
2235              input_bfd,
2236              input_section,
2237              (long) rel->r_offset,
2238              howto->name,
2239              h->root.root.string);
2240           continue;
2241         }
2242
2243       if (r == bfd_reloc_ok)
2244         r = perform_relocation (howto, rel, relocation, input_section,
2245                                 input_bfd, contents);
2246
2247       switch (r)
2248         {
2249         case bfd_reloc_ok:
2250           continue;
2251
2252         case bfd_reloc_overflow:
2253           info->callbacks->reloc_overflow
2254             (info, (h ? &h->root : NULL), name, howto->name,
2255              (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
2256           break;
2257
2258         case bfd_reloc_undefined:
2259           info->callbacks->undefined_symbol
2260             (info, name, input_bfd, input_section, rel->r_offset,
2261              TRUE);
2262           break;
2263
2264         case bfd_reloc_outofrange:
2265           msg = _("internal error: out of range error");
2266           break;
2267
2268         case bfd_reloc_notsupported:
2269           msg = _("internal error: unsupported relocation error");
2270           break;
2271
2272         case bfd_reloc_dangerous:
2273           msg = _("internal error: dangerous relocation");
2274           break;
2275
2276         default:
2277           msg = _("internal error: unknown error");
2278           break;
2279         }
2280
2281       if (msg)
2282         info->callbacks->warning
2283           (info, msg, name, input_bfd, input_section, rel->r_offset);
2284       goto out;
2285     }
2286
2287   ret = riscv_resolve_pcrel_lo_relocs (&pcrel_relocs);
2288 out:
2289   riscv_free_pcrel_relocs (&pcrel_relocs);
2290   return ret;
2291 }
2292
2293 /* Finish up dynamic symbol handling.  We set the contents of various
2294    dynamic sections here.  */
2295
2296 static bfd_boolean
2297 riscv_elf_finish_dynamic_symbol (bfd *output_bfd,
2298                                  struct bfd_link_info *info,
2299                                  struct elf_link_hash_entry *h,
2300                                  Elf_Internal_Sym *sym)
2301 {
2302   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2303   const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2304
2305   if (h->plt.offset != (bfd_vma) -1)
2306     {
2307       /* We've decided to create a PLT entry for this symbol.  */
2308       bfd_byte *loc;
2309       bfd_vma i, header_address, plt_idx, got_address;
2310       uint32_t plt_entry[PLT_ENTRY_INSNS];
2311       Elf_Internal_Rela rela;
2312
2313       BFD_ASSERT (h->dynindx != -1);
2314
2315       /* Calculate the address of the PLT header.  */
2316       header_address = sec_addr (htab->elf.splt);
2317
2318       /* Calculate the index of the entry.  */
2319       plt_idx = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
2320
2321       /* Calculate the address of the .got.plt entry.  */
2322       got_address = riscv_elf_got_plt_val (plt_idx, info);
2323
2324       /* Find out where the .plt entry should go.  */
2325       loc = htab->elf.splt->contents + h->plt.offset;
2326
2327       /* Fill in the PLT entry itself.  */
2328       riscv_make_plt_entry (got_address, header_address + h->plt.offset,
2329                             plt_entry);
2330       for (i = 0; i < PLT_ENTRY_INSNS; i++)
2331         bfd_put_32 (output_bfd, plt_entry[i], loc + 4*i);
2332
2333       /* Fill in the initial value of the .got.plt entry.  */
2334       loc = htab->elf.sgotplt->contents
2335             + (got_address - sec_addr (htab->elf.sgotplt));
2336       bfd_put_NN (output_bfd, sec_addr (htab->elf.splt), loc);
2337
2338       /* Fill in the entry in the .rela.plt section.  */
2339       rela.r_offset = got_address;
2340       rela.r_addend = 0;
2341       rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_JUMP_SLOT);
2342
2343       loc = htab->elf.srelplt->contents + plt_idx * sizeof (ElfNN_External_Rela);
2344       bed->s->swap_reloca_out (output_bfd, &rela, loc);
2345
2346       if (!h->def_regular)
2347         {
2348           /* Mark the symbol as undefined, rather than as defined in
2349              the .plt section.  Leave the value alone.  */
2350           sym->st_shndx = SHN_UNDEF;
2351           /* If the symbol is weak, we do need to clear the value.
2352              Otherwise, the PLT entry would provide a definition for
2353              the symbol even if the symbol wasn't defined anywhere,
2354              and so the symbol would never be NULL.  */
2355           if (!h->ref_regular_nonweak)
2356             sym->st_value = 0;
2357         }
2358     }
2359
2360   if (h->got.offset != (bfd_vma) -1
2361       && !(riscv_elf_hash_entry (h)->tls_type & (GOT_TLS_GD | GOT_TLS_IE)))
2362     {
2363       asection *sgot;
2364       asection *srela;
2365       Elf_Internal_Rela rela;
2366
2367       /* This symbol has an entry in the GOT.  Set it up.  */
2368
2369       sgot = htab->elf.sgot;
2370       srela = htab->elf.srelgot;
2371       BFD_ASSERT (sgot != NULL && srela != NULL);
2372
2373       rela.r_offset = sec_addr (sgot) + (h->got.offset &~ (bfd_vma) 1);
2374
2375       /* If this is a -Bsymbolic link, and the symbol is defined
2376          locally, we just want to emit a RELATIVE reloc.  Likewise if
2377          the symbol was forced to be local because of a version file.
2378          The entry in the global offset table will already have been
2379          initialized in the relocate_section function.  */
2380       if (bfd_link_pic (info)
2381           && (info->symbolic || h->dynindx == -1)
2382           && h->def_regular)
2383         {
2384           asection *sec = h->root.u.def.section;
2385           rela.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2386           rela.r_addend = (h->root.u.def.value
2387                            + sec->output_section->vma
2388                            + sec->output_offset);
2389         }
2390       else
2391         {
2392           BFD_ASSERT (h->dynindx != -1);
2393           rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_NN);
2394           rela.r_addend = 0;
2395         }
2396
2397       bfd_put_NN (output_bfd, 0,
2398                   sgot->contents + (h->got.offset & ~(bfd_vma) 1));
2399       riscv_elf_append_rela (output_bfd, srela, &rela);
2400     }
2401
2402   if (h->needs_copy)
2403     {
2404       Elf_Internal_Rela rela;
2405       asection *s;
2406
2407       /* This symbols needs a copy reloc.  Set it up.  */
2408       BFD_ASSERT (h->dynindx != -1);
2409
2410       rela.r_offset = sec_addr (h->root.u.def.section) + h->root.u.def.value;
2411       rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_COPY);
2412       rela.r_addend = 0;
2413       if (h->root.u.def.section == htab->elf.sdynrelro)
2414         s = htab->elf.sreldynrelro;
2415       else
2416         s = htab->elf.srelbss;
2417       riscv_elf_append_rela (output_bfd, s, &rela);
2418     }
2419
2420   /* Mark some specially defined symbols as absolute.  */
2421   if (h == htab->elf.hdynamic
2422       || (h == htab->elf.hgot || h == htab->elf.hplt))
2423     sym->st_shndx = SHN_ABS;
2424
2425   return TRUE;
2426 }
2427
2428 /* Finish up the dynamic sections.  */
2429
2430 static bfd_boolean
2431 riscv_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
2432                   bfd *dynobj, asection *sdyn)
2433 {
2434   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2435   const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2436   size_t dynsize = bed->s->sizeof_dyn;
2437   bfd_byte *dyncon, *dynconend;
2438
2439   dynconend = sdyn->contents + sdyn->size;
2440   for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
2441     {
2442       Elf_Internal_Dyn dyn;
2443       asection *s;
2444
2445       bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
2446
2447       switch (dyn.d_tag)
2448         {
2449         case DT_PLTGOT:
2450           s = htab->elf.sgotplt;
2451           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2452           break;
2453         case DT_JMPREL:
2454           s = htab->elf.srelplt;
2455           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2456           break;
2457         case DT_PLTRELSZ:
2458           s = htab->elf.srelplt;
2459           dyn.d_un.d_val = s->size;
2460           break;
2461         default:
2462           continue;
2463         }
2464
2465       bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
2466     }
2467   return TRUE;
2468 }
2469
2470 static bfd_boolean
2471 riscv_elf_finish_dynamic_sections (bfd *output_bfd,
2472                                    struct bfd_link_info *info)
2473 {
2474   bfd *dynobj;
2475   asection *sdyn;
2476   struct riscv_elf_link_hash_table *htab;
2477
2478   htab = riscv_elf_hash_table (info);
2479   BFD_ASSERT (htab != NULL);
2480   dynobj = htab->elf.dynobj;
2481
2482   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
2483
2484   if (elf_hash_table (info)->dynamic_sections_created)
2485     {
2486       asection *splt;
2487       bfd_boolean ret;
2488
2489       splt = htab->elf.splt;
2490       BFD_ASSERT (splt != NULL && sdyn != NULL);
2491
2492       ret = riscv_finish_dyn (output_bfd, info, dynobj, sdyn);
2493
2494       if (!ret)
2495         return ret;
2496
2497       /* Fill in the head and tail entries in the procedure linkage table.  */
2498       if (splt->size > 0)
2499         {
2500           int i;
2501           uint32_t plt_header[PLT_HEADER_INSNS];
2502           riscv_make_plt_header (sec_addr (htab->elf.sgotplt),
2503                                  sec_addr (splt), plt_header);
2504
2505           for (i = 0; i < PLT_HEADER_INSNS; i++)
2506             bfd_put_32 (output_bfd, plt_header[i], splt->contents + 4*i);
2507
2508           elf_section_data (splt->output_section)->this_hdr.sh_entsize
2509             = PLT_ENTRY_SIZE;
2510         }
2511     }
2512
2513   if (htab->elf.sgotplt)
2514     {
2515       asection *output_section = htab->elf.sgotplt->output_section;
2516
2517       if (bfd_is_abs_section (output_section))
2518         {
2519           (*_bfd_error_handler)
2520             (_("discarded output section: `%A'"), htab->elf.sgotplt);
2521           return FALSE;
2522         }
2523
2524       if (htab->elf.sgotplt->size > 0)
2525         {
2526           /* Write the first two entries in .got.plt, needed for the dynamic
2527              linker.  */
2528           bfd_put_NN (output_bfd, (bfd_vma) -1, htab->elf.sgotplt->contents);
2529           bfd_put_NN (output_bfd, (bfd_vma) 0,
2530                       htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
2531         }
2532
2533       elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2534     }
2535
2536   if (htab->elf.sgot)
2537     {
2538       asection *output_section = htab->elf.sgot->output_section;
2539
2540       if (htab->elf.sgot->size > 0)
2541         {
2542           /* Set the first entry in the global offset table to the address of
2543              the dynamic section.  */
2544           bfd_vma val = sdyn ? sec_addr (sdyn) : 0;
2545           bfd_put_NN (output_bfd, val, htab->elf.sgot->contents);
2546         }
2547
2548       elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2549     }
2550
2551   return TRUE;
2552 }
2553
2554 /* Return address for Ith PLT stub in section PLT, for relocation REL
2555    or (bfd_vma) -1 if it should not be included.  */
2556
2557 static bfd_vma
2558 riscv_elf_plt_sym_val (bfd_vma i, const asection *plt,
2559                        const arelent *rel ATTRIBUTE_UNUSED)
2560 {
2561   return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
2562 }
2563
2564 static enum elf_reloc_type_class
2565 riscv_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2566                         const asection *rel_sec ATTRIBUTE_UNUSED,
2567                         const Elf_Internal_Rela *rela)
2568 {
2569   switch (ELFNN_R_TYPE (rela->r_info))
2570     {
2571     case R_RISCV_RELATIVE:
2572       return reloc_class_relative;
2573     case R_RISCV_JUMP_SLOT:
2574       return reloc_class_plt;
2575     case R_RISCV_COPY:
2576       return reloc_class_copy;
2577     default:
2578       return reloc_class_normal;
2579     }
2580 }
2581
2582 /* Merge backend specific data from an object file to the output
2583    object file when linking.  */
2584
2585 static bfd_boolean
2586 _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2587 {
2588   bfd *obfd = info->output_bfd;
2589   flagword new_flags = elf_elfheader (ibfd)->e_flags;
2590   flagword old_flags = elf_elfheader (obfd)->e_flags;
2591
2592   if (!is_riscv_elf (ibfd) || !is_riscv_elf (obfd))
2593     return TRUE;
2594
2595   if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
2596     {
2597       (*_bfd_error_handler)
2598         (_("%B: ABI is incompatible with that of the selected emulation:\n"
2599            "  target emulation `%s' does not match `%s'"),
2600          ibfd, bfd_get_target (ibfd), bfd_get_target (obfd));
2601       return FALSE;
2602     }
2603
2604   if (!_bfd_elf_merge_object_attributes (ibfd, info))
2605     return FALSE;
2606
2607   if (! elf_flags_init (obfd))
2608     {
2609       elf_flags_init (obfd) = TRUE;
2610       elf_elfheader (obfd)->e_flags = new_flags;
2611       return TRUE;
2612     }
2613
2614   /* Disallow linking different float ABIs.  */
2615   if ((old_flags ^ new_flags) & EF_RISCV_FLOAT_ABI)
2616     {
2617       (*_bfd_error_handler)
2618         (_("%B: can't link hard-float modules with soft-float modules"), ibfd);
2619       goto fail;
2620     }
2621
2622   /* Allow linking RVC and non-RVC, and keep the RVC flag.  */
2623   elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC;
2624
2625   return TRUE;
2626
2627 fail:
2628   bfd_set_error (bfd_error_bad_value);
2629   return FALSE;
2630 }
2631
2632 /* Delete some bytes from a section while relaxing.  */
2633
2634 static bfd_boolean
2635 riscv_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, size_t count)
2636 {
2637   unsigned int i, symcount;
2638   bfd_vma toaddr = sec->size;
2639   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
2640   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2641   unsigned int sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2642   struct bfd_elf_section_data *data = elf_section_data (sec);
2643   bfd_byte *contents = data->this_hdr.contents;
2644
2645   /* Actually delete the bytes.  */
2646   sec->size -= count;
2647   memmove (contents + addr, contents + addr + count, toaddr - addr - count);
2648
2649   /* Adjust the location of all of the relocs.  Note that we need not
2650      adjust the addends, since all PC-relative references must be against
2651      symbols, which we will adjust below.  */
2652   for (i = 0; i < sec->reloc_count; i++)
2653     if (data->relocs[i].r_offset > addr && data->relocs[i].r_offset < toaddr)
2654       data->relocs[i].r_offset -= count;
2655
2656   /* Adjust the local symbols defined in this section.  */
2657   for (i = 0; i < symtab_hdr->sh_info; i++)
2658     {
2659       Elf_Internal_Sym *sym = (Elf_Internal_Sym *) symtab_hdr->contents + i;
2660       if (sym->st_shndx == sec_shndx)
2661         {
2662           /* If the symbol is in the range of memory we just moved, we
2663              have to adjust its value.  */
2664           if (sym->st_value > addr && sym->st_value <= toaddr)
2665             sym->st_value -= count;
2666
2667           /* If the symbol *spans* the bytes we just deleted (i.e. its
2668              *end* is in the moved bytes but its *start* isn't), then we
2669              must adjust its size.  */
2670           if (sym->st_value <= addr
2671               && sym->st_value + sym->st_size > addr
2672               && sym->st_value + sym->st_size <= toaddr)
2673             sym->st_size -= count;
2674         }
2675     }
2676
2677   /* Now adjust the global symbols defined in this section.  */
2678   symcount = ((symtab_hdr->sh_size / sizeof (ElfNN_External_Sym))
2679               - symtab_hdr->sh_info);
2680
2681   for (i = 0; i < symcount; i++)
2682     {
2683       struct elf_link_hash_entry *sym_hash = sym_hashes[i];
2684
2685       if ((sym_hash->root.type == bfd_link_hash_defined
2686            || sym_hash->root.type == bfd_link_hash_defweak)
2687           && sym_hash->root.u.def.section == sec)
2688         {
2689           /* As above, adjust the value if needed.  */
2690           if (sym_hash->root.u.def.value > addr
2691               && sym_hash->root.u.def.value <= toaddr)
2692             sym_hash->root.u.def.value -= count;
2693
2694           /* As above, adjust the size if needed.  */
2695           if (sym_hash->root.u.def.value <= addr
2696               && sym_hash->root.u.def.value + sym_hash->size > addr
2697               && sym_hash->root.u.def.value + sym_hash->size <= toaddr)
2698             sym_hash->size -= count;
2699         }
2700     }
2701
2702   return TRUE;
2703 }
2704
2705 typedef bfd_boolean (*relax_func_t) (bfd *, asection *, asection *,
2706                                      struct bfd_link_info *,
2707                                      Elf_Internal_Rela *,
2708                                      bfd_vma, bfd_vma, bfd_vma, bfd_boolean *);
2709
2710 /* Relax AUIPC + JALR into JAL.  */
2711
2712 static bfd_boolean
2713 _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec,
2714                        struct bfd_link_info *link_info,
2715                        Elf_Internal_Rela *rel,
2716                        bfd_vma symval,
2717                        bfd_vma max_alignment,
2718                        bfd_vma reserve_size ATTRIBUTE_UNUSED,
2719                        bfd_boolean *again)
2720 {
2721   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2722   bfd_signed_vma foff = symval - (sec_addr (sec) + rel->r_offset);
2723   bfd_boolean near_zero = (symval + RISCV_IMM_REACH/2) < RISCV_IMM_REACH;
2724   bfd_vma auipc, jalr;
2725   int rd, r_type, len = 4, rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
2726
2727   /* If the call crosses section boundaries, an alignment directive could
2728      cause the PC-relative offset to later increase.  */
2729   if (VALID_UJTYPE_IMM (foff) && sym_sec->output_section != sec->output_section)
2730     foff += (foff < 0 ? -max_alignment : max_alignment);
2731
2732   /* See if this function call can be shortened.  */
2733   if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero))
2734     return TRUE;
2735
2736   /* Shorten the function call.  */
2737   BFD_ASSERT (rel->r_offset + 8 <= sec->size);
2738
2739   auipc = bfd_get_32 (abfd, contents + rel->r_offset);
2740   jalr = bfd_get_32 (abfd, contents + rel->r_offset + 4);
2741   rd = (jalr >> OP_SH_RD) & OP_MASK_RD;
2742   rvc = rvc && VALID_RVC_J_IMM (foff) && ARCH_SIZE == 32;
2743
2744   if (rvc && (rd == 0 || rd == X_RA))
2745     {
2746       /* Relax to C.J[AL] rd, addr.  */
2747       r_type = R_RISCV_RVC_JUMP;
2748       auipc = rd == 0 ? MATCH_C_J : MATCH_C_JAL;
2749       len = 2;
2750     }
2751   else if (VALID_UJTYPE_IMM (foff))
2752     {
2753       /* Relax to JAL rd, addr.  */
2754       r_type = R_RISCV_JAL;
2755       auipc = MATCH_JAL | (rd << OP_SH_RD);
2756     }
2757   else /* near_zero */
2758     {
2759       /* Relax to JALR rd, x0, addr.  */
2760       r_type = R_RISCV_LO12_I;
2761       auipc = MATCH_JALR | (rd << OP_SH_RD);
2762     }
2763
2764   /* Replace the R_RISCV_CALL reloc.  */
2765   rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), r_type);
2766   /* Replace the AUIPC.  */
2767   bfd_put (8 * len, abfd, auipc, contents + rel->r_offset);
2768
2769   /* Delete unnecessary JALR.  */
2770   *again = TRUE;
2771   return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + len, 8 - len);
2772 }
2773
2774 /* Traverse all output sections and return the max alignment.  */
2775
2776 static bfd_vma
2777 _bfd_riscv_get_max_alignment (asection *sec)
2778 {
2779   unsigned int max_alignment_power = 0;
2780   asection *o;
2781
2782   for (o = sec->output_section->owner->sections; o != NULL; o = o->next)
2783     {
2784       if (o->alignment_power > max_alignment_power)
2785         max_alignment_power = o->alignment_power;
2786     }
2787
2788   return (bfd_vma) 1 << max_alignment_power;
2789 }
2790
2791 /* Relax non-PIC global variable references.  */
2792
2793 static bfd_boolean
2794 _bfd_riscv_relax_lui (bfd *abfd,
2795                       asection *sec,
2796                       asection *sym_sec,
2797                       struct bfd_link_info *link_info,
2798                       Elf_Internal_Rela *rel,
2799                       bfd_vma symval,
2800                       bfd_vma max_alignment,
2801                       bfd_vma reserve_size,
2802                       bfd_boolean *again)
2803 {
2804   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2805   bfd_vma gp = riscv_global_pointer_value (link_info);
2806   int use_rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
2807
2808   /* Mergeable symbols and code might later move out of range.  */
2809   if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
2810     return TRUE;
2811
2812   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
2813
2814   if (gp)
2815     {
2816       /* If gp and the symbol are in the same output section, then
2817          consider only that section's alignment.  */
2818       struct bfd_link_hash_entry *h =
2819         bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE,
2820                               TRUE);
2821       if (h->u.def.section->output_section == sym_sec->output_section)
2822         max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
2823     }
2824
2825   /* Is the reference in range of x0 or gp?
2826      Valid gp range conservatively because of alignment issue.  */
2827   if (VALID_ITYPE_IMM (symval)
2828       || (symval >= gp
2829           && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
2830       || (symval < gp
2831           && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
2832     {
2833       unsigned sym = ELFNN_R_SYM (rel->r_info);
2834       switch (ELFNN_R_TYPE (rel->r_info))
2835         {
2836         case R_RISCV_LO12_I:
2837           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
2838           return TRUE;
2839
2840         case R_RISCV_LO12_S:
2841           rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
2842           return TRUE;
2843
2844         case R_RISCV_HI20:
2845           /* We can delete the unnecessary LUI and reloc.  */
2846           rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
2847           *again = TRUE;
2848           return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4);
2849
2850         default:
2851           abort ();
2852         }
2853     }
2854
2855   /* Can we relax LUI to C.LUI?  Alignment might move the section forward;
2856      account for this assuming page alignment at worst.  */
2857   if (use_rvc
2858       && ELFNN_R_TYPE (rel->r_info) == R_RISCV_HI20
2859       && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval))
2860       && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval + ELF_MAXPAGESIZE)))
2861     {
2862       /* Replace LUI with C.LUI if legal (i.e., rd != x2/sp).  */
2863       bfd_vma lui = bfd_get_32 (abfd, contents + rel->r_offset);
2864       if (((lui >> OP_SH_RD) & OP_MASK_RD) == X_SP)
2865         return TRUE;
2866
2867       lui = (lui & (OP_MASK_RD << OP_SH_RD)) | MATCH_C_LUI;
2868       bfd_put_32 (abfd, lui, contents + rel->r_offset);
2869
2870       /* Replace the R_RISCV_HI20 reloc.  */
2871       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_RVC_LUI);
2872
2873       *again = TRUE;
2874       return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + 2, 2);
2875     }
2876
2877   return TRUE;
2878 }
2879
2880 /* Relax non-PIC TLS references.  */
2881
2882 static bfd_boolean
2883 _bfd_riscv_relax_tls_le (bfd *abfd,
2884                          asection *sec,
2885                          asection *sym_sec ATTRIBUTE_UNUSED,
2886                          struct bfd_link_info *link_info,
2887                          Elf_Internal_Rela *rel,
2888                          bfd_vma symval,
2889                          bfd_vma max_alignment ATTRIBUTE_UNUSED,
2890                          bfd_vma reserve_size ATTRIBUTE_UNUSED,
2891                          bfd_boolean *again)
2892 {
2893   /* See if this symbol is in range of tp.  */
2894   if (RISCV_CONST_HIGH_PART (tpoff (link_info, symval)) != 0)
2895     return TRUE;
2896
2897   BFD_ASSERT (rel->r_offset + 4 <= sec->size);
2898   switch (ELFNN_R_TYPE (rel->r_info))
2899     {
2900     case R_RISCV_TPREL_LO12_I:
2901       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_I);
2902       return TRUE;
2903
2904     case R_RISCV_TPREL_LO12_S:
2905       rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_S);
2906       return TRUE;
2907
2908     case R_RISCV_TPREL_HI20:
2909     case R_RISCV_TPREL_ADD:
2910       /* We can delete the unnecessary instruction and reloc.  */
2911       rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
2912       *again = TRUE;
2913       return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4);
2914
2915     default:
2916       abort ();
2917     }
2918 }
2919
2920 /* Implement R_RISCV_ALIGN by deleting excess alignment NOPs.  */
2921
2922 static bfd_boolean
2923 _bfd_riscv_relax_align (bfd *abfd, asection *sec,
2924                         asection *sym_sec ATTRIBUTE_UNUSED,
2925                         struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
2926                         Elf_Internal_Rela *rel,
2927                         bfd_vma symval,
2928                         bfd_vma max_alignment ATTRIBUTE_UNUSED,
2929                         bfd_vma reserve_size ATTRIBUTE_UNUSED,
2930                         bfd_boolean *again ATTRIBUTE_UNUSED)
2931 {
2932   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2933   bfd_vma alignment = 1, pos;
2934   while (alignment <= rel->r_addend)
2935     alignment *= 2;
2936
2937   symval -= rel->r_addend;
2938   bfd_vma aligned_addr = ((symval - 1) & ~(alignment - 1)) + alignment;
2939   bfd_vma nop_bytes = aligned_addr - symval;
2940
2941   /* Once we've handled an R_RISCV_ALIGN, we can't relax anything else.  */
2942   sec->sec_flg0 = TRUE;
2943
2944   /* Make sure there are enough NOPs to actually achieve the alignment.  */
2945   if (rel->r_addend < nop_bytes)
2946     return FALSE;
2947
2948   /* Delete the reloc.  */
2949   rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
2950
2951   /* If the number of NOPs is already correct, there's nothing to do.  */
2952   if (nop_bytes == rel->r_addend)
2953     return TRUE;
2954
2955   /* Write as many RISC-V NOPs as we need.  */
2956   for (pos = 0; pos < (nop_bytes & -4); pos += 4)
2957     bfd_put_32 (abfd, RISCV_NOP, contents + rel->r_offset + pos);
2958
2959   /* Write a final RVC NOP if need be.  */
2960   if (nop_bytes % 4 != 0)
2961     bfd_put_16 (abfd, RVC_NOP, contents + rel->r_offset + pos);
2962
2963   /* Delete the excess bytes.  */
2964   return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + nop_bytes,
2965                                    rel->r_addend - nop_bytes);
2966 }
2967
2968 /* Relax a section.  Pass 0 shortens code sequences unless disabled.
2969    Pass 1, which cannot be disabled, handles code alignment directives.  */
2970
2971 static bfd_boolean
2972 _bfd_riscv_relax_section (bfd *abfd, asection *sec,
2973                           struct bfd_link_info *info,
2974                           bfd_boolean *again)
2975 {
2976   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
2977   struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2978   struct bfd_elf_section_data *data = elf_section_data (sec);
2979   Elf_Internal_Rela *relocs;
2980   bfd_boolean ret = FALSE;
2981   unsigned int i;
2982   bfd_vma max_alignment, reserve_size = 0;
2983
2984   *again = FALSE;
2985
2986   if (bfd_link_relocatable (info)
2987       || sec->sec_flg0
2988       || (sec->flags & SEC_RELOC) == 0
2989       || sec->reloc_count == 0
2990       || (info->disable_target_specific_optimizations
2991           && info->relax_pass == 0))
2992     return TRUE;
2993
2994   /* Read this BFD's relocs if we haven't done so already.  */
2995   if (data->relocs)
2996     relocs = data->relocs;
2997   else if (!(relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
2998                                                  info->keep_memory)))
2999     goto fail;
3000
3001   max_alignment = _bfd_riscv_get_max_alignment (sec);
3002
3003   /* Examine and consider relaxing each reloc.  */
3004   for (i = 0; i < sec->reloc_count; i++)
3005     {
3006       asection *sym_sec;
3007       Elf_Internal_Rela *rel = relocs + i;
3008       relax_func_t relax_func;
3009       int type = ELFNN_R_TYPE (rel->r_info);
3010       bfd_vma symval;
3011
3012       if (info->relax_pass == 0)
3013         {
3014           if (type == R_RISCV_CALL || type == R_RISCV_CALL_PLT)
3015             relax_func = _bfd_riscv_relax_call;
3016           else if (type == R_RISCV_HI20
3017                    || type == R_RISCV_LO12_I
3018                    || type == R_RISCV_LO12_S)
3019             relax_func = _bfd_riscv_relax_lui;
3020           else if (type == R_RISCV_TPREL_HI20
3021                    || type == R_RISCV_TPREL_ADD
3022                    || type == R_RISCV_TPREL_LO12_I
3023                    || type == R_RISCV_TPREL_LO12_S)
3024             relax_func = _bfd_riscv_relax_tls_le;
3025           else
3026             continue;
3027
3028           /* Only relax this reloc if it is paired with R_RISCV_RELAX.  */
3029           if (i == sec->reloc_count - 1
3030               || ELFNN_R_TYPE ((rel + 1)->r_info) != R_RISCV_RELAX
3031               || rel->r_offset != (rel + 1)->r_offset)
3032             continue;
3033
3034           /* Skip over the R_RISCV_RELAX.  */
3035           i++;
3036         }
3037       else if (type == R_RISCV_ALIGN)
3038         relax_func = _bfd_riscv_relax_align;
3039       else
3040         continue;
3041
3042       data->relocs = relocs;
3043
3044       /* Read this BFD's contents if we haven't done so already.  */
3045       if (!data->this_hdr.contents
3046           && !bfd_malloc_and_get_section (abfd, sec, &data->this_hdr.contents))
3047         goto fail;
3048
3049       /* Read this BFD's symbols if we haven't done so already.  */
3050       if (symtab_hdr->sh_info != 0
3051           && !symtab_hdr->contents
3052           && !(symtab_hdr->contents =
3053                (unsigned char *) bfd_elf_get_elf_syms (abfd, symtab_hdr,
3054                                                        symtab_hdr->sh_info,
3055                                                        0, NULL, NULL, NULL)))
3056         goto fail;
3057
3058       /* Get the value of the symbol referred to by the reloc.  */
3059       if (ELFNN_R_SYM (rel->r_info) < symtab_hdr->sh_info)
3060         {
3061           /* A local symbol.  */
3062           Elf_Internal_Sym *isym = ((Elf_Internal_Sym *) symtab_hdr->contents
3063                                     + ELFNN_R_SYM (rel->r_info));
3064           reserve_size = (isym->st_size - rel->r_addend) > isym->st_size
3065             ? 0 : isym->st_size - rel->r_addend;
3066
3067           if (isym->st_shndx == SHN_UNDEF)
3068             sym_sec = sec, symval = sec_addr (sec) + rel->r_offset;
3069           else
3070             {
3071               BFD_ASSERT (isym->st_shndx < elf_numsections (abfd));
3072               sym_sec = elf_elfsections (abfd)[isym->st_shndx]->bfd_section;
3073               if (sec_addr (sym_sec) == 0)
3074                 continue;
3075               symval = sec_addr (sym_sec) + isym->st_value;
3076             }
3077         }
3078       else
3079         {
3080           unsigned long indx;
3081           struct elf_link_hash_entry *h;
3082
3083           indx = ELFNN_R_SYM (rel->r_info) - symtab_hdr->sh_info;
3084           h = elf_sym_hashes (abfd)[indx];
3085
3086           while (h->root.type == bfd_link_hash_indirect
3087                  || h->root.type == bfd_link_hash_warning)
3088             h = (struct elf_link_hash_entry *) h->root.u.i.link;
3089
3090           if (h->plt.offset != MINUS_ONE)
3091             symval = sec_addr (htab->elf.splt) + h->plt.offset;
3092           else if (h->root.u.def.section->output_section == NULL
3093                    || (h->root.type != bfd_link_hash_defined
3094                        && h->root.type != bfd_link_hash_defweak))
3095             continue;
3096           else
3097             symval = sec_addr (h->root.u.def.section) + h->root.u.def.value;
3098
3099           if (h->type != STT_FUNC)
3100             reserve_size =
3101               (h->size - rel->r_addend) > h->size ? 0 : h->size - rel->r_addend;
3102           sym_sec = h->root.u.def.section;
3103         }
3104
3105       symval += rel->r_addend;
3106
3107       if (!relax_func (abfd, sec, sym_sec, info, rel, symval,
3108                        max_alignment, reserve_size, again))
3109         goto fail;
3110     }
3111
3112   ret = TRUE;
3113
3114 fail:
3115   if (relocs != data->relocs)
3116     free (relocs);
3117
3118   return ret;
3119 }
3120
3121 #if ARCH_SIZE == 32
3122 # define PRSTATUS_SIZE                  0 /* FIXME */
3123 # define PRSTATUS_OFFSET_PR_CURSIG      12
3124 # define PRSTATUS_OFFSET_PR_PID         24
3125 # define PRSTATUS_OFFSET_PR_REG         72
3126 # define ELF_GREGSET_T_SIZE             128
3127 # define PRPSINFO_SIZE                  128
3128 # define PRPSINFO_OFFSET_PR_PID         16
3129 # define PRPSINFO_OFFSET_PR_FNAME       32
3130 # define PRPSINFO_OFFSET_PR_PSARGS      48
3131 #else
3132 # define PRSTATUS_SIZE                  376
3133 # define PRSTATUS_OFFSET_PR_CURSIG      12
3134 # define PRSTATUS_OFFSET_PR_PID         32
3135 # define PRSTATUS_OFFSET_PR_REG         112
3136 # define ELF_GREGSET_T_SIZE             256
3137 # define PRPSINFO_SIZE                  136
3138 # define PRPSINFO_OFFSET_PR_PID         24
3139 # define PRPSINFO_OFFSET_PR_FNAME       40
3140 # define PRPSINFO_OFFSET_PR_PSARGS      56
3141 #endif
3142
3143 /* Support for core dump NOTE sections.  */
3144
3145 static bfd_boolean
3146 riscv_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3147 {
3148   switch (note->descsz)
3149     {
3150       default:
3151         return FALSE;
3152
3153       case PRSTATUS_SIZE:  /* sizeof(struct elf_prstatus) on Linux/RISC-V.  */
3154         /* pr_cursig */
3155         elf_tdata (abfd)->core->signal
3156           = bfd_get_16 (abfd, note->descdata + PRSTATUS_OFFSET_PR_CURSIG);
3157
3158         /* pr_pid */
3159         elf_tdata (abfd)->core->lwpid
3160           = bfd_get_32 (abfd, note->descdata + PRSTATUS_OFFSET_PR_PID);
3161         break;
3162     }
3163
3164   /* Make a ".reg/999" section.  */
3165   return _bfd_elfcore_make_pseudosection (abfd, ".reg", ELF_GREGSET_T_SIZE,
3166                                           note->descpos + PRSTATUS_OFFSET_PR_REG);
3167 }
3168
3169 static bfd_boolean
3170 riscv_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3171 {
3172   switch (note->descsz)
3173     {
3174       default:
3175         return FALSE;
3176
3177       case PRPSINFO_SIZE: /* sizeof(struct elf_prpsinfo) on Linux/RISC-V.  */
3178         /* pr_pid */
3179         elf_tdata (abfd)->core->pid
3180           = bfd_get_32 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PID);
3181
3182         /* pr_fname */
3183         elf_tdata (abfd)->core->program = _bfd_elfcore_strndup
3184           (abfd, note->descdata + PRPSINFO_OFFSET_PR_FNAME, 16);
3185
3186         /* pr_psargs */
3187         elf_tdata (abfd)->core->command = _bfd_elfcore_strndup
3188           (abfd, note->descdata + PRPSINFO_OFFSET_PR_PSARGS, 80);
3189         break;
3190     }
3191
3192   /* Note that for some reason, a spurious space is tacked
3193      onto the end of the args in some (at least one anyway)
3194      implementations, so strip it off if it exists.  */
3195
3196   {
3197     char *command = elf_tdata (abfd)->core->command;
3198     int n = strlen (command);
3199
3200     if (0 < n && command[n - 1] == ' ')
3201       command[n - 1] = '\0';
3202   }
3203
3204   return TRUE;
3205 }
3206
3207 /* Set the right mach type.  */
3208 static bfd_boolean
3209 riscv_elf_object_p (bfd *abfd)
3210 {
3211   /* There are only two mach types in RISCV currently.  */
3212   if (strcmp (abfd->xvec->name, "elf32-littleriscv") == 0)
3213     bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv32);
3214   else
3215     bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv64);
3216
3217   return TRUE;
3218 }
3219
3220
3221 #define TARGET_LITTLE_SYM               riscv_elfNN_vec
3222 #define TARGET_LITTLE_NAME              "elfNN-littleriscv"
3223
3224 #define elf_backend_reloc_type_class         riscv_reloc_type_class
3225
3226 #define bfd_elfNN_bfd_reloc_name_lookup      riscv_reloc_name_lookup
3227 #define bfd_elfNN_bfd_link_hash_table_create riscv_elf_link_hash_table_create
3228 #define bfd_elfNN_bfd_reloc_type_lookup      riscv_reloc_type_lookup
3229 #define bfd_elfNN_bfd_merge_private_bfd_data \
3230   _bfd_riscv_elf_merge_private_bfd_data
3231
3232 #define elf_backend_copy_indirect_symbol     riscv_elf_copy_indirect_symbol
3233 #define elf_backend_create_dynamic_sections  riscv_elf_create_dynamic_sections
3234 #define elf_backend_check_relocs             riscv_elf_check_relocs
3235 #define elf_backend_adjust_dynamic_symbol    riscv_elf_adjust_dynamic_symbol
3236 #define elf_backend_size_dynamic_sections    riscv_elf_size_dynamic_sections
3237 #define elf_backend_relocate_section         riscv_elf_relocate_section
3238 #define elf_backend_finish_dynamic_symbol    riscv_elf_finish_dynamic_symbol
3239 #define elf_backend_finish_dynamic_sections  riscv_elf_finish_dynamic_sections
3240 #define elf_backend_gc_mark_hook             riscv_elf_gc_mark_hook
3241 #define elf_backend_gc_sweep_hook            riscv_elf_gc_sweep_hook
3242 #define elf_backend_plt_sym_val              riscv_elf_plt_sym_val
3243 #define elf_backend_grok_prstatus            riscv_elf_grok_prstatus
3244 #define elf_backend_grok_psinfo              riscv_elf_grok_psinfo
3245 #define elf_backend_object_p                 riscv_elf_object_p
3246 #define elf_info_to_howto_rel                NULL
3247 #define elf_info_to_howto                    riscv_info_to_howto_rela
3248 #define bfd_elfNN_bfd_relax_section          _bfd_riscv_relax_section
3249
3250 #define elf_backend_init_index_section       _bfd_elf_init_1_index_section
3251
3252 #define elf_backend_can_gc_sections     1
3253 #define elf_backend_can_refcount        1
3254 #define elf_backend_want_got_plt        1
3255 #define elf_backend_plt_readonly        1
3256 #define elf_backend_plt_alignment       4
3257 #define elf_backend_want_plt_sym        1
3258 #define elf_backend_got_header_size     (ARCH_SIZE / 8)
3259 #define elf_backend_want_dynrelro       1
3260 #define elf_backend_rela_normal         1
3261 #define elf_backend_default_execstack   0
3262
3263 #include "elfNN-target.h"