]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elfnn-riscv.c
Fix PR gdb/20948: --write option to GDB causes segmentation fault
[thirdparty/binutils-gdb.git] / bfd / elfnn-riscv.c
CommitLineData
e23eba97 1/* RISC-V-specific support for NN-bit ELF.
219d1afa 2 Copyright (C) 2011-2018 Free Software Foundation, Inc.
e23eba97
NC
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
ff6f4d9b
PD
35/* Internal relocations used exclusively by the relaxation pass. */
36#define R_RISCV_DELETE (R_RISCV_max + 1)
37
e23eba97
NC
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
e23eba97
NC
58/* RISC-V ELF linker hash entry. */
59
60struct riscv_elf_link_hash_entry
61{
62 struct elf_link_hash_entry elf;
63
64 /* Track dynamic relocs copied for this symbol. */
3bf083ed 65 struct elf_dyn_relocs *dyn_relocs;
e23eba97
NC
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
78struct _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
104struct riscv_elf_link_hash_table
105{
106 struct elf_link_hash_table elf;
107
108 /* Short-cuts to get to dynamic linker sections. */
e23eba97
NC
109 asection *sdyntdata;
110
111 /* Small local sym to section mapping cache. */
112 struct sym_cache sym_cache;
fc3c5343
L
113
114 /* The max alignment of output sections. */
115 bfd_vma max_alignment;
e23eba97
NC
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
f3185997 124static bfd_boolean
0aa13fee 125riscv_info_to_howto_rela (bfd *abfd,
e23eba97
NC
126 arelent *cache_ptr,
127 Elf_Internal_Rela *dst)
128{
0aa13fee 129 cache_ptr->howto = riscv_elf_rtype_to_howto (abfd, ELFNN_R_TYPE (dst->r_info));
f3185997 130 return cache_ptr->howto != NULL;
e23eba97
NC
131}
132
133static void
134riscv_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
157static bfd_vma
158riscv_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
172static void
173riscv_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)
07d6d2b8 179 sub t1, t1, t3 # shifted .got.plt offset + hdr size + 12
e23eba97
NC
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
07d6d2b8
AM
184 l[w|d] t0, PTRSIZE(t0) # link map
185 jr t3 */
e23eba97
NC
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
199static void
200riscv_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));
1d65abb5 208 entry[1] = RISCV_ITYPE (LREG, X_T3, X_T3, RISCV_PCREL_LOW_PART (got, addr));
e23eba97
NC
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
215static struct bfd_hash_entry *
216link_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
246static struct bfd_link_hash_table *
247riscv_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
fc3c5343 264 ret->max_alignment = (bfd_vma) -1;
e23eba97
NC
265 return &ret->elf.root;
266}
267
268/* Create the .got section. */
269
270static bfd_boolean
271riscv_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. */
ce558b89 280 if (htab->sgot != NULL)
e23eba97
NC
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
337static bfd_boolean
338riscv_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
e23eba97
NC
352 if (!bfd_link_pic (info))
353 {
e23eba97
NC
354 htab->sdyntdata =
355 bfd_make_section_anyway_with_flags (dynobj, ".tdata.dyn",
13755f40
JW
356 (SEC_ALLOC | SEC_THREAD_LOCAL
357 | SEC_LINKER_CREATED));
e23eba97
NC
358 }
359
9d19e4fd
AM
360 if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss
361 || (!bfd_link_pic (info) && (!htab->elf.srelbss || !htab->sdyntdata)))
e23eba97
NC
362 abort ();
363
364 return TRUE;
365}
366
367/* Copy the extra info we tack onto an elf_link_hash_entry. */
368
369static void
370riscv_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 {
3bf083ed
AM
383 struct elf_dyn_relocs **pp;
384 struct elf_dyn_relocs *p;
e23eba97
NC
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 {
3bf083ed 390 struct elf_dyn_relocs *q;
e23eba97
NC
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
419static bfd_boolean
420riscv_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)
871b3ab2 429 (_("%pB: `%s' accessed both as normal and thread local symbol"),
e23eba97
NC
430 abfd, h ? h->root.root.string : "<local>");
431 return FALSE;
432 }
433 return TRUE;
434}
435
436static bfd_boolean
437riscv_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
469static bfd_boolean
470bad_static_reloc (bfd *abfd, unsigned r_type, struct elf_link_hash_entry *h)
471{
f3185997
NC
472 reloc_howto_type * r = riscv_elf_rtype_to_howto (abfd, r_type);
473
e23eba97 474 (*_bfd_error_handler)
871b3ab2 475 (_("%pB: relocation %s against `%s' can not be used when making a shared "
e23eba97 476 "object; recompile with -fPIC"),
f3185997
NC
477 abfd, r ? r->name : _("<unknown>"),
478 h != NULL ? h->root.root.string : "a local symbol");
e23eba97
NC
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
486static bfd_boolean
487riscv_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;
d42c267e 509 unsigned int r_symndx;
e23eba97
NC
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 {
871b3ab2 517 (*_bfd_error_handler) (_("%pB: bad symbol index: %d"),
e23eba97
NC
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;
e23eba97
NC
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. */
f3185997
NC
631 reloc_howto_type * r = riscv_elf_rtype_to_howto (abfd, r_type);
632
e23eba97
NC
633 if ((bfd_link_pic (info)
634 && (sec->flags & SEC_ALLOC) != 0
f3185997 635 && ((r != NULL && ! r->pc_relative)
e23eba97
NC
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 {
3bf083ed
AM
646 struct elf_dyn_relocs *p;
647 struct elf_dyn_relocs **head;
e23eba97
NC
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;
3bf083ed 686 head = (struct elf_dyn_relocs **) vpp;
e23eba97
NC
687 }
688
689 p = *head;
690 if (p == NULL || p->sec != sec)
691 {
692 bfd_size_type amt = sizeof *p;
3bf083ed 693 p = ((struct elf_dyn_relocs *)
e23eba97
NC
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;
f3185997 705 p->pc_count += r == NULL ? 0 : r->pc_relative;
e23eba97
NC
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
728static asection *
729riscv_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
63c1f59d
AM
746/* Find dynamic relocs for H that apply to read-only sections. */
747
748static asection *
749readonly_dynrelocs (struct elf_link_hash_entry *h)
750{
3bf083ed 751 struct elf_dyn_relocs *p;
63c1f59d
AM
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
e23eba97
NC
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
769static bfd_boolean
770riscv_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;
e23eba97 775 bfd *dynobj;
5474d94f 776 asection *s, *srel;
e23eba97
NC
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
60d67dc8 787 || h->is_weakalias
e23eba97
NC
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. */
60d67dc8 818 if (h->is_weakalias)
e23eba97 819 {
60d67dc8
AM
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;
e23eba97
NC
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
3bf083ed 849 /* If we don't find any dynamic relocs in read-only sections, then
e23eba97 850 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
3bf083ed 851 if (!readonly_dynrelocs (h))
e23eba97
NC
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. */
3bf083ed 871 eh = (struct riscv_elf_link_hash_entry *) h;
3df5cd13
AW
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)
5474d94f
AM
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 }
e23eba97
NC
887 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
888 {
5474d94f 889 srel->size += sizeof (ElfNN_External_Rela);
e23eba97
NC
890 h->needs_copy = 1;
891 }
892
5474d94f 893 return _bfd_elf_adjust_dynamic_copy (info, h, s);
e23eba97
NC
894}
895
896/* Allocate space in .plt, .got and associated reloc sections for
897 dynamic relocs. */
898
899static bfd_boolean
900allocate_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;
3bf083ed 905 struct elf_dyn_relocs *p;
e23eba97
NC
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;
6487709f
JW
1005 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
1006 && ! UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
e23eba97
NC
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 {
3bf083ed 1027 struct elf_dyn_relocs **pp;
e23eba97
NC
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 {
6487709f
JW
1045 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1046 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
e23eba97
NC
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
63c1f59d
AM
1102/* Set DF_TEXTREL if we find any dynamic relocs that apply to
1103 read-only sections. */
e23eba97
NC
1104
1105static bfd_boolean
63c1f59d 1106maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
e23eba97 1107{
63c1f59d 1108 asection *sec;
e23eba97 1109
63c1f59d
AM
1110 if (h->root.type == bfd_link_hash_indirect)
1111 return TRUE;
1112
1113 sec = readonly_dynrelocs (h);
1114 if (sec != NULL)
e23eba97 1115 {
63c1f59d 1116 struct bfd_link_info *info = (struct bfd_link_info *) info_p;
e23eba97 1117
63c1f59d
AM
1118 info->flags |= DF_TEXTREL;
1119 info->callbacks->minfo
c1c8c1ef 1120 (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
63c1f59d
AM
1121 sec->owner, h->root.root.string, sec);
1122
1123 /* Not an error, just cut short the traversal. */
1124 return FALSE;
e23eba97
NC
1125 }
1126 return TRUE;
1127}
1128
1129static bfd_boolean
1130riscv_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 {
3bf083ed 1170 struct elf_dyn_relocs *p;
e23eba97
NC
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
5474d94f
AM
1254 || s == htab->elf.sdynbss
1255 || s == htab->elf.sdynrelro)
e23eba97
NC
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)
63c1f59d 1334 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
e23eba97
NC
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
1352static bfd_vma
1353dtpoff (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
1363static bfd_vma
1364tpoff (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
1374static bfd_vma
1375riscv_global_pointer_value (struct bfd_link_info *info)
1376{
1377 struct bfd_link_hash_entry *h;
1378
b5292032 1379 h = bfd_link_hash_lookup (info->hash, RISCV_GP_SYMBOL, FALSE, FALSE, TRUE);
e23eba97
NC
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
1388static bfd_reloc_status_type
1389perform_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:
45f76423 1416 case R_RISCV_TPREL_I:
e23eba97
NC
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:
45f76423 1424 case R_RISCV_TPREL_S:
e23eba97
NC
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:
45f76423 1473 case R_RISCV_SUB6:
e23eba97
NC
1474 case R_RISCV_SUB8:
1475 case R_RISCV_SUB16:
1476 case R_RISCV_SUB32:
1477 case R_RISCV_SUB64:
45f76423
AW
1478 case R_RISCV_SET6:
1479 case R_RISCV_SET8:
1480 case R_RISCV_SET16:
1481 case R_RISCV_SET32:
a6cbf936 1482 case R_RISCV_32_PCREL:
e23eba97
NC
1483 case R_RISCV_TLS_DTPREL32:
1484 case R_RISCV_TLS_DTPREL64:
1485 break;
1486
ff6f4d9b
PD
1487 case R_RISCV_DELETE:
1488 return bfd_reloc_ok;
1489
e23eba97
NC
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
1504typedef struct
1505{
1506 bfd_vma address;
1507 bfd_vma value;
1508} riscv_pcrel_hi_reloc;
1509
1510typedef struct riscv_pcrel_lo_reloc
1511{
07d6d2b8
AM
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;
e23eba97
NC
1520} riscv_pcrel_lo_reloc;
1521
1522typedef struct
1523{
1524 htab_t hi_relocs;
1525 riscv_pcrel_lo_reloc *lo_relocs;
1526} riscv_pcrel_relocs;
1527
1528static hashval_t
1529riscv_pcrel_reloc_hash (const void *entry)
1530{
1531 const riscv_pcrel_hi_reloc *e = entry;
1532 return (hashval_t)(e->address >> 2);
1533}
1534
1535static bfd_boolean
1536riscv_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
1542static bfd_boolean
1543riscv_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
1552static void
1553riscv_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
1567static bfd_boolean
b1308d2c
PD
1568riscv_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)
e23eba97 1575{
b1308d2c
PD
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
1606static bfd_boolean
1607riscv_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};
e23eba97
NC
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
1623static bfd_boolean
1624riscv_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
1643static bfd_boolean
1644riscv_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)
07d6d2b8 1655 {
e23eba97
NC
1656 ((*r->info->callbacks->reloc_overflow)
1657 (r->info, NULL, r->name, r->howto->name, (bfd_vma) 0,
1658 input_bfd, r->input_section, r->reloc->r_offset));
1659 return TRUE;
07d6d2b8 1660 }
e23eba97
NC
1661
1662 perform_relocation (r->howto, r->reloc, entry->value, r->input_section,
1663 input_bfd, r->contents);
1664 }
1665
1666 return TRUE;
1667}
1668
1669/* Relocate a RISC-V ELF section.
1670
1671 The RELOCATE_SECTION function is called by the new ELF backend linker
1672 to handle the relocations for a section.
1673
1674 The relocs are always passed as Rela structures.
1675
1676 This function is responsible for adjusting the section contents as
1677 necessary, and (if generating a relocatable output file) adjusting
1678 the reloc addend as necessary.
1679
1680 This function does not have to worry about setting the reloc
1681 address or the reloc symbol index.
1682
1683 LOCAL_SYMS is a pointer to the swapped in local symbols.
1684
1685 LOCAL_SECTIONS is an array giving the section in the input file
1686 corresponding to the st_shndx field of each local symbol.
1687
1688 The global hash table entry for the global symbols can be found
1689 via elf_sym_hashes (input_bfd).
1690
1691 When generating relocatable output, this function must handle
1692 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
1693 going to be the section symbol corresponding to the output
1694 section, which means that the addend must be adjusted
1695 accordingly. */
1696
1697static bfd_boolean
1698riscv_elf_relocate_section (bfd *output_bfd,
1699 struct bfd_link_info *info,
1700 bfd *input_bfd,
1701 asection *input_section,
1702 bfd_byte *contents,
1703 Elf_Internal_Rela *relocs,
1704 Elf_Internal_Sym *local_syms,
1705 asection **local_sections)
1706{
1707 Elf_Internal_Rela *rel;
1708 Elf_Internal_Rela *relend;
1709 riscv_pcrel_relocs pcrel_relocs;
1710 bfd_boolean ret = FALSE;
1711 asection *sreloc = elf_section_data (input_section)->sreloc;
1712 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
1713 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_bfd);
1714 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
1715 bfd_vma *local_got_offsets = elf_local_got_offsets (input_bfd);
b1308d2c 1716 bfd_boolean absolute;
e23eba97
NC
1717
1718 if (!riscv_init_pcrel_relocs (&pcrel_relocs))
1719 return FALSE;
1720
1721 relend = relocs + input_section->reloc_count;
1722 for (rel = relocs; rel < relend; rel++)
1723 {
1724 unsigned long r_symndx;
1725 struct elf_link_hash_entry *h;
1726 Elf_Internal_Sym *sym;
1727 asection *sec;
1728 bfd_vma relocation;
1729 bfd_reloc_status_type r = bfd_reloc_ok;
1730 const char *name;
1731 bfd_vma off, ie_off;
1732 bfd_boolean unresolved_reloc, is_ie = FALSE;
1733 bfd_vma pc = sec_addr (input_section) + rel->r_offset;
1734 int r_type = ELFNN_R_TYPE (rel->r_info), tls_type;
0aa13fee 1735 reloc_howto_type *howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
e23eba97 1736 const char *msg = NULL;
6487709f 1737 bfd_boolean resolved_to_zero;
e23eba97 1738
f3185997
NC
1739 if (howto == NULL
1740 || r_type == R_RISCV_GNU_VTINHERIT || r_type == R_RISCV_GNU_VTENTRY)
e23eba97
NC
1741 continue;
1742
1743 /* This is a final link. */
1744 r_symndx = ELFNN_R_SYM (rel->r_info);
1745 h = NULL;
1746 sym = NULL;
1747 sec = NULL;
1748 unresolved_reloc = FALSE;
1749 if (r_symndx < symtab_hdr->sh_info)
1750 {
1751 sym = local_syms + r_symndx;
1752 sec = local_sections[r_symndx];
1753 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1754 }
1755 else
1756 {
1757 bfd_boolean warned, ignored;
1758
1759 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1760 r_symndx, symtab_hdr, sym_hashes,
1761 h, sec, relocation,
1762 unresolved_reloc, warned, ignored);
1763 if (warned)
1764 {
1765 /* To avoid generating warning messages about truncated
1766 relocations, set the relocation's address to be the same as
1767 the start of this section. */
1768 if (input_section->output_section != NULL)
1769 relocation = input_section->output_section->vma;
1770 else
1771 relocation = 0;
1772 }
1773 }
1774
1775 if (sec != NULL && discarded_section (sec))
1776 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1777 rel, 1, relend, howto, 0, contents);
1778
1779 if (bfd_link_relocatable (info))
1780 continue;
1781
1782 if (h != NULL)
1783 name = h->root.root.string;
1784 else
1785 {
1786 name = (bfd_elf_string_from_elf_section
1787 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1788 if (name == NULL || *name == '\0')
1789 name = bfd_section_name (input_bfd, sec);
1790 }
1791
6487709f
JW
1792 resolved_to_zero = (h != NULL
1793 && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
1794
e23eba97
NC
1795 switch (r_type)
1796 {
1797 case R_RISCV_NONE:
45f76423 1798 case R_RISCV_RELAX:
e23eba97
NC
1799 case R_RISCV_TPREL_ADD:
1800 case R_RISCV_COPY:
1801 case R_RISCV_JUMP_SLOT:
1802 case R_RISCV_RELATIVE:
1803 /* These require nothing of us at all. */
1804 continue;
1805
1806 case R_RISCV_HI20:
1807 case R_RISCV_BRANCH:
1808 case R_RISCV_RVC_BRANCH:
1809 case R_RISCV_RVC_LUI:
1810 case R_RISCV_LO12_I:
1811 case R_RISCV_LO12_S:
45f76423
AW
1812 case R_RISCV_SET6:
1813 case R_RISCV_SET8:
1814 case R_RISCV_SET16:
1815 case R_RISCV_SET32:
a6cbf936 1816 case R_RISCV_32_PCREL:
ff6f4d9b 1817 case R_RISCV_DELETE:
e23eba97
NC
1818 /* These require no special handling beyond perform_relocation. */
1819 break;
1820
1821 case R_RISCV_GOT_HI20:
1822 if (h != NULL)
1823 {
1824 bfd_boolean dyn, pic;
1825
1826 off = h->got.offset;
1827 BFD_ASSERT (off != (bfd_vma) -1);
1828 dyn = elf_hash_table (info)->dynamic_sections_created;
1829 pic = bfd_link_pic (info);
1830
1831 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
1832 || (pic && SYMBOL_REFERENCES_LOCAL (info, h)))
1833 {
1834 /* This is actually a static link, or it is a
1835 -Bsymbolic link and the symbol is defined
1836 locally, or the symbol was forced to be local
1837 because of a version file. We must initialize
1838 this entry in the global offset table. Since the
1839 offset must always be a multiple of the word size,
1840 we use the least significant bit to record whether
1841 we have initialized it already.
1842
1843 When doing a dynamic link, we create a .rela.got
1844 relocation entry to initialize the value. This
1845 is done in the finish_dynamic_symbol routine. */
1846 if ((off & 1) != 0)
1847 off &= ~1;
1848 else
1849 {
1850 bfd_put_NN (output_bfd, relocation,
1851 htab->elf.sgot->contents + off);
1852 h->got.offset |= 1;
1853 }
1854 }
1855 else
1856 unresolved_reloc = FALSE;
1857 }
1858 else
1859 {
1860 BFD_ASSERT (local_got_offsets != NULL
1861 && local_got_offsets[r_symndx] != (bfd_vma) -1);
1862
1863 off = local_got_offsets[r_symndx];
1864
1865 /* The offset must always be a multiple of the word size.
1866 So, we can use the least significant bit to record
1867 whether we have already processed this entry. */
1868 if ((off & 1) != 0)
1869 off &= ~1;
1870 else
1871 {
1872 if (bfd_link_pic (info))
1873 {
1874 asection *s;
1875 Elf_Internal_Rela outrel;
1876
1877 /* We need to generate a R_RISCV_RELATIVE reloc
1878 for the dynamic linker. */
1879 s = htab->elf.srelgot;
1880 BFD_ASSERT (s != NULL);
1881
1882 outrel.r_offset = sec_addr (htab->elf.sgot) + off;
1883 outrel.r_info =
1884 ELFNN_R_INFO (0, R_RISCV_RELATIVE);
1885 outrel.r_addend = relocation;
1886 relocation = 0;
1887 riscv_elf_append_rela (output_bfd, s, &outrel);
1888 }
1889
1890 bfd_put_NN (output_bfd, relocation,
1891 htab->elf.sgot->contents + off);
1892 local_got_offsets[r_symndx] |= 1;
1893 }
1894 }
1895 relocation = sec_addr (htab->elf.sgot) + off;
b1308d2c
PD
1896 absolute = riscv_zero_pcrel_hi_reloc (rel,
1897 info,
1898 pc,
1899 relocation,
1900 contents,
1901 howto,
1902 input_bfd);
1903 r_type = ELFNN_R_TYPE (rel->r_info);
0aa13fee 1904 howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
f3185997
NC
1905 if (howto == NULL)
1906 r = bfd_reloc_notsupported;
1907 else if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
1908 relocation, absolute))
e23eba97
NC
1909 r = bfd_reloc_overflow;
1910 break;
1911
1912 case R_RISCV_ADD8:
1913 case R_RISCV_ADD16:
1914 case R_RISCV_ADD32:
1915 case R_RISCV_ADD64:
1916 {
1917 bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1918 contents + rel->r_offset);
1919 relocation = old_value + relocation;
1920 }
1921 break;
1922
45f76423 1923 case R_RISCV_SUB6:
e23eba97
NC
1924 case R_RISCV_SUB8:
1925 case R_RISCV_SUB16:
1926 case R_RISCV_SUB32:
1927 case R_RISCV_SUB64:
1928 {
1929 bfd_vma old_value = bfd_get (howto->bitsize, input_bfd,
1930 contents + rel->r_offset);
1931 relocation = old_value - relocation;
1932 }
1933 break;
1934
e23eba97 1935 case R_RISCV_CALL:
cf7a5066
JW
1936 /* Handle a call to an undefined weak function. This won't be
1937 relaxed, so we have to handle it here. */
1938 if (h != NULL && h->root.type == bfd_link_hash_undefweak
1939 && h->plt.offset == MINUS_ONE)
1940 {
1941 /* We can use x0 as the base register. */
1942 bfd_vma insn = bfd_get_32 (input_bfd,
1943 contents + rel->r_offset + 4);
1944 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1945 bfd_put_32 (input_bfd, insn, contents + rel->r_offset + 4);
1946 /* Set the relocation value so that we get 0 after the pc
1947 relative adjustment. */
1948 relocation = sec_addr (input_section) + rel->r_offset;
1949 }
1950 /* Fall through. */
1951
1952 case R_RISCV_CALL_PLT:
e23eba97
NC
1953 case R_RISCV_JAL:
1954 case R_RISCV_RVC_JUMP:
1955 if (bfd_link_pic (info) && h != NULL && h->plt.offset != MINUS_ONE)
1956 {
1957 /* Refer to the PLT entry. */
1958 relocation = sec_addr (htab->elf.splt) + h->plt.offset;
1959 unresolved_reloc = FALSE;
1960 }
1961 break;
1962
1963 case R_RISCV_TPREL_HI20:
1964 relocation = tpoff (info, relocation);
1965 break;
1966
1967 case R_RISCV_TPREL_LO12_I:
1968 case R_RISCV_TPREL_LO12_S:
45f76423
AW
1969 relocation = tpoff (info, relocation);
1970 break;
1971
1972 case R_RISCV_TPREL_I:
1973 case R_RISCV_TPREL_S:
e23eba97
NC
1974 relocation = tpoff (info, relocation);
1975 if (VALID_ITYPE_IMM (relocation + rel->r_addend))
1976 {
1977 /* We can use tp as the base register. */
1978 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
1979 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1980 insn |= X_TP << OP_SH_RS1;
1981 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
1982 }
45f76423
AW
1983 else
1984 r = bfd_reloc_overflow;
e23eba97
NC
1985 break;
1986
1987 case R_RISCV_GPREL_I:
1988 case R_RISCV_GPREL_S:
1989 {
1990 bfd_vma gp = riscv_global_pointer_value (info);
1991 bfd_boolean x0_base = VALID_ITYPE_IMM (relocation + rel->r_addend);
1992 if (x0_base || VALID_ITYPE_IMM (relocation + rel->r_addend - gp))
1993 {
1994 /* We can use x0 or gp as the base register. */
1995 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
1996 insn &= ~(OP_MASK_RS1 << OP_SH_RS1);
1997 if (!x0_base)
1998 {
1999 rel->r_addend -= gp;
2000 insn |= X_GP << OP_SH_RS1;
2001 }
2002 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
2003 }
2004 else
2005 r = bfd_reloc_overflow;
2006 break;
2007 }
2008
2009 case R_RISCV_PCREL_HI20:
b1308d2c
PD
2010 absolute = riscv_zero_pcrel_hi_reloc (rel,
2011 info,
2012 pc,
2013 relocation,
2014 contents,
2015 howto,
2016 input_bfd);
2017 r_type = ELFNN_R_TYPE (rel->r_info);
0aa13fee 2018 howto = riscv_elf_rtype_to_howto (input_bfd, r_type);
f3185997
NC
2019 if (howto == NULL)
2020 r = bfd_reloc_notsupported;
2021 else if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2022 relocation + rel->r_addend,
2023 absolute))
e23eba97
NC
2024 r = bfd_reloc_overflow;
2025 break;
2026
2027 case R_RISCV_PCREL_LO12_I:
2028 case R_RISCV_PCREL_LO12_S:
2a0d9853
JW
2029 /* Addends are not allowed, because then riscv_relax_delete_bytes
2030 would have to search through all relocs to update the addends.
2031 Also, riscv_resolve_pcrel_lo_relocs does not support addends
2032 when searching for a matching hi reloc. */
2033 if (rel->r_addend)
2034 {
2035 r = bfd_reloc_dangerous;
2036 break;
2037 }
2038
e23eba97
NC
2039 if (riscv_record_pcrel_lo_reloc (&pcrel_relocs, input_section, info,
2040 howto, rel, relocation, name,
2041 contents))
2042 continue;
2043 r = bfd_reloc_overflow;
2044 break;
2045
2046 case R_RISCV_TLS_DTPREL32:
2047 case R_RISCV_TLS_DTPREL64:
2048 relocation = dtpoff (info, relocation);
2049 break;
2050
2051 case R_RISCV_32:
2052 case R_RISCV_64:
2053 if ((input_section->flags & SEC_ALLOC) == 0)
2054 break;
2055
2056 if ((bfd_link_pic (info)
2057 && (h == NULL
6487709f
JW
2058 || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2059 && !resolved_to_zero)
e23eba97
NC
2060 || h->root.type != bfd_link_hash_undefweak)
2061 && (! howto->pc_relative
2062 || !SYMBOL_CALLS_LOCAL (info, h)))
2063 || (!bfd_link_pic (info)
2064 && h != NULL
2065 && h->dynindx != -1
2066 && !h->non_got_ref
2067 && ((h->def_dynamic
2068 && !h->def_regular)
2069 || h->root.type == bfd_link_hash_undefweak
2070 || h->root.type == bfd_link_hash_undefined)))
2071 {
2072 Elf_Internal_Rela outrel;
2073 bfd_boolean skip_static_relocation, skip_dynamic_relocation;
2074
2075 /* When generating a shared object, these relocations
2076 are copied into the output file to be resolved at run
2077 time. */
2078
2079 outrel.r_offset =
2080 _bfd_elf_section_offset (output_bfd, info, input_section,
2081 rel->r_offset);
2082 skip_static_relocation = outrel.r_offset != (bfd_vma) -2;
2083 skip_dynamic_relocation = outrel.r_offset >= (bfd_vma) -2;
2084 outrel.r_offset += sec_addr (input_section);
2085
2086 if (skip_dynamic_relocation)
2087 memset (&outrel, 0, sizeof outrel);
2088 else if (h != NULL && h->dynindx != -1
2089 && !(bfd_link_pic (info)
2090 && SYMBOLIC_BIND (info, h)
2091 && h->def_regular))
2092 {
2093 outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
2094 outrel.r_addend = rel->r_addend;
2095 }
2096 else
2097 {
2098 outrel.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2099 outrel.r_addend = relocation + rel->r_addend;
2100 }
2101
2102 riscv_elf_append_rela (output_bfd, sreloc, &outrel);
2103 if (skip_static_relocation)
2104 continue;
2105 }
2106 break;
2107
2108 case R_RISCV_TLS_GOT_HI20:
2109 is_ie = TRUE;
2110 /* Fall through. */
2111
2112 case R_RISCV_TLS_GD_HI20:
2113 if (h != NULL)
2114 {
2115 off = h->got.offset;
2116 h->got.offset |= 1;
2117 }
2118 else
2119 {
2120 off = local_got_offsets[r_symndx];
2121 local_got_offsets[r_symndx] |= 1;
2122 }
2123
2124 tls_type = _bfd_riscv_elf_tls_type (input_bfd, h, r_symndx);
2125 BFD_ASSERT (tls_type & (GOT_TLS_IE | GOT_TLS_GD));
2126 /* If this symbol is referenced by both GD and IE TLS, the IE
2127 reference's GOT slot follows the GD reference's slots. */
2128 ie_off = 0;
2129 if ((tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_IE))
2130 ie_off = 2 * GOT_ENTRY_SIZE;
2131
2132 if ((off & 1) != 0)
2133 off &= ~1;
2134 else
2135 {
2136 Elf_Internal_Rela outrel;
2137 int indx = 0;
2138 bfd_boolean need_relocs = FALSE;
2139
2140 if (htab->elf.srelgot == NULL)
2141 abort ();
2142
2143 if (h != NULL)
2144 {
2145 bfd_boolean dyn, pic;
2146 dyn = htab->elf.dynamic_sections_created;
2147 pic = bfd_link_pic (info);
2148
2149 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
2150 && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
2151 indx = h->dynindx;
2152 }
2153
2154 /* The GOT entries have not been initialized yet. Do it
07d6d2b8 2155 now, and emit any relocations. */
e23eba97
NC
2156 if ((bfd_link_pic (info) || indx != 0)
2157 && (h == NULL
2158 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2159 || h->root.type != bfd_link_hash_undefweak))
2160 need_relocs = TRUE;
2161
2162 if (tls_type & GOT_TLS_GD)
2163 {
2164 if (need_relocs)
2165 {
2166 outrel.r_offset = sec_addr (htab->elf.sgot) + off;
2167 outrel.r_addend = 0;
2168 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPMODNN);
2169 bfd_put_NN (output_bfd, 0,
2170 htab->elf.sgot->contents + off);
2171 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2172 if (indx == 0)
2173 {
2174 BFD_ASSERT (! unresolved_reloc);
2175 bfd_put_NN (output_bfd,
2176 dtpoff (info, relocation),
2177 (htab->elf.sgot->contents + off +
2178 RISCV_ELF_WORD_BYTES));
2179 }
2180 else
2181 {
2182 bfd_put_NN (output_bfd, 0,
2183 (htab->elf.sgot->contents + off +
2184 RISCV_ELF_WORD_BYTES));
2185 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_DTPRELNN);
2186 outrel.r_offset += RISCV_ELF_WORD_BYTES;
2187 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2188 }
2189 }
2190 else
2191 {
2192 /* If we are not emitting relocations for a
2193 general dynamic reference, then we must be in a
2194 static link or an executable link with the
2195 symbol binding locally. Mark it as belonging
2196 to module 1, the executable. */
2197 bfd_put_NN (output_bfd, 1,
2198 htab->elf.sgot->contents + off);
2199 bfd_put_NN (output_bfd,
2200 dtpoff (info, relocation),
2201 (htab->elf.sgot->contents + off +
2202 RISCV_ELF_WORD_BYTES));
2203 }
2204 }
2205
2206 if (tls_type & GOT_TLS_IE)
2207 {
2208 if (need_relocs)
2209 {
2210 bfd_put_NN (output_bfd, 0,
2211 htab->elf.sgot->contents + off + ie_off);
2212 outrel.r_offset = sec_addr (htab->elf.sgot)
2213 + off + ie_off;
2214 outrel.r_addend = 0;
2215 if (indx == 0)
2216 outrel.r_addend = tpoff (info, relocation);
2217 outrel.r_info = ELFNN_R_INFO (indx, R_RISCV_TLS_TPRELNN);
2218 riscv_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
2219 }
2220 else
2221 {
2222 bfd_put_NN (output_bfd, tpoff (info, relocation),
2223 htab->elf.sgot->contents + off + ie_off);
2224 }
2225 }
2226 }
2227
2228 BFD_ASSERT (off < (bfd_vma) -2);
2229 relocation = sec_addr (htab->elf.sgot) + off + (is_ie ? ie_off : 0);
b1308d2c
PD
2230 if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs, pc,
2231 relocation, FALSE))
e23eba97
NC
2232 r = bfd_reloc_overflow;
2233 unresolved_reloc = FALSE;
2234 break;
2235
2236 default:
2237 r = bfd_reloc_notsupported;
2238 }
2239
2240 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2241 because such sections are not SEC_ALLOC and thus ld.so will
2242 not process them. */
2243 if (unresolved_reloc
2244 && !((input_section->flags & SEC_DEBUGGING) != 0
2245 && h->def_dynamic)
2246 && _bfd_elf_section_offset (output_bfd, info, input_section,
2247 rel->r_offset) != (bfd_vma) -1)
2248 {
2249 (*_bfd_error_handler)
2dcf00ce
AM
2250 (_("%pB(%pA+%#" PRIx64 "): "
2251 "unresolvable %s relocation against symbol `%s'"),
e23eba97
NC
2252 input_bfd,
2253 input_section,
2dcf00ce 2254 (uint64_t) rel->r_offset,
e23eba97
NC
2255 howto->name,
2256 h->root.root.string);
2257 continue;
2258 }
2259
2260 if (r == bfd_reloc_ok)
2261 r = perform_relocation (howto, rel, relocation, input_section,
2262 input_bfd, contents);
2263
2264 switch (r)
2265 {
2266 case bfd_reloc_ok:
2267 continue;
2268
2269 case bfd_reloc_overflow:
2270 info->callbacks->reloc_overflow
2271 (info, (h ? &h->root : NULL), name, howto->name,
2272 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
2273 break;
2274
2275 case bfd_reloc_undefined:
2276 info->callbacks->undefined_symbol
2277 (info, name, input_bfd, input_section, rel->r_offset,
2278 TRUE);
2279 break;
2280
2281 case bfd_reloc_outofrange:
2a0d9853 2282 msg = _("%X%P: internal error: out of range error\n");
e23eba97
NC
2283 break;
2284
2285 case bfd_reloc_notsupported:
2a0d9853 2286 msg = _("%X%P: internal error: unsupported relocation error\n");
e23eba97
NC
2287 break;
2288
2289 case bfd_reloc_dangerous:
2a0d9853
JW
2290 info->callbacks->reloc_dangerous
2291 (info, "%pcrel_lo with addend", input_bfd, input_section,
2292 rel->r_offset);
e23eba97
NC
2293 break;
2294
2295 default:
2a0d9853 2296 msg = _("%X%P: internal error: unknown error\n");
e23eba97
NC
2297 break;
2298 }
2299
2300 if (msg)
2a0d9853
JW
2301 info->callbacks->einfo (msg);
2302
3f48fe4a
JW
2303 /* We already reported the error via a callback, so don't try to report
2304 it again by returning false. That leads to spurious errors. */
ed01220c 2305 ret = TRUE;
e23eba97
NC
2306 goto out;
2307 }
2308
2309 ret = riscv_resolve_pcrel_lo_relocs (&pcrel_relocs);
2310out:
2311 riscv_free_pcrel_relocs (&pcrel_relocs);
2312 return ret;
2313}
2314
2315/* Finish up dynamic symbol handling. We set the contents of various
2316 dynamic sections here. */
2317
2318static bfd_boolean
2319riscv_elf_finish_dynamic_symbol (bfd *output_bfd,
2320 struct bfd_link_info *info,
2321 struct elf_link_hash_entry *h,
2322 Elf_Internal_Sym *sym)
2323{
2324 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2325 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2326
2327 if (h->plt.offset != (bfd_vma) -1)
2328 {
2329 /* We've decided to create a PLT entry for this symbol. */
2330 bfd_byte *loc;
2331 bfd_vma i, header_address, plt_idx, got_address;
2332 uint32_t plt_entry[PLT_ENTRY_INSNS];
2333 Elf_Internal_Rela rela;
2334
2335 BFD_ASSERT (h->dynindx != -1);
2336
2337 /* Calculate the address of the PLT header. */
2338 header_address = sec_addr (htab->elf.splt);
2339
2340 /* Calculate the index of the entry. */
2341 plt_idx = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
2342
2343 /* Calculate the address of the .got.plt entry. */
2344 got_address = riscv_elf_got_plt_val (plt_idx, info);
2345
2346 /* Find out where the .plt entry should go. */
2347 loc = htab->elf.splt->contents + h->plt.offset;
2348
2349 /* Fill in the PLT entry itself. */
2350 riscv_make_plt_entry (got_address, header_address + h->plt.offset,
2351 plt_entry);
2352 for (i = 0; i < PLT_ENTRY_INSNS; i++)
2353 bfd_put_32 (output_bfd, plt_entry[i], loc + 4*i);
2354
2355 /* Fill in the initial value of the .got.plt entry. */
2356 loc = htab->elf.sgotplt->contents
2357 + (got_address - sec_addr (htab->elf.sgotplt));
2358 bfd_put_NN (output_bfd, sec_addr (htab->elf.splt), loc);
2359
2360 /* Fill in the entry in the .rela.plt section. */
2361 rela.r_offset = got_address;
2362 rela.r_addend = 0;
2363 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_JUMP_SLOT);
2364
2365 loc = htab->elf.srelplt->contents + plt_idx * sizeof (ElfNN_External_Rela);
2366 bed->s->swap_reloca_out (output_bfd, &rela, loc);
2367
2368 if (!h->def_regular)
2369 {
2370 /* Mark the symbol as undefined, rather than as defined in
2371 the .plt section. Leave the value alone. */
2372 sym->st_shndx = SHN_UNDEF;
2373 /* If the symbol is weak, we do need to clear the value.
2374 Otherwise, the PLT entry would provide a definition for
2375 the symbol even if the symbol wasn't defined anywhere,
2376 and so the symbol would never be NULL. */
2377 if (!h->ref_regular_nonweak)
2378 sym->st_value = 0;
2379 }
2380 }
2381
2382 if (h->got.offset != (bfd_vma) -1
6487709f
JW
2383 && !(riscv_elf_hash_entry (h)->tls_type & (GOT_TLS_GD | GOT_TLS_IE))
2384 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
e23eba97
NC
2385 {
2386 asection *sgot;
2387 asection *srela;
2388 Elf_Internal_Rela rela;
2389
2390 /* This symbol has an entry in the GOT. Set it up. */
2391
2392 sgot = htab->elf.sgot;
2393 srela = htab->elf.srelgot;
2394 BFD_ASSERT (sgot != NULL && srela != NULL);
2395
2396 rela.r_offset = sec_addr (sgot) + (h->got.offset &~ (bfd_vma) 1);
2397
25eb8346
JW
2398 /* If this is a local symbol reference, we just want to emit a RELATIVE
2399 reloc. This can happen if it is a -Bsymbolic link, or a pie link, or
e23eba97
NC
2400 the symbol was forced to be local because of a version file.
2401 The entry in the global offset table will already have been
2402 initialized in the relocate_section function. */
2403 if (bfd_link_pic (info)
25eb8346 2404 && SYMBOL_REFERENCES_LOCAL (info, h))
e23eba97 2405 {
25eb8346 2406 BFD_ASSERT((h->got.offset & 1) != 0);
e23eba97
NC
2407 asection *sec = h->root.u.def.section;
2408 rela.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE);
2409 rela.r_addend = (h->root.u.def.value
2410 + sec->output_section->vma
2411 + sec->output_offset);
2412 }
2413 else
2414 {
25eb8346 2415 BFD_ASSERT((h->got.offset & 1) == 0);
e23eba97
NC
2416 BFD_ASSERT (h->dynindx != -1);
2417 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_NN);
2418 rela.r_addend = 0;
2419 }
2420
2421 bfd_put_NN (output_bfd, 0,
2422 sgot->contents + (h->got.offset & ~(bfd_vma) 1));
2423 riscv_elf_append_rela (output_bfd, srela, &rela);
2424 }
2425
2426 if (h->needs_copy)
2427 {
2428 Elf_Internal_Rela rela;
5474d94f 2429 asection *s;
e23eba97
NC
2430
2431 /* This symbols needs a copy reloc. Set it up. */
2432 BFD_ASSERT (h->dynindx != -1);
2433
2434 rela.r_offset = sec_addr (h->root.u.def.section) + h->root.u.def.value;
2435 rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_COPY);
2436 rela.r_addend = 0;
afbf7e8e 2437 if (h->root.u.def.section == htab->elf.sdynrelro)
5474d94f
AM
2438 s = htab->elf.sreldynrelro;
2439 else
2440 s = htab->elf.srelbss;
2441 riscv_elf_append_rela (output_bfd, s, &rela);
e23eba97
NC
2442 }
2443
2444 /* Mark some specially defined symbols as absolute. */
2445 if (h == htab->elf.hdynamic
2446 || (h == htab->elf.hgot || h == htab->elf.hplt))
2447 sym->st_shndx = SHN_ABS;
2448
2449 return TRUE;
2450}
2451
2452/* Finish up the dynamic sections. */
2453
2454static bfd_boolean
2455riscv_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
2456 bfd *dynobj, asection *sdyn)
2457{
2458 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
2459 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2460 size_t dynsize = bed->s->sizeof_dyn;
2461 bfd_byte *dyncon, *dynconend;
2462
2463 dynconend = sdyn->contents + sdyn->size;
2464 for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
2465 {
2466 Elf_Internal_Dyn dyn;
2467 asection *s;
2468
2469 bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
2470
2471 switch (dyn.d_tag)
2472 {
2473 case DT_PLTGOT:
2474 s = htab->elf.sgotplt;
2475 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2476 break;
2477 case DT_JMPREL:
2478 s = htab->elf.srelplt;
2479 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2480 break;
2481 case DT_PLTRELSZ:
2482 s = htab->elf.srelplt;
2483 dyn.d_un.d_val = s->size;
2484 break;
2485 default:
2486 continue;
2487 }
2488
2489 bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
2490 }
2491 return TRUE;
2492}
2493
2494static bfd_boolean
2495riscv_elf_finish_dynamic_sections (bfd *output_bfd,
2496 struct bfd_link_info *info)
2497{
2498 bfd *dynobj;
2499 asection *sdyn;
2500 struct riscv_elf_link_hash_table *htab;
2501
2502 htab = riscv_elf_hash_table (info);
2503 BFD_ASSERT (htab != NULL);
2504 dynobj = htab->elf.dynobj;
2505
2506 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
2507
2508 if (elf_hash_table (info)->dynamic_sections_created)
2509 {
2510 asection *splt;
2511 bfd_boolean ret;
2512
2513 splt = htab->elf.splt;
2514 BFD_ASSERT (splt != NULL && sdyn != NULL);
2515
2516 ret = riscv_finish_dyn (output_bfd, info, dynobj, sdyn);
2517
535b785f 2518 if (!ret)
e23eba97
NC
2519 return ret;
2520
2521 /* Fill in the head and tail entries in the procedure linkage table. */
2522 if (splt->size > 0)
2523 {
2524 int i;
2525 uint32_t plt_header[PLT_HEADER_INSNS];
2526 riscv_make_plt_header (sec_addr (htab->elf.sgotplt),
2527 sec_addr (splt), plt_header);
2528
2529 for (i = 0; i < PLT_HEADER_INSNS; i++)
2530 bfd_put_32 (output_bfd, plt_header[i], splt->contents + 4*i);
e23eba97 2531
cc162427
AW
2532 elf_section_data (splt->output_section)->this_hdr.sh_entsize
2533 = PLT_ENTRY_SIZE;
2534 }
e23eba97
NC
2535 }
2536
2537 if (htab->elf.sgotplt)
2538 {
2539 asection *output_section = htab->elf.sgotplt->output_section;
2540
2541 if (bfd_is_abs_section (output_section))
2542 {
2543 (*_bfd_error_handler)
871b3ab2 2544 (_("discarded output section: `%pA'"), htab->elf.sgotplt);
e23eba97
NC
2545 return FALSE;
2546 }
2547
2548 if (htab->elf.sgotplt->size > 0)
2549 {
2550 /* Write the first two entries in .got.plt, needed for the dynamic
2551 linker. */
2552 bfd_put_NN (output_bfd, (bfd_vma) -1, htab->elf.sgotplt->contents);
2553 bfd_put_NN (output_bfd, (bfd_vma) 0,
2554 htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
2555 }
2556
2557 elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2558 }
2559
2560 if (htab->elf.sgot)
2561 {
2562 asection *output_section = htab->elf.sgot->output_section;
2563
2564 if (htab->elf.sgot->size > 0)
2565 {
2566 /* Set the first entry in the global offset table to the address of
2567 the dynamic section. */
2568 bfd_vma val = sdyn ? sec_addr (sdyn) : 0;
2569 bfd_put_NN (output_bfd, val, htab->elf.sgot->contents);
2570 }
2571
2572 elf_section_data (output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
2573 }
2574
2575 return TRUE;
2576}
2577
2578/* Return address for Ith PLT stub in section PLT, for relocation REL
2579 or (bfd_vma) -1 if it should not be included. */
2580
2581static bfd_vma
2582riscv_elf_plt_sym_val (bfd_vma i, const asection *plt,
2583 const arelent *rel ATTRIBUTE_UNUSED)
2584{
2585 return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
2586}
2587
2588static enum elf_reloc_type_class
2589riscv_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2590 const asection *rel_sec ATTRIBUTE_UNUSED,
2591 const Elf_Internal_Rela *rela)
2592{
2593 switch (ELFNN_R_TYPE (rela->r_info))
2594 {
2595 case R_RISCV_RELATIVE:
2596 return reloc_class_relative;
2597 case R_RISCV_JUMP_SLOT:
2598 return reloc_class_plt;
2599 case R_RISCV_COPY:
2600 return reloc_class_copy;
2601 default:
2602 return reloc_class_normal;
2603 }
2604}
2605
2606/* Merge backend specific data from an object file to the output
2607 object file when linking. */
2608
2609static bfd_boolean
2610_bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2611{
2612 bfd *obfd = info->output_bfd;
2613 flagword new_flags = elf_elfheader (ibfd)->e_flags;
2614 flagword old_flags = elf_elfheader (obfd)->e_flags;
2615
2616 if (!is_riscv_elf (ibfd) || !is_riscv_elf (obfd))
2617 return TRUE;
2618
2619 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
2620 {
2621 (*_bfd_error_handler)
871b3ab2 2622 (_("%pB: ABI is incompatible with that of the selected emulation:\n"
96b0927d
PD
2623 " target emulation `%s' does not match `%s'"),
2624 ibfd, bfd_get_target (ibfd), bfd_get_target (obfd));
e23eba97
NC
2625 return FALSE;
2626 }
2627
2628 if (!_bfd_elf_merge_object_attributes (ibfd, info))
2629 return FALSE;
2630
2631 if (! elf_flags_init (obfd))
2632 {
2633 elf_flags_init (obfd) = TRUE;
2634 elf_elfheader (obfd)->e_flags = new_flags;
2635 return TRUE;
2636 }
2637
2922d21d
AW
2638 /* Disallow linking different float ABIs. */
2639 if ((old_flags ^ new_flags) & EF_RISCV_FLOAT_ABI)
e23eba97
NC
2640 {
2641 (*_bfd_error_handler)
871b3ab2 2642 (_("%pB: can't link hard-float modules with soft-float modules"), ibfd);
e23eba97
NC
2643 goto fail;
2644 }
2645
7f999549
JW
2646 /* Disallow linking RVE and non-RVE. */
2647 if ((old_flags ^ new_flags) & EF_RISCV_RVE)
2648 {
2649 (*_bfd_error_handler)
2650 (_("%pB: can't link RVE with other target"), ibfd);
2651 goto fail;
2652 }
2653
e23eba97
NC
2654 /* Allow linking RVC and non-RVC, and keep the RVC flag. */
2655 elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC;
2656
2657 return TRUE;
2658
2659fail:
2660 bfd_set_error (bfd_error_bad_value);
2661 return FALSE;
2662}
2663
2664/* Delete some bytes from a section while relaxing. */
2665
2666static bfd_boolean
7f02625e
JW
2667riscv_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, size_t count,
2668 struct bfd_link_info *link_info)
e23eba97
NC
2669{
2670 unsigned int i, symcount;
2671 bfd_vma toaddr = sec->size;
2672 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
2673 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2674 unsigned int sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2675 struct bfd_elf_section_data *data = elf_section_data (sec);
2676 bfd_byte *contents = data->this_hdr.contents;
2677
2678 /* Actually delete the bytes. */
2679 sec->size -= count;
2680 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
2681
2682 /* Adjust the location of all of the relocs. Note that we need not
2683 adjust the addends, since all PC-relative references must be against
2684 symbols, which we will adjust below. */
2685 for (i = 0; i < sec->reloc_count; i++)
2686 if (data->relocs[i].r_offset > addr && data->relocs[i].r_offset < toaddr)
2687 data->relocs[i].r_offset -= count;
2688
2689 /* Adjust the local symbols defined in this section. */
2690 for (i = 0; i < symtab_hdr->sh_info; i++)
2691 {
2692 Elf_Internal_Sym *sym = (Elf_Internal_Sym *) symtab_hdr->contents + i;
2693 if (sym->st_shndx == sec_shndx)
2694 {
2695 /* If the symbol is in the range of memory we just moved, we
2696 have to adjust its value. */
2697 if (sym->st_value > addr && sym->st_value <= toaddr)
2698 sym->st_value -= count;
2699
2700 /* If the symbol *spans* the bytes we just deleted (i.e. its
2701 *end* is in the moved bytes but its *start* isn't), then we
788af978
JW
2702 must adjust its size.
2703
2704 This test needs to use the original value of st_value, otherwise
2705 we might accidentally decrease size when deleting bytes right
2706 before the symbol. But since deleted relocs can't span across
2707 symbols, we can't have both a st_value and a st_size decrease,
2708 so it is simpler to just use an else. */
2709 else if (sym->st_value <= addr
2710 && sym->st_value + sym->st_size > addr
2711 && sym->st_value + sym->st_size <= toaddr)
e23eba97
NC
2712 sym->st_size -= count;
2713 }
2714 }
2715
2716 /* Now adjust the global symbols defined in this section. */
2717 symcount = ((symtab_hdr->sh_size / sizeof (ElfNN_External_Sym))
2718 - symtab_hdr->sh_info);
2719
2720 for (i = 0; i < symcount; i++)
2721 {
2722 struct elf_link_hash_entry *sym_hash = sym_hashes[i];
2723
7f02625e
JW
2724 /* The '--wrap SYMBOL' option is causing a pain when the object file,
2725 containing the definition of __wrap_SYMBOL, includes a direct
2726 call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
2727 the same symbol (which is __wrap_SYMBOL), but still exist as two
2728 different symbols in 'sym_hashes', we don't want to adjust
137b5cbd
JW
2729 the global symbol __wrap_SYMBOL twice. */
2730 /* The same problem occurs with symbols that are versioned_hidden, as
2731 foo becomes an alias for foo@BAR, and hence they need the same
2732 treatment. */
2733 if (link_info->wrap_hash != NULL
2734 || sym_hash->versioned == versioned_hidden)
7f02625e
JW
2735 {
2736 struct elf_link_hash_entry **cur_sym_hashes;
2737
2738 /* Loop only over the symbols which have already been checked. */
2739 for (cur_sym_hashes = sym_hashes; cur_sym_hashes < &sym_hashes[i];
2740 cur_sym_hashes++)
2741 {
2742 /* If the current symbol is identical to 'sym_hash', that means
2743 the symbol was already adjusted (or at least checked). */
2744 if (*cur_sym_hashes == sym_hash)
2745 break;
2746 }
2747 /* Don't adjust the symbol again. */
2748 if (cur_sym_hashes < &sym_hashes[i])
2749 continue;
2750 }
2751
e23eba97
NC
2752 if ((sym_hash->root.type == bfd_link_hash_defined
2753 || sym_hash->root.type == bfd_link_hash_defweak)
2754 && sym_hash->root.u.def.section == sec)
2755 {
2756 /* As above, adjust the value if needed. */
2757 if (sym_hash->root.u.def.value > addr
2758 && sym_hash->root.u.def.value <= toaddr)
2759 sym_hash->root.u.def.value -= count;
2760
2761 /* As above, adjust the size if needed. */
788af978
JW
2762 else if (sym_hash->root.u.def.value <= addr
2763 && sym_hash->root.u.def.value + sym_hash->size > addr
2764 && sym_hash->root.u.def.value + sym_hash->size <= toaddr)
e23eba97
NC
2765 sym_hash->size -= count;
2766 }
2767 }
2768
2769 return TRUE;
2770}
2771
9d06997a
PD
2772/* A second format for recording PC-relative hi relocations. This stores the
2773 information required to relax them to GP-relative addresses. */
2774
2775typedef struct riscv_pcgp_hi_reloc riscv_pcgp_hi_reloc;
2776struct riscv_pcgp_hi_reloc
2777{
2778 bfd_vma hi_sec_off;
2779 bfd_vma hi_addend;
2780 bfd_vma hi_addr;
2781 unsigned hi_sym;
2782 asection *sym_sec;
2783 riscv_pcgp_hi_reloc *next;
2784};
2785
2786typedef struct riscv_pcgp_lo_reloc riscv_pcgp_lo_reloc;
2787struct riscv_pcgp_lo_reloc
2788{
2789 bfd_vma hi_sec_off;
2790 riscv_pcgp_lo_reloc *next;
2791};
2792
2793typedef struct
2794{
2795 riscv_pcgp_hi_reloc *hi;
2796 riscv_pcgp_lo_reloc *lo;
2797} riscv_pcgp_relocs;
2798
2799static bfd_boolean
2800riscv_init_pcgp_relocs (riscv_pcgp_relocs *p)
2801{
2802 p->hi = NULL;
2803 p->lo = NULL;
2804 return TRUE;
2805}
2806
2807static void
2808riscv_free_pcgp_relocs (riscv_pcgp_relocs *p,
2809 bfd *abfd ATTRIBUTE_UNUSED,
2810 asection *sec ATTRIBUTE_UNUSED)
2811{
2812 riscv_pcgp_hi_reloc *c;
2813 riscv_pcgp_lo_reloc *l;
2814
2815 for (c = p->hi; c != NULL;)
2816 {
2817 riscv_pcgp_hi_reloc *next = c->next;
2818 free (c);
2819 c = next;
2820 }
2821
2822 for (l = p->lo; l != NULL;)
2823 {
2824 riscv_pcgp_lo_reloc *next = l->next;
2825 free (l);
2826 l = next;
2827 }
2828}
2829
2830static bfd_boolean
2831riscv_record_pcgp_hi_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off,
2832 bfd_vma hi_addend, bfd_vma hi_addr,
2833 unsigned hi_sym, asection *sym_sec)
2834{
2835 riscv_pcgp_hi_reloc *new = bfd_malloc (sizeof(*new));
2836 if (!new)
2837 return FALSE;
2838 new->hi_sec_off = hi_sec_off;
2839 new->hi_addend = hi_addend;
2840 new->hi_addr = hi_addr;
2841 new->hi_sym = hi_sym;
2842 new->sym_sec = sym_sec;
2843 new->next = p->hi;
2844 p->hi = new;
2845 return TRUE;
2846}
2847
2848static riscv_pcgp_hi_reloc *
2849riscv_find_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2850{
2851 riscv_pcgp_hi_reloc *c;
2852
2853 for (c = p->hi; c != NULL; c = c->next)
2854 if (c->hi_sec_off == hi_sec_off)
2855 return c;
2856 return NULL;
2857}
2858
2859static bfd_boolean
2860riscv_delete_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2861{
2862 bfd_boolean out = FALSE;
2863 riscv_pcgp_hi_reloc *c;
2864
2865 for (c = p->hi; c != NULL; c = c->next)
2866 if (c->hi_sec_off == hi_sec_off)
2867 out = TRUE;
2868
2869 return out;
2870}
2871
2872static bfd_boolean
2873riscv_use_pcgp_hi_reloc(riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2874{
2875 bfd_boolean out = FALSE;
2876 riscv_pcgp_hi_reloc *c;
2877
2878 for (c = p->hi; c != NULL; c = c->next)
2879 if (c->hi_sec_off == hi_sec_off)
2880 out = TRUE;
2881
2882 return out;
2883}
2884
2885static bfd_boolean
2886riscv_record_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2887{
2888 riscv_pcgp_lo_reloc *new = bfd_malloc (sizeof(*new));
2889 if (!new)
2890 return FALSE;
2891 new->hi_sec_off = hi_sec_off;
2892 new->next = p->lo;
2893 p->lo = new;
2894 return TRUE;
2895}
2896
2897static bfd_boolean
2898riscv_find_pcgp_lo_reloc (riscv_pcgp_relocs *p, bfd_vma hi_sec_off)
2899{
2900 riscv_pcgp_lo_reloc *c;
2901
2902 for (c = p->lo; c != NULL; c = c->next)
2903 if (c->hi_sec_off == hi_sec_off)
2904 return TRUE;
2905 return FALSE;
2906}
2907
2908static bfd_boolean
2909riscv_delete_pcgp_lo_reloc (riscv_pcgp_relocs *p ATTRIBUTE_UNUSED,
2910 bfd_vma lo_sec_off ATTRIBUTE_UNUSED,
2911 size_t bytes ATTRIBUTE_UNUSED)
2912{
2913 return TRUE;
2914}
2915
45f76423
AW
2916typedef bfd_boolean (*relax_func_t) (bfd *, asection *, asection *,
2917 struct bfd_link_info *,
2918 Elf_Internal_Rela *,
9d06997a
PD
2919 bfd_vma, bfd_vma, bfd_vma, bfd_boolean *,
2920 riscv_pcgp_relocs *);
45f76423 2921
e23eba97
NC
2922/* Relax AUIPC + JALR into JAL. */
2923
2924static bfd_boolean
2925_bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec,
2926 struct bfd_link_info *link_info,
2927 Elf_Internal_Rela *rel,
2928 bfd_vma symval,
45f76423
AW
2929 bfd_vma max_alignment,
2930 bfd_vma reserve_size ATTRIBUTE_UNUSED,
9d06997a
PD
2931 bfd_boolean *again,
2932 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
e23eba97
NC
2933{
2934 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
2935 bfd_signed_vma foff = symval - (sec_addr (sec) + rel->r_offset);
2936 bfd_boolean near_zero = (symval + RISCV_IMM_REACH/2) < RISCV_IMM_REACH;
2937 bfd_vma auipc, jalr;
2938 int rd, r_type, len = 4, rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
2939
2940 /* If the call crosses section boundaries, an alignment directive could
2941 cause the PC-relative offset to later increase. */
2942 if (VALID_UJTYPE_IMM (foff) && sym_sec->output_section != sec->output_section)
2943 foff += (foff < 0 ? -max_alignment : max_alignment);
2944
2945 /* See if this function call can be shortened. */
2946 if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero))
2947 return TRUE;
2948
2949 /* Shorten the function call. */
2950 BFD_ASSERT (rel->r_offset + 8 <= sec->size);
2951
2952 auipc = bfd_get_32 (abfd, contents + rel->r_offset);
2953 jalr = bfd_get_32 (abfd, contents + rel->r_offset + 4);
2954 rd = (jalr >> OP_SH_RD) & OP_MASK_RD;
2955 rvc = rvc && VALID_RVC_J_IMM (foff) && ARCH_SIZE == 32;
2956
2957 if (rvc && (rd == 0 || rd == X_RA))
2958 {
2959 /* Relax to C.J[AL] rd, addr. */
2960 r_type = R_RISCV_RVC_JUMP;
2961 auipc = rd == 0 ? MATCH_C_J : MATCH_C_JAL;
2962 len = 2;
2963 }
2964 else if (VALID_UJTYPE_IMM (foff))
2965 {
2966 /* Relax to JAL rd, addr. */
2967 r_type = R_RISCV_JAL;
2968 auipc = MATCH_JAL | (rd << OP_SH_RD);
2969 }
2970 else /* near_zero */
2971 {
2972 /* Relax to JALR rd, x0, addr. */
2973 r_type = R_RISCV_LO12_I;
2974 auipc = MATCH_JALR | (rd << OP_SH_RD);
2975 }
2976
2977 /* Replace the R_RISCV_CALL reloc. */
2978 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), r_type);
2979 /* Replace the AUIPC. */
2980 bfd_put (8 * len, abfd, auipc, contents + rel->r_offset);
2981
2982 /* Delete unnecessary JALR. */
2983 *again = TRUE;
7f02625e
JW
2984 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + len, 8 - len,
2985 link_info);
e23eba97
NC
2986}
2987
2988/* Traverse all output sections and return the max alignment. */
2989
1d61f794 2990static bfd_vma
e23eba97
NC
2991_bfd_riscv_get_max_alignment (asection *sec)
2992{
2993 unsigned int max_alignment_power = 0;
2994 asection *o;
2995
2996 for (o = sec->output_section->owner->sections; o != NULL; o = o->next)
2997 {
2998 if (o->alignment_power > max_alignment_power)
2999 max_alignment_power = o->alignment_power;
3000 }
3001
1d61f794 3002 return (bfd_vma) 1 << max_alignment_power;
e23eba97
NC
3003}
3004
3005/* Relax non-PIC global variable references. */
3006
3007static bfd_boolean
3008_bfd_riscv_relax_lui (bfd *abfd,
3009 asection *sec,
3010 asection *sym_sec,
3011 struct bfd_link_info *link_info,
3012 Elf_Internal_Rela *rel,
3013 bfd_vma symval,
45f76423
AW
3014 bfd_vma max_alignment,
3015 bfd_vma reserve_size,
9d06997a
PD
3016 bfd_boolean *again,
3017 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
e23eba97
NC
3018{
3019 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
3020 bfd_vma gp = riscv_global_pointer_value (link_info);
3021 int use_rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
3022
3023 /* Mergeable symbols and code might later move out of range. */
3024 if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
3025 return TRUE;
3026
3027 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3028
d0f744f9
AW
3029 if (gp)
3030 {
3031 /* If gp and the symbol are in the same output section, then
3032 consider only that section's alignment. */
3033 struct bfd_link_hash_entry *h =
b5292032
PD
3034 bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE,
3035 TRUE);
d0f744f9
AW
3036 if (h->u.def.section->output_section == sym_sec->output_section)
3037 max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
3038 }
3039
e23eba97
NC
3040 /* Is the reference in range of x0 or gp?
3041 Valid gp range conservatively because of alignment issue. */
3042 if (VALID_ITYPE_IMM (symval)
45f76423
AW
3043 || (symval >= gp
3044 && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
3045 || (symval < gp
3046 && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
e23eba97
NC
3047 {
3048 unsigned sym = ELFNN_R_SYM (rel->r_info);
3049 switch (ELFNN_R_TYPE (rel->r_info))
3050 {
3051 case R_RISCV_LO12_I:
3052 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
3053 return TRUE;
3054
3055 case R_RISCV_LO12_S:
3056 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
3057 return TRUE;
3058
3059 case R_RISCV_HI20:
3060 /* We can delete the unnecessary LUI and reloc. */
3061 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3062 *again = TRUE;
7f02625e
JW
3063 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4,
3064 link_info);
e23eba97
NC
3065
3066 default:
3067 abort ();
3068 }
3069 }
3070
3071 /* Can we relax LUI to C.LUI? Alignment might move the section forward;
3072 account for this assuming page alignment at worst. */
3073 if (use_rvc
3074 && ELFNN_R_TYPE (rel->r_info) == R_RISCV_HI20
3075 && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval))
3076 && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval + ELF_MAXPAGESIZE)))
3077 {
3342be5d 3078 /* Replace LUI with C.LUI if legal (i.e., rd != x0 and rd != x2/sp). */
e23eba97 3079 bfd_vma lui = bfd_get_32 (abfd, contents + rel->r_offset);
3342be5d
AW
3080 unsigned rd = ((unsigned)lui >> OP_SH_RD) & OP_MASK_RD;
3081 if (rd == 0 || rd == X_SP)
e23eba97
NC
3082 return TRUE;
3083
3084 lui = (lui & (OP_MASK_RD << OP_SH_RD)) | MATCH_C_LUI;
3085 bfd_put_32 (abfd, lui, contents + rel->r_offset);
3086
3087 /* Replace the R_RISCV_HI20 reloc. */
3088 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_RVC_LUI);
3089
3090 *again = TRUE;
7f02625e
JW
3091 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + 2, 2,
3092 link_info);
e23eba97
NC
3093 }
3094
3095 return TRUE;
3096}
3097
3098/* Relax non-PIC TLS references. */
3099
3100static bfd_boolean
3101_bfd_riscv_relax_tls_le (bfd *abfd,
3102 asection *sec,
3103 asection *sym_sec ATTRIBUTE_UNUSED,
3104 struct bfd_link_info *link_info,
3105 Elf_Internal_Rela *rel,
3106 bfd_vma symval,
45f76423
AW
3107 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3108 bfd_vma reserve_size ATTRIBUTE_UNUSED,
9d06997a
PD
3109 bfd_boolean *again,
3110 riscv_pcgp_relocs *prcel_relocs ATTRIBUTE_UNUSED)
e23eba97
NC
3111{
3112 /* See if this symbol is in range of tp. */
3113 if (RISCV_CONST_HIGH_PART (tpoff (link_info, symval)) != 0)
3114 return TRUE;
3115
e23eba97 3116 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
45f76423
AW
3117 switch (ELFNN_R_TYPE (rel->r_info))
3118 {
3119 case R_RISCV_TPREL_LO12_I:
3120 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_I);
3121 return TRUE;
e23eba97 3122
45f76423
AW
3123 case R_RISCV_TPREL_LO12_S:
3124 rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info), R_RISCV_TPREL_S);
3125 return TRUE;
3126
3127 case R_RISCV_TPREL_HI20:
3128 case R_RISCV_TPREL_ADD:
3129 /* We can delete the unnecessary instruction and reloc. */
3130 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3131 *again = TRUE;
7f02625e 3132 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset, 4, link_info);
45f76423
AW
3133
3134 default:
3135 abort ();
3136 }
e23eba97
NC
3137}
3138
3139/* Implement R_RISCV_ALIGN by deleting excess alignment NOPs. */
3140
3141static bfd_boolean
3142_bfd_riscv_relax_align (bfd *abfd, asection *sec,
9eb7b0ac 3143 asection *sym_sec,
7f02625e 3144 struct bfd_link_info *link_info,
e23eba97
NC
3145 Elf_Internal_Rela *rel,
3146 bfd_vma symval,
45f76423
AW
3147 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3148 bfd_vma reserve_size ATTRIBUTE_UNUSED,
9d06997a
PD
3149 bfd_boolean *again ATTRIBUTE_UNUSED,
3150 riscv_pcgp_relocs *pcrel_relocs ATTRIBUTE_UNUSED)
e23eba97
NC
3151{
3152 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
3153 bfd_vma alignment = 1, pos;
3154 while (alignment <= rel->r_addend)
3155 alignment *= 2;
3156
3157 symval -= rel->r_addend;
3158 bfd_vma aligned_addr = ((symval - 1) & ~(alignment - 1)) + alignment;
3159 bfd_vma nop_bytes = aligned_addr - symval;
3160
3161 /* Once we've handled an R_RISCV_ALIGN, we can't relax anything else. */
3162 sec->sec_flg0 = TRUE;
3163
3164 /* Make sure there are enough NOPs to actually achieve the alignment. */
3165 if (rel->r_addend < nop_bytes)
9eb7b0ac 3166 {
f2b740ac
AM
3167 _bfd_error_handler
3168 (_("%pB(%pA+%#" PRIx64 "): %" PRId64 " bytes required for alignment "
3169 "to %" PRId64 "-byte boundary, but only %" PRId64 " present"),
3170 abfd, sym_sec, (uint64_t) rel->r_offset,
3171 (int64_t) nop_bytes, (int64_t) alignment, (int64_t) rel->r_addend);
9eb7b0ac
PD
3172 bfd_set_error (bfd_error_bad_value);
3173 return FALSE;
3174 }
e23eba97
NC
3175
3176 /* Delete the reloc. */
3177 rel->r_info = ELFNN_R_INFO (0, R_RISCV_NONE);
3178
3179 /* If the number of NOPs is already correct, there's nothing to do. */
3180 if (nop_bytes == rel->r_addend)
3181 return TRUE;
3182
3183 /* Write as many RISC-V NOPs as we need. */
3184 for (pos = 0; pos < (nop_bytes & -4); pos += 4)
3185 bfd_put_32 (abfd, RISCV_NOP, contents + rel->r_offset + pos);
3186
3187 /* Write a final RVC NOP if need be. */
3188 if (nop_bytes % 4 != 0)
3189 bfd_put_16 (abfd, RVC_NOP, contents + rel->r_offset + pos);
3190
3191 /* Delete the excess bytes. */
3192 return riscv_relax_delete_bytes (abfd, sec, rel->r_offset + nop_bytes,
7f02625e 3193 rel->r_addend - nop_bytes, link_info);
e23eba97
NC
3194}
3195
ff6f4d9b
PD
3196/* Relax PC-relative references to GP-relative references. */
3197
9d06997a
PD
3198static bfd_boolean
3199_bfd_riscv_relax_pc (bfd *abfd,
3200 asection *sec,
3201 asection *sym_sec,
3202 struct bfd_link_info *link_info,
3203 Elf_Internal_Rela *rel,
3204 bfd_vma symval,
3205 bfd_vma max_alignment,
3206 bfd_vma reserve_size,
3207 bfd_boolean *again ATTRIBUTE_UNUSED,
3208 riscv_pcgp_relocs *pcgp_relocs)
3209{
3210 bfd_vma gp = riscv_global_pointer_value (link_info);
3211
3212 BFD_ASSERT (rel->r_offset + 4 <= sec->size);
3213
3214 /* Chain the _LO relocs to their cooresponding _HI reloc to compute the
3215 * actual target address. */
e65b1a78
MR
3216 riscv_pcgp_hi_reloc hi_reloc;
3217 memset (&hi_reloc, 0, sizeof (hi_reloc));
9d06997a
PD
3218 switch (ELFNN_R_TYPE (rel->r_info))
3219 {
3220 case R_RISCV_PCREL_LO12_I:
3221 case R_RISCV_PCREL_LO12_S:
3222 {
3223 riscv_pcgp_hi_reloc *hi = riscv_find_pcgp_hi_reloc (pcgp_relocs,
3224 symval - sec_addr(sym_sec));
3225 if (hi == NULL)
3226 {
3227 riscv_record_pcgp_lo_reloc (pcgp_relocs, symval - sec_addr(sym_sec));
3228 return TRUE;
3229 }
3230
3231 hi_reloc = *hi;
3232 symval = hi_reloc.hi_addr;
3233 sym_sec = hi_reloc.sym_sec;
3234 if (!riscv_use_pcgp_hi_reloc(pcgp_relocs, hi->hi_sec_off))
f2b740ac
AM
3235 _bfd_error_handler
3236 (_("%pB(%pA+%#" PRIx64 "): Unable to clear RISCV_PCREL_HI20 reloc "
3237 "for corresponding RISCV_PCREL_LO12 reloc"),
3238 abfd, sec, (uint64_t) rel->r_offset);
9d06997a
PD
3239 }
3240 break;
3241
3242 case R_RISCV_PCREL_HI20:
3243 /* Mergeable symbols and code might later move out of range. */
3244 if (sym_sec->flags & (SEC_MERGE | SEC_CODE))
3245 return TRUE;
3246
3247 /* If the cooresponding lo relocation has already been seen then it's not
3248 * safe to relax this relocation. */
3249 if (riscv_find_pcgp_lo_reloc (pcgp_relocs, rel->r_offset))
07d6d2b8 3250 return TRUE;
9d06997a
PD
3251
3252 break;
3253
3254 default:
3255 abort ();
3256 }
3257
3258 if (gp)
3259 {
3260 /* If gp and the symbol are in the same output section, then
3261 consider only that section's alignment. */
3262 struct bfd_link_hash_entry *h =
3263 bfd_link_hash_lookup (link_info->hash, RISCV_GP_SYMBOL, FALSE, FALSE, TRUE);
3264 if (h->u.def.section->output_section == sym_sec->output_section)
3265 max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
3266 }
3267
3268 /* Is the reference in range of x0 or gp?
3269 Valid gp range conservatively because of alignment issue. */
3270 if (VALID_ITYPE_IMM (symval)
3271 || (symval >= gp
3272 && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
3273 || (symval < gp
3274 && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
3275 {
3276 unsigned sym = hi_reloc.hi_sym;
3277 switch (ELFNN_R_TYPE (rel->r_info))
3278 {
3279 case R_RISCV_PCREL_LO12_I:
3280 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_I);
3281 rel->r_addend += hi_reloc.hi_addend;
3282 return riscv_delete_pcgp_lo_reloc (pcgp_relocs, rel->r_offset, 4);
3283
3284 case R_RISCV_PCREL_LO12_S:
3285 rel->r_info = ELFNN_R_INFO (sym, R_RISCV_GPREL_S);
3286 rel->r_addend += hi_reloc.hi_addend;
3287 return riscv_delete_pcgp_lo_reloc (pcgp_relocs, rel->r_offset, 4);
3288
3289 case R_RISCV_PCREL_HI20:
07d6d2b8 3290 riscv_record_pcgp_hi_reloc (pcgp_relocs,
9d06997a
PD
3291 rel->r_offset,
3292 rel->r_addend,
3293 symval,
3294 ELFNN_R_SYM(rel->r_info),
3295 sym_sec);
3296 /* We can delete the unnecessary AUIPC and reloc. */
3297 rel->r_info = ELFNN_R_INFO (0, R_RISCV_DELETE);
3298 rel->r_addend = 4;
3299 return riscv_delete_pcgp_hi_reloc (pcgp_relocs, rel->r_offset);
3300
3301 default:
3302 abort ();
3303 }
3304 }
3305
3306 return TRUE;
3307}
3308
3309/* Relax PC-relative references to GP-relative references. */
3310
ff6f4d9b
PD
3311static bfd_boolean
3312_bfd_riscv_relax_delete (bfd *abfd,
3313 asection *sec,
3314 asection *sym_sec ATTRIBUTE_UNUSED,
7f02625e 3315 struct bfd_link_info *link_info,
ff6f4d9b
PD
3316 Elf_Internal_Rela *rel,
3317 bfd_vma symval ATTRIBUTE_UNUSED,
3318 bfd_vma max_alignment ATTRIBUTE_UNUSED,
3319 bfd_vma reserve_size ATTRIBUTE_UNUSED,
9d06997a
PD
3320 bfd_boolean *again ATTRIBUTE_UNUSED,
3321 riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED)
ff6f4d9b 3322{
7f02625e
JW
3323 if (!riscv_relax_delete_bytes(abfd, sec, rel->r_offset, rel->r_addend,
3324 link_info))
ff6f4d9b
PD
3325 return FALSE;
3326 rel->r_info = ELFNN_R_INFO(0, R_RISCV_NONE);
3327 return TRUE;
3328}
3329
3330/* Relax a section. Pass 0 shortens code sequences unless disabled. Pass 1
3331 deletes the bytes that pass 0 made obselete. Pass 2, which cannot be
3332 disabled, handles code alignment directives. */
e23eba97
NC
3333
3334static bfd_boolean
3335_bfd_riscv_relax_section (bfd *abfd, asection *sec,
3336 struct bfd_link_info *info,
3337 bfd_boolean *again)
3338{
3339 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (abfd);
3340 struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (info);
3341 struct bfd_elf_section_data *data = elf_section_data (sec);
3342 Elf_Internal_Rela *relocs;
3343 bfd_boolean ret = FALSE;
3344 unsigned int i;
45f76423 3345 bfd_vma max_alignment, reserve_size = 0;
9d06997a 3346 riscv_pcgp_relocs pcgp_relocs;
e23eba97
NC
3347
3348 *again = FALSE;
3349
3350 if (bfd_link_relocatable (info)
3351 || sec->sec_flg0
3352 || (sec->flags & SEC_RELOC) == 0
3353 || sec->reloc_count == 0
3354 || (info->disable_target_specific_optimizations
3355 && info->relax_pass == 0))
3356 return TRUE;
3357
9d06997a
PD
3358 riscv_init_pcgp_relocs (&pcgp_relocs);
3359
e23eba97
NC
3360 /* Read this BFD's relocs if we haven't done so already. */
3361 if (data->relocs)
3362 relocs = data->relocs;
3363 else if (!(relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
3364 info->keep_memory)))
3365 goto fail;
3366
fc3c5343
L
3367 if (htab)
3368 {
3369 max_alignment = htab->max_alignment;
3370 if (max_alignment == (bfd_vma) -1)
3371 {
3372 max_alignment = _bfd_riscv_get_max_alignment (sec);
3373 htab->max_alignment = max_alignment;
3374 }
3375 }
3376 else
3377 max_alignment = _bfd_riscv_get_max_alignment (sec);
e23eba97
NC
3378
3379 /* Examine and consider relaxing each reloc. */
3380 for (i = 0; i < sec->reloc_count; i++)
3381 {
3382 asection *sym_sec;
3383 Elf_Internal_Rela *rel = relocs + i;
45f76423 3384 relax_func_t relax_func;
e23eba97
NC
3385 int type = ELFNN_R_TYPE (rel->r_info);
3386 bfd_vma symval;
3387
ff6f4d9b 3388 relax_func = NULL;
e23eba97
NC
3389 if (info->relax_pass == 0)
3390 {
3391 if (type == R_RISCV_CALL || type == R_RISCV_CALL_PLT)
3392 relax_func = _bfd_riscv_relax_call;
3393 else if (type == R_RISCV_HI20
3394 || type == R_RISCV_LO12_I
3395 || type == R_RISCV_LO12_S)
3396 relax_func = _bfd_riscv_relax_lui;
9d06997a
PD
3397 else if (!bfd_link_pic(info)
3398 && (type == R_RISCV_PCREL_HI20
3399 || type == R_RISCV_PCREL_LO12_I
3400 || type == R_RISCV_PCREL_LO12_S))
3401 relax_func = _bfd_riscv_relax_pc;
45f76423
AW
3402 else if (type == R_RISCV_TPREL_HI20
3403 || type == R_RISCV_TPREL_ADD
3404 || type == R_RISCV_TPREL_LO12_I
3405 || type == R_RISCV_TPREL_LO12_S)
e23eba97 3406 relax_func = _bfd_riscv_relax_tls_le;
45f76423
AW
3407 else
3408 continue;
3409
3410 /* Only relax this reloc if it is paired with R_RISCV_RELAX. */
3411 if (i == sec->reloc_count - 1
3412 || ELFNN_R_TYPE ((rel + 1)->r_info) != R_RISCV_RELAX
3413 || rel->r_offset != (rel + 1)->r_offset)
3414 continue;
3415
3416 /* Skip over the R_RISCV_RELAX. */
3417 i++;
e23eba97 3418 }
ff6f4d9b 3419 else if (info->relax_pass == 1 && type == R_RISCV_DELETE)
07d6d2b8 3420 relax_func = _bfd_riscv_relax_delete;
ff6f4d9b 3421 else if (info->relax_pass == 2 && type == R_RISCV_ALIGN)
e23eba97 3422 relax_func = _bfd_riscv_relax_align;
45f76423 3423 else
e23eba97
NC
3424 continue;
3425
3426 data->relocs = relocs;
3427
3428 /* Read this BFD's contents if we haven't done so already. */
3429 if (!data->this_hdr.contents
3430 && !bfd_malloc_and_get_section (abfd, sec, &data->this_hdr.contents))
3431 goto fail;
3432
3433 /* Read this BFD's symbols if we haven't done so already. */
3434 if (symtab_hdr->sh_info != 0
3435 && !symtab_hdr->contents
3436 && !(symtab_hdr->contents =
3437 (unsigned char *) bfd_elf_get_elf_syms (abfd, symtab_hdr,
3438 symtab_hdr->sh_info,
3439 0, NULL, NULL, NULL)))
3440 goto fail;
3441
3442 /* Get the value of the symbol referred to by the reloc. */
3443 if (ELFNN_R_SYM (rel->r_info) < symtab_hdr->sh_info)
3444 {
3445 /* A local symbol. */
3446 Elf_Internal_Sym *isym = ((Elf_Internal_Sym *) symtab_hdr->contents
3447 + ELFNN_R_SYM (rel->r_info));
45f76423
AW
3448 reserve_size = (isym->st_size - rel->r_addend) > isym->st_size
3449 ? 0 : isym->st_size - rel->r_addend;
e23eba97
NC
3450
3451 if (isym->st_shndx == SHN_UNDEF)
3452 sym_sec = sec, symval = sec_addr (sec) + rel->r_offset;
3453 else
3454 {
3455 BFD_ASSERT (isym->st_shndx < elf_numsections (abfd));
3456 sym_sec = elf_elfsections (abfd)[isym->st_shndx]->bfd_section;
09ca4b9d
JW
3457#if 0
3458 /* The purpose of this code is unknown. It breaks linker scripts
3459 for embedded development that place sections at address zero.
3460 This code is believed to be unnecessary. Disabling it but not
3461 yet removing it, in case something breaks. */
e23eba97
NC
3462 if (sec_addr (sym_sec) == 0)
3463 continue;
09ca4b9d 3464#endif
e23eba97
NC
3465 symval = sec_addr (sym_sec) + isym->st_value;
3466 }
3467 }
3468 else
3469 {
3470 unsigned long indx;
3471 struct elf_link_hash_entry *h;
3472
3473 indx = ELFNN_R_SYM (rel->r_info) - symtab_hdr->sh_info;
3474 h = elf_sym_hashes (abfd)[indx];
3475
3476 while (h->root.type == bfd_link_hash_indirect
3477 || h->root.type == bfd_link_hash_warning)
3478 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3479
3480 if (h->plt.offset != MINUS_ONE)
3481 symval = sec_addr (htab->elf.splt) + h->plt.offset;
3482 else if (h->root.u.def.section->output_section == NULL
3483 || (h->root.type != bfd_link_hash_defined
3484 && h->root.type != bfd_link_hash_defweak))
3485 continue;
3486 else
3487 symval = sec_addr (h->root.u.def.section) + h->root.u.def.value;
3488
45f76423
AW
3489 if (h->type != STT_FUNC)
3490 reserve_size =
3491 (h->size - rel->r_addend) > h->size ? 0 : h->size - rel->r_addend;
e23eba97
NC
3492 sym_sec = h->root.u.def.section;
3493 }
3494
3495 symval += rel->r_addend;
3496
3497 if (!relax_func (abfd, sec, sym_sec, info, rel, symval,
9d06997a
PD
3498 max_alignment, reserve_size, again,
3499 &pcgp_relocs))
e23eba97
NC
3500 goto fail;
3501 }
3502
3503 ret = TRUE;
3504
3505fail:
3506 if (relocs != data->relocs)
3507 free (relocs);
9d06997a 3508 riscv_free_pcgp_relocs(&pcgp_relocs, abfd, sec);
e23eba97
NC
3509
3510 return ret;
3511}
3512
3513#if ARCH_SIZE == 32
3514# define PRSTATUS_SIZE 0 /* FIXME */
3515# define PRSTATUS_OFFSET_PR_CURSIG 12
3516# define PRSTATUS_OFFSET_PR_PID 24
3517# define PRSTATUS_OFFSET_PR_REG 72
3518# define ELF_GREGSET_T_SIZE 128
3519# define PRPSINFO_SIZE 128
3520# define PRPSINFO_OFFSET_PR_PID 16
3521# define PRPSINFO_OFFSET_PR_FNAME 32
3522# define PRPSINFO_OFFSET_PR_PSARGS 48
3523#else
3524# define PRSTATUS_SIZE 376
3525# define PRSTATUS_OFFSET_PR_CURSIG 12
3526# define PRSTATUS_OFFSET_PR_PID 32
3527# define PRSTATUS_OFFSET_PR_REG 112
3528# define ELF_GREGSET_T_SIZE 256
3529# define PRPSINFO_SIZE 136
3530# define PRPSINFO_OFFSET_PR_PID 24
3531# define PRPSINFO_OFFSET_PR_FNAME 40
3532# define PRPSINFO_OFFSET_PR_PSARGS 56
3533#endif
3534
3535/* Support for core dump NOTE sections. */
3536
3537static bfd_boolean
3538riscv_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3539{
3540 switch (note->descsz)
3541 {
3542 default:
3543 return FALSE;
3544
3545 case PRSTATUS_SIZE: /* sizeof(struct elf_prstatus) on Linux/RISC-V. */
3546 /* pr_cursig */
3547 elf_tdata (abfd)->core->signal
3548 = bfd_get_16 (abfd, note->descdata + PRSTATUS_OFFSET_PR_CURSIG);
3549
3550 /* pr_pid */
3551 elf_tdata (abfd)->core->lwpid
3552 = bfd_get_32 (abfd, note->descdata + PRSTATUS_OFFSET_PR_PID);
3553 break;
3554 }
3555
3556 /* Make a ".reg/999" section. */
3557 return _bfd_elfcore_make_pseudosection (abfd, ".reg", ELF_GREGSET_T_SIZE,
3558 note->descpos + PRSTATUS_OFFSET_PR_REG);
3559}
3560
3561static bfd_boolean
3562riscv_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3563{
3564 switch (note->descsz)
3565 {
3566 default:
3567 return FALSE;
3568
3569 case PRPSINFO_SIZE: /* sizeof(struct elf_prpsinfo) on Linux/RISC-V. */
3570 /* pr_pid */
3571 elf_tdata (abfd)->core->pid
3572 = bfd_get_32 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PID);
3573
3574 /* pr_fname */
3575 elf_tdata (abfd)->core->program = _bfd_elfcore_strndup
3576 (abfd, note->descdata + PRPSINFO_OFFSET_PR_FNAME, 16);
3577
3578 /* pr_psargs */
3579 elf_tdata (abfd)->core->command = _bfd_elfcore_strndup
3580 (abfd, note->descdata + PRPSINFO_OFFSET_PR_PSARGS, 80);
3581 break;
3582 }
3583
3584 /* Note that for some reason, a spurious space is tacked
3585 onto the end of the args in some (at least one anyway)
3586 implementations, so strip it off if it exists. */
3587
3588 {
3589 char *command = elf_tdata (abfd)->core->command;
3590 int n = strlen (command);
3591
3592 if (0 < n && command[n - 1] == ' ')
3593 command[n - 1] = '\0';
3594 }
3595
3596 return TRUE;
3597}
3598
640d6bfd
KLC
3599/* Set the right mach type. */
3600static bfd_boolean
3601riscv_elf_object_p (bfd *abfd)
3602{
3603 /* There are only two mach types in RISCV currently. */
3604 if (strcmp (abfd->xvec->name, "elf32-littleriscv") == 0)
3605 bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv32);
3606 else
3607 bfd_default_set_arch_mach (abfd, bfd_arch_riscv, bfd_mach_riscv64);
3608
3609 return TRUE;
3610}
3611
e23eba97
NC
3612
3613#define TARGET_LITTLE_SYM riscv_elfNN_vec
3614#define TARGET_LITTLE_NAME "elfNN-littleriscv"
3615
3616#define elf_backend_reloc_type_class riscv_reloc_type_class
3617
3618#define bfd_elfNN_bfd_reloc_name_lookup riscv_reloc_name_lookup
3619#define bfd_elfNN_bfd_link_hash_table_create riscv_elf_link_hash_table_create
3620#define bfd_elfNN_bfd_reloc_type_lookup riscv_reloc_type_lookup
3621#define bfd_elfNN_bfd_merge_private_bfd_data \
3622 _bfd_riscv_elf_merge_private_bfd_data
3623
3624#define elf_backend_copy_indirect_symbol riscv_elf_copy_indirect_symbol
3625#define elf_backend_create_dynamic_sections riscv_elf_create_dynamic_sections
3626#define elf_backend_check_relocs riscv_elf_check_relocs
3627#define elf_backend_adjust_dynamic_symbol riscv_elf_adjust_dynamic_symbol
3628#define elf_backend_size_dynamic_sections riscv_elf_size_dynamic_sections
3629#define elf_backend_relocate_section riscv_elf_relocate_section
3630#define elf_backend_finish_dynamic_symbol riscv_elf_finish_dynamic_symbol
3631#define elf_backend_finish_dynamic_sections riscv_elf_finish_dynamic_sections
3632#define elf_backend_gc_mark_hook riscv_elf_gc_mark_hook
e23eba97 3633#define elf_backend_plt_sym_val riscv_elf_plt_sym_val
07d6d2b8
AM
3634#define elf_backend_grok_prstatus riscv_elf_grok_prstatus
3635#define elf_backend_grok_psinfo riscv_elf_grok_psinfo
3636#define elf_backend_object_p riscv_elf_object_p
e23eba97
NC
3637#define elf_info_to_howto_rel NULL
3638#define elf_info_to_howto riscv_info_to_howto_rela
3639#define bfd_elfNN_bfd_relax_section _bfd_riscv_relax_section
3640
3641#define elf_backend_init_index_section _bfd_elf_init_1_index_section
3642
3643#define elf_backend_can_gc_sections 1
3644#define elf_backend_can_refcount 1
3645#define elf_backend_want_got_plt 1
3646#define elf_backend_plt_readonly 1
3647#define elf_backend_plt_alignment 4
3648#define elf_backend_want_plt_sym 1
3649#define elf_backend_got_header_size (ARCH_SIZE / 8)
5474d94f 3650#define elf_backend_want_dynrelro 1
e23eba97
NC
3651#define elf_backend_rela_normal 1
3652#define elf_backend_default_execstack 0
3653
3654#include "elfNN-target.h"