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