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