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