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