1 /* RISC-V-specific support for NN-bit ELF.
2 Copyright (C) 2011-2018 Free Software Foundation, Inc.
4 Contributed by Andrew Waterman (andrew@sifive.com).
5 Based on TILE-Gx and MIPS targets.
7 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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/>. */
23 /* This file handles RISC-V ELF targets. */
31 #include "elfxx-riscv.h"
32 #include "elf/riscv.h"
33 #include "opcode/riscv.h"
35 /* Internal relocations used exclusively by the relaxation pass. */
36 #define R_RISCV_DELETE (R_RISCV_max + 1)
40 #define MINUS_ONE ((bfd_vma)0 - 1)
42 #define RISCV_ELF_LOG_WORD_BYTES (ARCH_SIZE == 32 ? 2 : 3)
44 #define RISCV_ELF_WORD_BYTES (1 << RISCV_ELF_LOG_WORD_BYTES)
46 /* The name of the dynamic interpreter. This is put in the .interp
49 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld.so.1"
50 #define ELF32_DYNAMIC_INTERPRETER "/lib32/ld.so.1"
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
58 /* RISC-V ELF linker hash entry. */
60 struct riscv_elf_link_hash_entry
62 struct elf_link_hash_entry elf
;
64 /* Track dynamic relocs copied for this symbol. */
65 struct elf_dyn_relocs
*dyn_relocs
;
75 #define riscv_elf_hash_entry(ent) \
76 ((struct riscv_elf_link_hash_entry *)(ent))
78 struct _bfd_riscv_elf_obj_tdata
80 struct elf_obj_tdata root
;
82 /* tls_type for each local got entry. */
83 char *local_got_tls_type
;
86 #define _bfd_riscv_elf_tdata(abfd) \
87 ((struct _bfd_riscv_elf_obj_tdata *) (abfd)->tdata.any)
89 #define _bfd_riscv_elf_local_got_tls_type(abfd) \
90 (_bfd_riscv_elf_tdata (abfd)->local_got_tls_type)
92 #define _bfd_riscv_elf_tls_type(abfd, h, symndx) \
93 (*((h) != NULL ? &riscv_elf_hash_entry (h)->tls_type \
94 : &_bfd_riscv_elf_local_got_tls_type (abfd) [symndx]))
96 #define is_riscv_elf(bfd) \
97 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
98 && elf_tdata (bfd) != NULL \
99 && elf_object_id (bfd) == RISCV_ELF_DATA)
101 #include "elf/common.h"
102 #include "elf/internal.h"
104 struct riscv_elf_link_hash_table
106 struct elf_link_hash_table elf
;
108 /* Short-cuts to get to dynamic linker sections. */
111 /* Small local sym to section mapping cache. */
112 struct sym_cache sym_cache
;
114 /* The max alignment of output sections. */
115 bfd_vma max_alignment
;
119 /* Get the RISC-V ELF linker hash table from a link_info structure. */
120 #define riscv_elf_hash_table(p) \
121 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
122 == RISCV_ELF_DATA ? ((struct riscv_elf_link_hash_table *) ((p)->hash)) : NULL)
125 riscv_info_to_howto_rela (bfd
*abfd
,
127 Elf_Internal_Rela
*dst
)
129 cache_ptr
->howto
= riscv_elf_rtype_to_howto (abfd
, ELFNN_R_TYPE (dst
->r_info
));
130 return cache_ptr
->howto
!= NULL
;
134 riscv_elf_append_rela (bfd
*abfd
, asection
*s
, Elf_Internal_Rela
*rel
)
136 const struct elf_backend_data
*bed
;
139 bed
= get_elf_backend_data (abfd
);
140 loc
= s
->contents
+ (s
->reloc_count
++ * bed
->s
->sizeof_rela
);
141 bed
->s
->swap_reloca_out (abfd
, rel
, loc
);
146 #define PLT_HEADER_INSNS 8
147 #define PLT_ENTRY_INSNS 4
148 #define PLT_HEADER_SIZE (PLT_HEADER_INSNS * 4)
149 #define PLT_ENTRY_SIZE (PLT_ENTRY_INSNS * 4)
151 #define GOT_ENTRY_SIZE RISCV_ELF_WORD_BYTES
153 #define GOTPLT_HEADER_SIZE (2 * GOT_ENTRY_SIZE)
155 #define sec_addr(sec) ((sec)->output_section->vma + (sec)->output_offset)
158 riscv_elf_got_plt_val (bfd_vma plt_index
, struct bfd_link_info
*info
)
160 return sec_addr (riscv_elf_hash_table (info
)->elf
.sgotplt
)
161 + GOTPLT_HEADER_SIZE
+ (plt_index
* GOT_ENTRY_SIZE
);
165 # define MATCH_LREG MATCH_LW
167 # define MATCH_LREG MATCH_LD
170 /* Generate a PLT header. */
173 riscv_make_plt_header (bfd_vma gotplt_addr
, bfd_vma addr
, uint32_t *entry
)
175 bfd_vma gotplt_offset_high
= RISCV_PCREL_HIGH_PART (gotplt_addr
, addr
);
176 bfd_vma gotplt_offset_low
= RISCV_PCREL_LOW_PART (gotplt_addr
, addr
);
178 /* auipc t2, %hi(.got.plt)
179 sub t1, t1, t3 # shifted .got.plt offset + hdr size + 12
180 l[w|d] t3, %lo(.got.plt)(t2) # _dl_runtime_resolve
181 addi t1, t1, -(hdr size + 12) # shifted .got.plt offset
182 addi t0, t2, %lo(.got.plt) # &.got.plt
183 srli t1, t1, log2(16/PTRSIZE) # .got.plt offset
184 l[w|d] t0, PTRSIZE(t0) # link map
187 entry
[0] = RISCV_UTYPE (AUIPC
, X_T2
, gotplt_offset_high
);
188 entry
[1] = RISCV_RTYPE (SUB
, X_T1
, X_T1
, X_T3
);
189 entry
[2] = RISCV_ITYPE (LREG
, X_T3
, X_T2
, gotplt_offset_low
);
190 entry
[3] = RISCV_ITYPE (ADDI
, X_T1
, X_T1
, -(PLT_HEADER_SIZE
+ 12));
191 entry
[4] = RISCV_ITYPE (ADDI
, X_T0
, X_T2
, gotplt_offset_low
);
192 entry
[5] = RISCV_ITYPE (SRLI
, X_T1
, X_T1
, 4 - RISCV_ELF_LOG_WORD_BYTES
);
193 entry
[6] = RISCV_ITYPE (LREG
, X_T0
, X_T0
, RISCV_ELF_WORD_BYTES
);
194 entry
[7] = RISCV_ITYPE (JALR
, 0, X_T3
, 0);
197 /* Generate a PLT entry. */
200 riscv_make_plt_entry (bfd_vma got
, bfd_vma addr
, uint32_t *entry
)
202 /* auipc t3, %hi(.got.plt entry)
203 l[w|d] t3, %lo(.got.plt entry)(t3)
207 entry
[0] = RISCV_UTYPE (AUIPC
, X_T3
, RISCV_PCREL_HIGH_PART (got
, addr
));
208 entry
[1] = RISCV_ITYPE (LREG
, X_T3
, X_T3
, RISCV_PCREL_LOW_PART (got
, addr
));
209 entry
[2] = RISCV_ITYPE (JALR
, X_T1
, X_T3
, 0);
210 entry
[3] = RISCV_NOP
;
213 /* Create an entry in an RISC-V ELF linker hash table. */
215 static struct bfd_hash_entry
*
216 link_hash_newfunc (struct bfd_hash_entry
*entry
,
217 struct bfd_hash_table
*table
, const char *string
)
219 /* Allocate the structure if it has not already been allocated by a
224 bfd_hash_allocate (table
,
225 sizeof (struct riscv_elf_link_hash_entry
));
230 /* Call the allocation method of the superclass. */
231 entry
= _bfd_elf_link_hash_newfunc (entry
, table
, string
);
234 struct riscv_elf_link_hash_entry
*eh
;
236 eh
= (struct riscv_elf_link_hash_entry
*) entry
;
237 eh
->dyn_relocs
= NULL
;
238 eh
->tls_type
= GOT_UNKNOWN
;
244 /* Create a RISC-V ELF linker hash table. */
246 static struct bfd_link_hash_table
*
247 riscv_elf_link_hash_table_create (bfd
*abfd
)
249 struct riscv_elf_link_hash_table
*ret
;
250 bfd_size_type amt
= sizeof (struct riscv_elf_link_hash_table
);
252 ret
= (struct riscv_elf_link_hash_table
*) bfd_zmalloc (amt
);
256 if (!_bfd_elf_link_hash_table_init (&ret
->elf
, abfd
, link_hash_newfunc
,
257 sizeof (struct riscv_elf_link_hash_entry
),
264 ret
->max_alignment
= (bfd_vma
) -1;
265 return &ret
->elf
.root
;
268 /* Create the .got section. */
271 riscv_elf_create_got_section (bfd
*abfd
, struct bfd_link_info
*info
)
275 struct elf_link_hash_entry
*h
;
276 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
277 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
279 /* This function may be called more than once. */
280 if (htab
->sgot
!= NULL
)
283 flags
= bed
->dynamic_sec_flags
;
285 s
= bfd_make_section_anyway_with_flags (abfd
,
286 (bed
->rela_plts_and_copies_p
287 ? ".rela.got" : ".rel.got"),
288 (bed
->dynamic_sec_flags
291 || ! bfd_set_section_alignment (abfd
, s
, bed
->s
->log_file_align
))
295 s
= s_got
= bfd_make_section_anyway_with_flags (abfd
, ".got", flags
);
297 || !bfd_set_section_alignment (abfd
, s
, bed
->s
->log_file_align
))
301 /* The first bit of the global offset table is the header. */
302 s
->size
+= bed
->got_header_size
;
304 if (bed
->want_got_plt
)
306 s
= bfd_make_section_anyway_with_flags (abfd
, ".got.plt", flags
);
308 || !bfd_set_section_alignment (abfd
, s
,
309 bed
->s
->log_file_align
))
313 /* Reserve room for the header. */
314 s
->size
+= GOTPLT_HEADER_SIZE
;
317 if (bed
->want_got_sym
)
319 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
320 section. We don't do this in the linker script because we don't want
321 to define the symbol if we are not creating a global offset
323 h
= _bfd_elf_define_linkage_sym (abfd
, info
, s_got
,
324 "_GLOBAL_OFFSET_TABLE_");
325 elf_hash_table (info
)->hgot
= h
;
333 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
334 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
338 riscv_elf_create_dynamic_sections (bfd
*dynobj
,
339 struct bfd_link_info
*info
)
341 struct riscv_elf_link_hash_table
*htab
;
343 htab
= riscv_elf_hash_table (info
);
344 BFD_ASSERT (htab
!= NULL
);
346 if (!riscv_elf_create_got_section (dynobj
, info
))
349 if (!_bfd_elf_create_dynamic_sections (dynobj
, info
))
352 if (!bfd_link_pic (info
))
355 bfd_make_section_anyway_with_flags (dynobj
, ".tdata.dyn",
356 (SEC_ALLOC
| SEC_THREAD_LOCAL
357 | SEC_LINKER_CREATED
));
360 if (!htab
->elf
.splt
|| !htab
->elf
.srelplt
|| !htab
->elf
.sdynbss
361 || (!bfd_link_pic (info
) && (!htab
->elf
.srelbss
|| !htab
->sdyntdata
)))
367 /* Copy the extra info we tack onto an elf_link_hash_entry. */
370 riscv_elf_copy_indirect_symbol (struct bfd_link_info
*info
,
371 struct elf_link_hash_entry
*dir
,
372 struct elf_link_hash_entry
*ind
)
374 struct riscv_elf_link_hash_entry
*edir
, *eind
;
376 edir
= (struct riscv_elf_link_hash_entry
*) dir
;
377 eind
= (struct riscv_elf_link_hash_entry
*) ind
;
379 if (eind
->dyn_relocs
!= NULL
)
381 if (edir
->dyn_relocs
!= NULL
)
383 struct elf_dyn_relocs
**pp
;
384 struct elf_dyn_relocs
*p
;
386 /* Add reloc counts against the indirect sym to the direct sym
387 list. Merge any entries against the same section. */
388 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
390 struct elf_dyn_relocs
*q
;
392 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
393 if (q
->sec
== p
->sec
)
395 q
->pc_count
+= p
->pc_count
;
396 q
->count
+= p
->count
;
403 *pp
= edir
->dyn_relocs
;
406 edir
->dyn_relocs
= eind
->dyn_relocs
;
407 eind
->dyn_relocs
= NULL
;
410 if (ind
->root
.type
== bfd_link_hash_indirect
411 && dir
->got
.refcount
<= 0)
413 edir
->tls_type
= eind
->tls_type
;
414 eind
->tls_type
= GOT_UNKNOWN
;
416 _bfd_elf_link_hash_copy_indirect (info
, dir
, ind
);
420 riscv_elf_record_tls_type (bfd
*abfd
, struct elf_link_hash_entry
*h
,
421 unsigned long symndx
, char tls_type
)
423 char *new_tls_type
= &_bfd_riscv_elf_tls_type (abfd
, h
, symndx
);
425 *new_tls_type
|= tls_type
;
426 if ((*new_tls_type
& GOT_NORMAL
) && (*new_tls_type
& ~GOT_NORMAL
))
428 (*_bfd_error_handler
)
429 (_("%pB: `%s' accessed both as normal and thread local symbol"),
430 abfd
, h
? h
->root
.root
.string
: "<local>");
437 riscv_elf_record_got_reference (bfd
*abfd
, struct bfd_link_info
*info
,
438 struct elf_link_hash_entry
*h
, long symndx
)
440 struct riscv_elf_link_hash_table
*htab
= riscv_elf_hash_table (info
);
441 Elf_Internal_Shdr
*symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
443 if (htab
->elf
.sgot
== NULL
)
445 if (!riscv_elf_create_got_section (htab
->elf
.dynobj
, info
))
451 h
->got
.refcount
+= 1;
455 /* This is a global offset table entry for a local symbol. */
456 if (elf_local_got_refcounts (abfd
) == NULL
)
458 bfd_size_type size
= symtab_hdr
->sh_info
* (sizeof (bfd_vma
) + 1);
459 if (!(elf_local_got_refcounts (abfd
) = bfd_zalloc (abfd
, size
)))
461 _bfd_riscv_elf_local_got_tls_type (abfd
)
462 = (char *) (elf_local_got_refcounts (abfd
) + symtab_hdr
->sh_info
);
464 elf_local_got_refcounts (abfd
) [symndx
] += 1;
470 bad_static_reloc (bfd
*abfd
, unsigned r_type
, struct elf_link_hash_entry
*h
)
472 reloc_howto_type
* r
= riscv_elf_rtype_to_howto (abfd
, r_type
);
474 (*_bfd_error_handler
)
475 (_("%pB: relocation %s against `%s' can not be used when making a shared "
476 "object; recompile with -fPIC"),
477 abfd
, r
? r
->name
: _("<unknown>"),
478 h
!= NULL
? h
->root
.root
.string
: "a local symbol");
479 bfd_set_error (bfd_error_bad_value
);
482 /* Look through the relocs for a section during the first phase, and
483 allocate space in the global offset table or procedure linkage
487 riscv_elf_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
488 asection
*sec
, const Elf_Internal_Rela
*relocs
)
490 struct riscv_elf_link_hash_table
*htab
;
491 Elf_Internal_Shdr
*symtab_hdr
;
492 struct elf_link_hash_entry
**sym_hashes
;
493 const Elf_Internal_Rela
*rel
;
494 asection
*sreloc
= NULL
;
496 if (bfd_link_relocatable (info
))
499 htab
= riscv_elf_hash_table (info
);
500 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
501 sym_hashes
= elf_sym_hashes (abfd
);
503 if (htab
->elf
.dynobj
== NULL
)
504 htab
->elf
.dynobj
= abfd
;
506 for (rel
= relocs
; rel
< relocs
+ sec
->reloc_count
; rel
++)
509 unsigned int r_symndx
;
510 struct elf_link_hash_entry
*h
;
512 r_symndx
= ELFNN_R_SYM (rel
->r_info
);
513 r_type
= ELFNN_R_TYPE (rel
->r_info
);
515 if (r_symndx
>= NUM_SHDR_ENTRIES (symtab_hdr
))
517 (*_bfd_error_handler
) (_("%pB: bad symbol index: %d"),
522 if (r_symndx
< symtab_hdr
->sh_info
)
526 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
527 while (h
->root
.type
== bfd_link_hash_indirect
528 || h
->root
.type
== bfd_link_hash_warning
)
529 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
534 case R_RISCV_TLS_GD_HI20
:
535 if (!riscv_elf_record_got_reference (abfd
, info
, h
, r_symndx
)
536 || !riscv_elf_record_tls_type (abfd
, h
, r_symndx
, GOT_TLS_GD
))
540 case R_RISCV_TLS_GOT_HI20
:
541 if (bfd_link_pic (info
))
542 info
->flags
|= DF_STATIC_TLS
;
543 if (!riscv_elf_record_got_reference (abfd
, info
, h
, r_symndx
)
544 || !riscv_elf_record_tls_type (abfd
, h
, r_symndx
, GOT_TLS_IE
))
548 case R_RISCV_GOT_HI20
:
549 if (!riscv_elf_record_got_reference (abfd
, info
, h
, r_symndx
)
550 || !riscv_elf_record_tls_type (abfd
, h
, r_symndx
, GOT_NORMAL
))
554 case R_RISCV_CALL_PLT
:
555 /* This symbol requires a procedure linkage table entry. We
556 actually build the entry in adjust_dynamic_symbol,
557 because this might be a case of linking PIC code without
558 linking in any dynamic objects, in which case we don't
559 need to generate a procedure linkage table after all. */
564 h
->plt
.refcount
+= 1;
571 case R_RISCV_RVC_BRANCH
:
572 case R_RISCV_RVC_JUMP
:
573 case R_RISCV_PCREL_HI20
:
574 /* In shared libraries, these relocs are known to bind locally. */
575 if (bfd_link_pic (info
))
579 case R_RISCV_TPREL_HI20
:
580 if (!bfd_link_executable (info
))
581 return bad_static_reloc (abfd
, r_type
, h
);
583 riscv_elf_record_tls_type (abfd
, h
, r_symndx
, GOT_TLS_LE
);
587 if (bfd_link_pic (info
))
588 return bad_static_reloc (abfd
, r_type
, h
);
592 case R_RISCV_JUMP_SLOT
:
593 case R_RISCV_RELATIVE
:
599 /* This reloc might not bind locally. */
603 if (h
!= NULL
&& !bfd_link_pic (info
))
605 /* We may need a .plt entry if the function this reloc
606 refers to is in a shared lib. */
607 h
->plt
.refcount
+= 1;
610 /* If we are creating a shared library, and this is a reloc
611 against a global symbol, or a non PC relative reloc
612 against a local symbol, then we need to copy the reloc
613 into the shared library. However, if we are linking with
614 -Bsymbolic, we do not need to copy a reloc against a
615 global symbol which is defined in an object we are
616 including in the link (i.e., DEF_REGULAR is set). At
617 this point we have not seen all the input files, so it is
618 possible that DEF_REGULAR is not set now but will be set
619 later (it is never cleared). In case of a weak definition,
620 DEF_REGULAR may be cleared later by a strong definition in
621 a shared library. We account for that possibility below by
622 storing information in the relocs_copied field of the hash
623 table entry. A similar situation occurs when creating
624 shared libraries and symbol visibility changes render the
627 If on the other hand, we are creating an executable, we
628 may need to keep relocations for symbols satisfied by a
629 dynamic library if we manage to avoid copy relocs for the
631 reloc_howto_type
* r
= riscv_elf_rtype_to_howto (abfd
, r_type
);
633 if ((bfd_link_pic (info
)
634 && (sec
->flags
& SEC_ALLOC
) != 0
635 && ((r
!= NULL
&& ! r
->pc_relative
)
638 || h
->root
.type
== bfd_link_hash_defweak
639 || !h
->def_regular
))))
640 || (!bfd_link_pic (info
)
641 && (sec
->flags
& SEC_ALLOC
) != 0
643 && (h
->root
.type
== bfd_link_hash_defweak
644 || !h
->def_regular
)))
646 struct elf_dyn_relocs
*p
;
647 struct elf_dyn_relocs
**head
;
649 /* When creating a shared object, we must copy these
650 relocs into the output file. We create a reloc
651 section in dynobj and make room for the reloc. */
654 sreloc
= _bfd_elf_make_dynamic_reloc_section
655 (sec
, htab
->elf
.dynobj
, RISCV_ELF_LOG_WORD_BYTES
,
656 abfd
, /*rela?*/ TRUE
);
662 /* If this is a global symbol, we count the number of
663 relocations we need for this symbol. */
665 head
= &((struct riscv_elf_link_hash_entry
*) h
)->dyn_relocs
;
668 /* Track dynamic relocs needed for local syms too.
669 We really need local syms available to do this
674 Elf_Internal_Sym
*isym
;
676 isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
,
681 s
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
685 vpp
= &elf_section_data (s
)->local_dynrel
;
686 head
= (struct elf_dyn_relocs
**) vpp
;
690 if (p
== NULL
|| p
->sec
!= sec
)
692 bfd_size_type amt
= sizeof *p
;
693 p
= ((struct elf_dyn_relocs
*)
694 bfd_alloc (htab
->elf
.dynobj
, amt
));
705 p
->pc_count
+= r
== NULL
? 0 : r
->pc_relative
;
710 case R_RISCV_GNU_VTINHERIT
:
711 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
715 case R_RISCV_GNU_VTENTRY
:
716 if (!bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
729 riscv_elf_gc_mark_hook (asection
*sec
,
730 struct bfd_link_info
*info
,
731 Elf_Internal_Rela
*rel
,
732 struct elf_link_hash_entry
*h
,
733 Elf_Internal_Sym
*sym
)
736 switch (ELFNN_R_TYPE (rel
->r_info
))
738 case R_RISCV_GNU_VTINHERIT
:
739 case R_RISCV_GNU_VTENTRY
:
743 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
746 /* Find dynamic relocs for H that apply to read-only sections. */
749 readonly_dynrelocs (struct elf_link_hash_entry
*h
)
751 struct elf_dyn_relocs
*p
;
753 for (p
= riscv_elf_hash_entry (h
)->dyn_relocs
; p
!= NULL
; p
= p
->next
)
755 asection
*s
= p
->sec
->output_section
;
757 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
763 /* Adjust a symbol defined by a dynamic object and referenced by a
764 regular object. The current definition is in some section of the
765 dynamic object, but we're not including those sections. We have to
766 change the definition to something the rest of the link can
770 riscv_elf_adjust_dynamic_symbol (struct bfd_link_info
*info
,
771 struct elf_link_hash_entry
*h
)
773 struct riscv_elf_link_hash_table
*htab
;
774 struct riscv_elf_link_hash_entry
* eh
;
778 htab
= riscv_elf_hash_table (info
);
779 BFD_ASSERT (htab
!= NULL
);
781 dynobj
= htab
->elf
.dynobj
;
783 /* Make sure we know what is going on here. */
784 BFD_ASSERT (dynobj
!= NULL
786 || h
->type
== STT_GNU_IFUNC
790 && !h
->def_regular
)));
792 /* If this is a function, put it in the procedure linkage table. We
793 will fill in the contents of the procedure linkage table later
794 (although we could actually do it here). */
795 if (h
->type
== STT_FUNC
|| h
->type
== STT_GNU_IFUNC
|| h
->needs_plt
)
797 if (h
->plt
.refcount
<= 0
798 || SYMBOL_CALLS_LOCAL (info
, h
)
799 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
800 && h
->root
.type
== bfd_link_hash_undefweak
))
802 /* This case can occur if we saw a R_RISCV_CALL_PLT reloc in an
803 input file, but the symbol was never referred to by a dynamic
804 object, or if all references were garbage collected. In such
805 a case, we don't actually need to build a PLT entry. */
806 h
->plt
.offset
= (bfd_vma
) -1;
813 h
->plt
.offset
= (bfd_vma
) -1;
815 /* If this is a weak symbol, and there is a real definition, the
816 processor independent code will have arranged for us to see the
817 real definition first, and we can just use the same value. */
820 struct elf_link_hash_entry
*def
= weakdef (h
);
821 BFD_ASSERT (def
->root
.type
== bfd_link_hash_defined
);
822 h
->root
.u
.def
.section
= def
->root
.u
.def
.section
;
823 h
->root
.u
.def
.value
= def
->root
.u
.def
.value
;
827 /* This is a reference to a symbol defined by a dynamic object which
828 is not a function. */
830 /* If we are creating a shared library, we must presume that the
831 only references to the symbol are via the global offset table.
832 For such cases we need not do anything here; the relocations will
833 be handled correctly by relocate_section. */
834 if (bfd_link_pic (info
))
837 /* If there are no references to this symbol that do not use the
838 GOT, we don't need to generate a copy reloc. */
842 /* If -z nocopyreloc was given, we won't generate them either. */
843 if (info
->nocopyreloc
)
849 /* If we don't find any dynamic relocs in read-only sections, then
850 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
851 if (!readonly_dynrelocs (h
))
857 /* We must allocate the symbol in our .dynbss section, which will
858 become part of the .bss section of the executable. There will be
859 an entry for this symbol in the .dynsym section. The dynamic
860 object will contain position independent code, so all references
861 from the dynamic object to this symbol will go through the global
862 offset table. The dynamic linker will use the .dynsym entry to
863 determine the address it must put in the global offset table, so
864 both the dynamic object and the regular object will refer to the
865 same memory location for the variable. */
867 /* We must generate a R_RISCV_COPY reloc to tell the dynamic linker
868 to copy the initial value out of the dynamic object and into the
869 runtime process image. We need to remember the offset into the
870 .rel.bss section we are going to use. */
871 eh
= (struct riscv_elf_link_hash_entry
*) h
;
872 if (eh
->tls_type
& ~GOT_NORMAL
)
875 srel
= htab
->elf
.srelbss
;
877 else if ((h
->root
.u
.def
.section
->flags
& SEC_READONLY
) != 0)
879 s
= htab
->elf
.sdynrelro
;
880 srel
= htab
->elf
.sreldynrelro
;
884 s
= htab
->elf
.sdynbss
;
885 srel
= htab
->elf
.srelbss
;
887 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0 && h
->size
!= 0)
889 srel
->size
+= sizeof (ElfNN_External_Rela
);
893 return _bfd_elf_adjust_dynamic_copy (info
, h
, s
);
896 /* Allocate space in .plt, .got and associated reloc sections for
900 allocate_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
902 struct bfd_link_info
*info
;
903 struct riscv_elf_link_hash_table
*htab
;
904 struct riscv_elf_link_hash_entry
*eh
;
905 struct elf_dyn_relocs
*p
;
907 if (h
->root
.type
== bfd_link_hash_indirect
)
910 info
= (struct bfd_link_info
*) inf
;
911 htab
= riscv_elf_hash_table (info
);
912 BFD_ASSERT (htab
!= NULL
);
914 if (htab
->elf
.dynamic_sections_created
915 && h
->plt
.refcount
> 0)
917 /* Make sure this symbol is output as a dynamic symbol.
918 Undefined weak syms won't yet be marked as dynamic. */
922 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
926 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info
), h
))
928 asection
*s
= htab
->elf
.splt
;
931 s
->size
= PLT_HEADER_SIZE
;
933 h
->plt
.offset
= s
->size
;
935 /* Make room for this entry. */
936 s
->size
+= PLT_ENTRY_SIZE
;
938 /* We also need to make an entry in the .got.plt section. */
939 htab
->elf
.sgotplt
->size
+= GOT_ENTRY_SIZE
;
941 /* We also need to make an entry in the .rela.plt section. */
942 htab
->elf
.srelplt
->size
+= sizeof (ElfNN_External_Rela
);
944 /* If this symbol is not defined in a regular file, and we are
945 not generating a shared library, then set the symbol to this
946 location in the .plt. This is required to make function
947 pointers compare as equal between the normal executable and
948 the shared library. */
949 if (! bfd_link_pic (info
)
952 h
->root
.u
.def
.section
= s
;
953 h
->root
.u
.def
.value
= h
->plt
.offset
;
958 h
->plt
.offset
= (bfd_vma
) -1;
964 h
->plt
.offset
= (bfd_vma
) -1;
968 if (h
->got
.refcount
> 0)
972 int tls_type
= riscv_elf_hash_entry (h
)->tls_type
;
974 /* Make sure this symbol is output as a dynamic symbol.
975 Undefined weak syms won't yet be marked as dynamic. */
979 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
984 h
->got
.offset
= s
->size
;
985 dyn
= htab
->elf
.dynamic_sections_created
;
986 if (tls_type
& (GOT_TLS_GD
| GOT_TLS_IE
))
988 /* TLS_GD needs two dynamic relocs and two GOT slots. */
989 if (tls_type
& GOT_TLS_GD
)
991 s
->size
+= 2 * RISCV_ELF_WORD_BYTES
;
992 htab
->elf
.srelgot
->size
+= 2 * sizeof (ElfNN_External_Rela
);
995 /* TLS_IE needs one dynamic reloc and one GOT slot. */
996 if (tls_type
& GOT_TLS_IE
)
998 s
->size
+= RISCV_ELF_WORD_BYTES
;
999 htab
->elf
.srelgot
->size
+= sizeof (ElfNN_External_Rela
);
1004 s
->size
+= RISCV_ELF_WORD_BYTES
;
1005 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, bfd_link_pic (info
), h
)
1006 && ! UNDEFWEAK_NO_DYNAMIC_RELOC (info
, h
))
1007 htab
->elf
.srelgot
->size
+= sizeof (ElfNN_External_Rela
);
1011 h
->got
.offset
= (bfd_vma
) -1;
1013 eh
= (struct riscv_elf_link_hash_entry
*) h
;
1014 if (eh
->dyn_relocs
== NULL
)
1017 /* In the shared -Bsymbolic case, discard space allocated for
1018 dynamic pc-relative relocs against symbols which turn out to be
1019 defined in regular objects. For the normal shared case, discard
1020 space for pc-relative relocs that have become local due to symbol
1021 visibility changes. */
1023 if (bfd_link_pic (info
))
1025 if (SYMBOL_CALLS_LOCAL (info
, h
))
1027 struct elf_dyn_relocs
**pp
;
1029 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
1031 p
->count
-= p
->pc_count
;
1040 /* Also discard relocs on undefined weak syms with non-default
1042 if (eh
->dyn_relocs
!= NULL
1043 && h
->root
.type
== bfd_link_hash_undefweak
)
1045 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
1046 || UNDEFWEAK_NO_DYNAMIC_RELOC (info
, h
))
1047 eh
->dyn_relocs
= NULL
;
1049 /* Make sure undefined weak symbols are output as a dynamic
1051 else if (h
->dynindx
== -1
1052 && !h
->forced_local
)
1054 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
1061 /* For the non-shared case, discard space for relocs against
1062 symbols which turn out to need copy relocs or are not
1068 || (htab
->elf
.dynamic_sections_created
1069 && (h
->root
.type
== bfd_link_hash_undefweak
1070 || h
->root
.type
== bfd_link_hash_undefined
))))
1072 /* Make sure this symbol is output as a dynamic symbol.
1073 Undefined weak syms won't yet be marked as dynamic. */
1074 if (h
->dynindx
== -1
1075 && !h
->forced_local
)
1077 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
1081 /* If that succeeded, we know we'll be keeping all the
1083 if (h
->dynindx
!= -1)
1087 eh
->dyn_relocs
= NULL
;
1092 /* Finally, allocate space. */
1093 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
1095 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
1096 sreloc
->size
+= p
->count
* sizeof (ElfNN_External_Rela
);
1102 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
1103 read-only sections. */
1106 maybe_set_textrel (struct elf_link_hash_entry
*h
, void *info_p
)
1110 if (h
->root
.type
== bfd_link_hash_indirect
)
1113 sec
= readonly_dynrelocs (h
);
1116 struct bfd_link_info
*info
= (struct bfd_link_info
*) info_p
;
1118 info
->flags
|= DF_TEXTREL
;
1119 info
->callbacks
->minfo
1120 (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
1121 sec
->owner
, h
->root
.root
.string
, sec
);
1123 /* Not an error, just cut short the traversal. */
1130 riscv_elf_size_dynamic_sections (bfd
*output_bfd
, struct bfd_link_info
*info
)
1132 struct riscv_elf_link_hash_table
*htab
;
1137 htab
= riscv_elf_hash_table (info
);
1138 BFD_ASSERT (htab
!= NULL
);
1139 dynobj
= htab
->elf
.dynobj
;
1140 BFD_ASSERT (dynobj
!= NULL
);
1142 if (elf_hash_table (info
)->dynamic_sections_created
)
1144 /* Set the contents of the .interp section to the interpreter. */
1145 if (bfd_link_executable (info
) && !info
->nointerp
)
1147 s
= bfd_get_linker_section (dynobj
, ".interp");
1148 BFD_ASSERT (s
!= NULL
);
1149 s
->size
= strlen (ELFNN_DYNAMIC_INTERPRETER
) + 1;
1150 s
->contents
= (unsigned char *) ELFNN_DYNAMIC_INTERPRETER
;
1154 /* Set up .got offsets for local syms, and space for local dynamic
1156 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
1158 bfd_signed_vma
*local_got
;
1159 bfd_signed_vma
*end_local_got
;
1160 char *local_tls_type
;
1161 bfd_size_type locsymcount
;
1162 Elf_Internal_Shdr
*symtab_hdr
;
1165 if (! is_riscv_elf (ibfd
))
1168 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
1170 struct elf_dyn_relocs
*p
;
1172 for (p
= elf_section_data (s
)->local_dynrel
; p
!= NULL
; p
= p
->next
)
1174 if (!bfd_is_abs_section (p
->sec
)
1175 && bfd_is_abs_section (p
->sec
->output_section
))
1177 /* Input section has been discarded, either because
1178 it is a copy of a linkonce section or due to
1179 linker script /DISCARD/, so we'll be discarding
1182 else if (p
->count
!= 0)
1184 srel
= elf_section_data (p
->sec
)->sreloc
;
1185 srel
->size
+= p
->count
* sizeof (ElfNN_External_Rela
);
1186 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
1187 info
->flags
|= DF_TEXTREL
;
1192 local_got
= elf_local_got_refcounts (ibfd
);
1196 symtab_hdr
= &elf_symtab_hdr (ibfd
);
1197 locsymcount
= symtab_hdr
->sh_info
;
1198 end_local_got
= local_got
+ locsymcount
;
1199 local_tls_type
= _bfd_riscv_elf_local_got_tls_type (ibfd
);
1201 srel
= htab
->elf
.srelgot
;
1202 for (; local_got
< end_local_got
; ++local_got
, ++local_tls_type
)
1206 *local_got
= s
->size
;
1207 s
->size
+= RISCV_ELF_WORD_BYTES
;
1208 if (*local_tls_type
& GOT_TLS_GD
)
1209 s
->size
+= RISCV_ELF_WORD_BYTES
;
1210 if (bfd_link_pic (info
)
1211 || (*local_tls_type
& (GOT_TLS_GD
| GOT_TLS_IE
)))
1212 srel
->size
+= sizeof (ElfNN_External_Rela
);
1215 *local_got
= (bfd_vma
) -1;
1219 /* Allocate global sym .plt and .got entries, and space for global
1220 sym dynamic relocs. */
1221 elf_link_hash_traverse (&htab
->elf
, allocate_dynrelocs
, info
);
1223 if (htab
->elf
.sgotplt
)
1225 struct elf_link_hash_entry
*got
;
1226 got
= elf_link_hash_lookup (elf_hash_table (info
),
1227 "_GLOBAL_OFFSET_TABLE_",
1228 FALSE
, FALSE
, FALSE
);
1230 /* Don't allocate .got.plt section if there are no GOT nor PLT
1231 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
1233 || !got
->ref_regular_nonweak
)
1234 && (htab
->elf
.sgotplt
->size
== GOTPLT_HEADER_SIZE
)
1235 && (htab
->elf
.splt
== NULL
1236 || htab
->elf
.splt
->size
== 0)
1237 && (htab
->elf
.sgot
== NULL
1238 || (htab
->elf
.sgot
->size
1239 == get_elf_backend_data (output_bfd
)->got_header_size
)))
1240 htab
->elf
.sgotplt
->size
= 0;
1243 /* The check_relocs and adjust_dynamic_symbol entry points have
1244 determined the sizes of the various dynamic sections. Allocate
1246 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
1248 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
1251 if (s
== htab
->elf
.splt
1252 || s
== htab
->elf
.sgot
1253 || s
== htab
->elf
.sgotplt
1254 || s
== htab
->elf
.sdynbss
1255 || s
== htab
->elf
.sdynrelro
)
1257 /* Strip this section if we don't need it; see the
1260 else if (strncmp (s
->name
, ".rela", 5) == 0)
1264 /* We use the reloc_count field as a counter if we need
1265 to copy relocs into the output file. */
1271 /* It's not one of our sections. */
1277 /* If we don't need this section, strip it from the
1278 output file. This is mostly to handle .rela.bss and
1279 .rela.plt. We must create both sections in
1280 create_dynamic_sections, because they must be created
1281 before the linker maps input sections to output
1282 sections. The linker does that before
1283 adjust_dynamic_symbol is called, and it is that
1284 function which decides whether anything needs to go
1285 into these sections. */
1286 s
->flags
|= SEC_EXCLUDE
;
1290 if ((s
->flags
& SEC_HAS_CONTENTS
) == 0)
1293 /* Allocate memory for the section contents. Zero the memory
1294 for the benefit of .rela.plt, which has 4 unused entries
1295 at the beginning, and we don't want garbage. */
1296 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->size
);
1297 if (s
->contents
== NULL
)
1301 if (elf_hash_table (info
)->dynamic_sections_created
)
1303 /* Add some entries to the .dynamic section. We fill in the
1304 values later, in riscv_elf_finish_dynamic_sections, but we
1305 must add the entries now so that we get the correct size for
1306 the .dynamic section. The DT_DEBUG entry is filled in by the
1307 dynamic linker and used by the debugger. */
1308 #define add_dynamic_entry(TAG, VAL) \
1309 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1311 if (bfd_link_executable (info
))
1313 if (!add_dynamic_entry (DT_DEBUG
, 0))
1317 if (htab
->elf
.srelplt
->size
!= 0)
1319 if (!add_dynamic_entry (DT_PLTGOT
, 0)
1320 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
1321 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
1322 || !add_dynamic_entry (DT_JMPREL
, 0))
1326 if (!add_dynamic_entry (DT_RELA
, 0)
1327 || !add_dynamic_entry (DT_RELASZ
, 0)
1328 || !add_dynamic_entry (DT_RELAENT
, sizeof (ElfNN_External_Rela
)))
1331 /* If any dynamic relocs apply to a read-only section,
1332 then we need a DT_TEXTREL entry. */
1333 if ((info
->flags
& DF_TEXTREL
) == 0)
1334 elf_link_hash_traverse (&htab
->elf
, maybe_set_textrel
, info
);
1336 if (info
->flags
& DF_TEXTREL
)
1338 if (!add_dynamic_entry (DT_TEXTREL
, 0))
1342 #undef add_dynamic_entry
1348 #define DTP_OFFSET 0x800
1350 /* Return the relocation value for a TLS dtp-relative reloc. */
1353 dtpoff (struct bfd_link_info
*info
, bfd_vma address
)
1355 /* If tls_sec is NULL, we should have signalled an error already. */
1356 if (elf_hash_table (info
)->tls_sec
== NULL
)
1358 return address
- elf_hash_table (info
)->tls_sec
->vma
- DTP_OFFSET
;
1361 /* Return the relocation value for a static TLS tp-relative relocation. */
1364 tpoff (struct bfd_link_info
*info
, bfd_vma address
)
1366 /* If tls_sec is NULL, we should have signalled an error already. */
1367 if (elf_hash_table (info
)->tls_sec
== NULL
)
1369 return address
- elf_hash_table (info
)->tls_sec
->vma
- TP_OFFSET
;
1372 /* Return the global pointer's value, or 0 if it is not in use. */
1375 riscv_global_pointer_value (struct bfd_link_info
*info
)
1377 struct bfd_link_hash_entry
*h
;
1379 h
= bfd_link_hash_lookup (info
->hash
, RISCV_GP_SYMBOL
, FALSE
, FALSE
, TRUE
);
1380 if (h
== NULL
|| h
->type
!= bfd_link_hash_defined
)
1383 return h
->u
.def
.value
+ sec_addr (h
->u
.def
.section
);
1386 /* Emplace a static relocation. */
1388 static bfd_reloc_status_type
1389 perform_relocation (const reloc_howto_type
*howto
,
1390 const Elf_Internal_Rela
*rel
,
1392 asection
*input_section
,
1396 if (howto
->pc_relative
)
1397 value
-= sec_addr (input_section
) + rel
->r_offset
;
1398 value
+= rel
->r_addend
;
1400 switch (ELFNN_R_TYPE (rel
->r_info
))
1403 case R_RISCV_TPREL_HI20
:
1404 case R_RISCV_PCREL_HI20
:
1405 case R_RISCV_GOT_HI20
:
1406 case R_RISCV_TLS_GOT_HI20
:
1407 case R_RISCV_TLS_GD_HI20
:
1408 if (ARCH_SIZE
> 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value
)))
1409 return bfd_reloc_overflow
;
1410 value
= ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value
));
1413 case R_RISCV_LO12_I
:
1414 case R_RISCV_GPREL_I
:
1415 case R_RISCV_TPREL_LO12_I
:
1416 case R_RISCV_TPREL_I
:
1417 case R_RISCV_PCREL_LO12_I
:
1418 value
= ENCODE_ITYPE_IMM (value
);
1421 case R_RISCV_LO12_S
:
1422 case R_RISCV_GPREL_S
:
1423 case R_RISCV_TPREL_LO12_S
:
1424 case R_RISCV_TPREL_S
:
1425 case R_RISCV_PCREL_LO12_S
:
1426 value
= ENCODE_STYPE_IMM (value
);
1430 case R_RISCV_CALL_PLT
:
1431 if (ARCH_SIZE
> 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (value
)))
1432 return bfd_reloc_overflow
;
1433 value
= ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value
))
1434 | (ENCODE_ITYPE_IMM (value
) << 32);
1438 if (!VALID_UJTYPE_IMM (value
))
1439 return bfd_reloc_overflow
;
1440 value
= ENCODE_UJTYPE_IMM (value
);
1443 case R_RISCV_BRANCH
:
1444 if (!VALID_SBTYPE_IMM (value
))
1445 return bfd_reloc_overflow
;
1446 value
= ENCODE_SBTYPE_IMM (value
);
1449 case R_RISCV_RVC_BRANCH
:
1450 if (!VALID_RVC_B_IMM (value
))
1451 return bfd_reloc_overflow
;
1452 value
= ENCODE_RVC_B_IMM (value
);
1455 case R_RISCV_RVC_JUMP
:
1456 if (!VALID_RVC_J_IMM (value
))
1457 return bfd_reloc_overflow
;
1458 value
= ENCODE_RVC_J_IMM (value
);
1461 case R_RISCV_RVC_LUI
:
1462 if (!VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value
)))
1463 return bfd_reloc_overflow
;
1464 value
= ENCODE_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (value
));
1482 case R_RISCV_32_PCREL
:
1483 case R_RISCV_TLS_DTPREL32
:
1484 case R_RISCV_TLS_DTPREL64
:
1487 case R_RISCV_DELETE
:
1488 return bfd_reloc_ok
;
1491 return bfd_reloc_notsupported
;
1494 bfd_vma word
= bfd_get (howto
->bitsize
, input_bfd
, contents
+ rel
->r_offset
);
1495 word
= (word
& ~howto
->dst_mask
) | (value
& howto
->dst_mask
);
1496 bfd_put (howto
->bitsize
, input_bfd
, word
, contents
+ rel
->r_offset
);
1498 return bfd_reloc_ok
;
1501 /* Remember all PC-relative high-part relocs we've encountered to help us
1502 later resolve the corresponding low-part relocs. */
1508 } riscv_pcrel_hi_reloc
;
1510 typedef struct riscv_pcrel_lo_reloc
1512 asection
* input_section
;
1513 struct bfd_link_info
* info
;
1514 reloc_howto_type
* howto
;
1515 const Elf_Internal_Rela
* reloc
;
1518 bfd_byte
* contents
;
1519 struct riscv_pcrel_lo_reloc
* next
;
1520 } riscv_pcrel_lo_reloc
;
1525 riscv_pcrel_lo_reloc
*lo_relocs
;
1526 } riscv_pcrel_relocs
;
1529 riscv_pcrel_reloc_hash (const void *entry
)
1531 const riscv_pcrel_hi_reloc
*e
= entry
;
1532 return (hashval_t
)(e
->address
>> 2);
1536 riscv_pcrel_reloc_eq (const void *entry1
, const void *entry2
)
1538 const riscv_pcrel_hi_reloc
*e1
= entry1
, *e2
= entry2
;
1539 return e1
->address
== e2
->address
;
1543 riscv_init_pcrel_relocs (riscv_pcrel_relocs
*p
)
1546 p
->lo_relocs
= NULL
;
1547 p
->hi_relocs
= htab_create (1024, riscv_pcrel_reloc_hash
,
1548 riscv_pcrel_reloc_eq
, free
);
1549 return p
->hi_relocs
!= NULL
;
1553 riscv_free_pcrel_relocs (riscv_pcrel_relocs
*p
)
1555 riscv_pcrel_lo_reloc
*cur
= p
->lo_relocs
;
1559 riscv_pcrel_lo_reloc
*next
= cur
->next
;
1564 htab_delete (p
->hi_relocs
);
1568 riscv_zero_pcrel_hi_reloc (Elf_Internal_Rela
*rel
,
1569 struct bfd_link_info
*info
,
1573 const reloc_howto_type
*howto
,
1576 /* We may need to reference low addreses in PC-relative modes even when the
1577 * PC is far away from these addresses. For example, undefweak references
1578 * need to produce the address 0 when linked. As 0 is far from the arbitrary
1579 * addresses that we can link PC-relative programs at, the linker can't
1580 * actually relocate references to those symbols. In order to allow these
1581 * programs to work we simply convert the PC-relative auipc sequences to
1582 * 0-relative lui sequences. */
1583 if (bfd_link_pic (info
))
1586 /* If it's possible to reference the symbol using auipc we do so, as that's
1587 * more in the spirit of the PC-relative relocations we're processing. */
1588 bfd_vma offset
= addr
- pc
;
1589 if (ARCH_SIZE
== 32 || VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (offset
)))
1592 /* If it's impossible to reference this with a LUI-based offset then don't
1593 * bother to convert it at all so users still see the PC-relative relocation
1594 * in the truncation message. */
1595 if (ARCH_SIZE
> 32 && !VALID_UTYPE_IMM (RISCV_CONST_HIGH_PART (addr
)))
1598 rel
->r_info
= ELFNN_R_INFO(addr
, R_RISCV_HI20
);
1600 bfd_vma insn
= bfd_get(howto
->bitsize
, input_bfd
, contents
+ rel
->r_offset
);
1601 insn
= (insn
& ~MASK_AUIPC
) | MATCH_LUI
;
1602 bfd_put(howto
->bitsize
, input_bfd
, insn
, contents
+ rel
->r_offset
);
1607 riscv_record_pcrel_hi_reloc (riscv_pcrel_relocs
*p
, bfd_vma addr
,
1608 bfd_vma value
, bfd_boolean absolute
)
1610 bfd_vma offset
= absolute
? value
: value
- addr
;
1611 riscv_pcrel_hi_reloc entry
= {addr
, offset
};
1612 riscv_pcrel_hi_reloc
**slot
=
1613 (riscv_pcrel_hi_reloc
**) htab_find_slot (p
->hi_relocs
, &entry
, INSERT
);
1615 BFD_ASSERT (*slot
== NULL
);
1616 *slot
= (riscv_pcrel_hi_reloc
*) bfd_malloc (sizeof (riscv_pcrel_hi_reloc
));
1624 riscv_record_pcrel_lo_reloc (riscv_pcrel_relocs
*p
,
1625 asection
*input_section
,
1626 struct bfd_link_info
*info
,
1627 reloc_howto_type
*howto
,
1628 const Elf_Internal_Rela
*reloc
,
1633 riscv_pcrel_lo_reloc
*entry
;
1634 entry
= (riscv_pcrel_lo_reloc
*) bfd_malloc (sizeof (riscv_pcrel_lo_reloc
));
1637 *entry
= (riscv_pcrel_lo_reloc
) {input_section
, info
, howto
, reloc
, addr
,
1638 name
, contents
, p
->lo_relocs
};
1639 p
->lo_relocs
= entry
;
1644 riscv_resolve_pcrel_lo_relocs (riscv_pcrel_relocs
*p
)
1646 riscv_pcrel_lo_reloc
*r
;
1648 for (r
= p
->lo_relocs
; r
!= NULL
; r
= r
->next
)
1650 bfd
*input_bfd
= r
->input_section
->owner
;
1652 riscv_pcrel_hi_reloc search
= {r
->addr
, 0};
1653 riscv_pcrel_hi_reloc
*entry
= htab_find (p
->hi_relocs
, &search
);
1656 ((*r
->info
->callbacks
->reloc_overflow
)
1657 (r
->info
, NULL
, r
->name
, r
->howto
->name
, (bfd_vma
) 0,
1658 input_bfd
, r
->input_section
, r
->reloc
->r_offset
));
1662 perform_relocation (r
->howto
, r
->reloc
, entry
->value
, r
->input_section
,
1663 input_bfd
, r
->contents
);
1669 /* Relocate a RISC-V ELF section.
1671 The RELOCATE_SECTION function is called by the new ELF backend linker
1672 to handle the relocations for a section.
1674 The relocs are always passed as Rela structures.
1676 This function is responsible for adjusting the section contents as
1677 necessary, and (if generating a relocatable output file) adjusting
1678 the reloc addend as necessary.
1680 This function does not have to worry about setting the reloc
1681 address or the reloc symbol index.
1683 LOCAL_SYMS is a pointer to the swapped in local symbols.
1685 LOCAL_SECTIONS is an array giving the section in the input file
1686 corresponding to the st_shndx field of each local symbol.
1688 The global hash table entry for the global symbols can be found
1689 via elf_sym_hashes (input_bfd).
1691 When generating relocatable output, this function must handle
1692 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
1693 going to be the section symbol corresponding to the output
1694 section, which means that the addend must be adjusted
1698 riscv_elf_relocate_section (bfd
*output_bfd
,
1699 struct bfd_link_info
*info
,
1701 asection
*input_section
,
1703 Elf_Internal_Rela
*relocs
,
1704 Elf_Internal_Sym
*local_syms
,
1705 asection
**local_sections
)
1707 Elf_Internal_Rela
*rel
;
1708 Elf_Internal_Rela
*relend
;
1709 riscv_pcrel_relocs pcrel_relocs
;
1710 bfd_boolean ret
= FALSE
;
1711 asection
*sreloc
= elf_section_data (input_section
)->sreloc
;
1712 struct riscv_elf_link_hash_table
*htab
= riscv_elf_hash_table (info
);
1713 Elf_Internal_Shdr
*symtab_hdr
= &elf_symtab_hdr (input_bfd
);
1714 struct elf_link_hash_entry
**sym_hashes
= elf_sym_hashes (input_bfd
);
1715 bfd_vma
*local_got_offsets
= elf_local_got_offsets (input_bfd
);
1716 bfd_boolean absolute
;
1718 if (!riscv_init_pcrel_relocs (&pcrel_relocs
))
1721 relend
= relocs
+ input_section
->reloc_count
;
1722 for (rel
= relocs
; rel
< relend
; rel
++)
1724 unsigned long r_symndx
;
1725 struct elf_link_hash_entry
*h
;
1726 Elf_Internal_Sym
*sym
;
1729 bfd_reloc_status_type r
= bfd_reloc_ok
;
1731 bfd_vma off
, ie_off
;
1732 bfd_boolean unresolved_reloc
, is_ie
= FALSE
;
1733 bfd_vma pc
= sec_addr (input_section
) + rel
->r_offset
;
1734 int r_type
= ELFNN_R_TYPE (rel
->r_info
), tls_type
;
1735 reloc_howto_type
*howto
= riscv_elf_rtype_to_howto (input_bfd
, r_type
);
1736 const char *msg
= NULL
;
1737 bfd_boolean resolved_to_zero
;
1740 || r_type
== R_RISCV_GNU_VTINHERIT
|| r_type
== R_RISCV_GNU_VTENTRY
)
1743 /* This is a final link. */
1744 r_symndx
= ELFNN_R_SYM (rel
->r_info
);
1748 unresolved_reloc
= FALSE
;
1749 if (r_symndx
< symtab_hdr
->sh_info
)
1751 sym
= local_syms
+ r_symndx
;
1752 sec
= local_sections
[r_symndx
];
1753 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
1757 bfd_boolean warned
, ignored
;
1759 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
1760 r_symndx
, symtab_hdr
, sym_hashes
,
1762 unresolved_reloc
, warned
, ignored
);
1765 /* To avoid generating warning messages about truncated
1766 relocations, set the relocation's address to be the same as
1767 the start of this section. */
1768 if (input_section
->output_section
!= NULL
)
1769 relocation
= input_section
->output_section
->vma
;
1775 if (sec
!= NULL
&& discarded_section (sec
))
1776 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
1777 rel
, 1, relend
, howto
, 0, contents
);
1779 if (bfd_link_relocatable (info
))
1783 name
= h
->root
.root
.string
;
1786 name
= (bfd_elf_string_from_elf_section
1787 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
1788 if (name
== NULL
|| *name
== '\0')
1789 name
= bfd_section_name (input_bfd
, sec
);
1792 resolved_to_zero
= (h
!= NULL
1793 && UNDEFWEAK_NO_DYNAMIC_RELOC (info
, h
));
1799 case R_RISCV_TPREL_ADD
:
1801 case R_RISCV_JUMP_SLOT
:
1802 case R_RISCV_RELATIVE
:
1803 /* These require nothing of us at all. */
1807 case R_RISCV_BRANCH
:
1808 case R_RISCV_RVC_BRANCH
:
1809 case R_RISCV_RVC_LUI
:
1810 case R_RISCV_LO12_I
:
1811 case R_RISCV_LO12_S
:
1816 case R_RISCV_32_PCREL
:
1817 case R_RISCV_DELETE
:
1818 /* These require no special handling beyond perform_relocation. */
1821 case R_RISCV_GOT_HI20
:
1824 bfd_boolean dyn
, pic
;
1826 off
= h
->got
.offset
;
1827 BFD_ASSERT (off
!= (bfd_vma
) -1);
1828 dyn
= elf_hash_table (info
)->dynamic_sections_created
;
1829 pic
= bfd_link_pic (info
);
1831 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, pic
, h
)
1832 || (pic
&& SYMBOL_REFERENCES_LOCAL (info
, h
)))
1834 /* This is actually a static link, or it is a
1835 -Bsymbolic link and the symbol is defined
1836 locally, or the symbol was forced to be local
1837 because of a version file. We must initialize
1838 this entry in the global offset table. Since the
1839 offset must always be a multiple of the word size,
1840 we use the least significant bit to record whether
1841 we have initialized it already.
1843 When doing a dynamic link, we create a .rela.got
1844 relocation entry to initialize the value. This
1845 is done in the finish_dynamic_symbol routine. */
1850 bfd_put_NN (output_bfd
, relocation
,
1851 htab
->elf
.sgot
->contents
+ off
);
1856 unresolved_reloc
= FALSE
;
1860 BFD_ASSERT (local_got_offsets
!= NULL
1861 && local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
1863 off
= local_got_offsets
[r_symndx
];
1865 /* The offset must always be a multiple of the word size.
1866 So, we can use the least significant bit to record
1867 whether we have already processed this entry. */
1872 if (bfd_link_pic (info
))
1875 Elf_Internal_Rela outrel
;
1877 /* We need to generate a R_RISCV_RELATIVE reloc
1878 for the dynamic linker. */
1879 s
= htab
->elf
.srelgot
;
1880 BFD_ASSERT (s
!= NULL
);
1882 outrel
.r_offset
= sec_addr (htab
->elf
.sgot
) + off
;
1884 ELFNN_R_INFO (0, R_RISCV_RELATIVE
);
1885 outrel
.r_addend
= relocation
;
1887 riscv_elf_append_rela (output_bfd
, s
, &outrel
);
1890 bfd_put_NN (output_bfd
, relocation
,
1891 htab
->elf
.sgot
->contents
+ off
);
1892 local_got_offsets
[r_symndx
] |= 1;
1895 relocation
= sec_addr (htab
->elf
.sgot
) + off
;
1896 absolute
= riscv_zero_pcrel_hi_reloc (rel
,
1903 r_type
= ELFNN_R_TYPE (rel
->r_info
);
1904 howto
= riscv_elf_rtype_to_howto (input_bfd
, r_type
);
1906 r
= bfd_reloc_notsupported
;
1907 else if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs
, pc
,
1908 relocation
, absolute
))
1909 r
= bfd_reloc_overflow
;
1917 bfd_vma old_value
= bfd_get (howto
->bitsize
, input_bfd
,
1918 contents
+ rel
->r_offset
);
1919 relocation
= old_value
+ relocation
;
1929 bfd_vma old_value
= bfd_get (howto
->bitsize
, input_bfd
,
1930 contents
+ rel
->r_offset
);
1931 relocation
= old_value
- relocation
;
1936 /* Handle a call to an undefined weak function. This won't be
1937 relaxed, so we have to handle it here. */
1938 if (h
!= NULL
&& h
->root
.type
== bfd_link_hash_undefweak
1939 && h
->plt
.offset
== MINUS_ONE
)
1941 /* We can use x0 as the base register. */
1942 bfd_vma insn
= bfd_get_32 (input_bfd
,
1943 contents
+ rel
->r_offset
+ 4);
1944 insn
&= ~(OP_MASK_RS1
<< OP_SH_RS1
);
1945 bfd_put_32 (input_bfd
, insn
, contents
+ rel
->r_offset
+ 4);
1946 /* Set the relocation value so that we get 0 after the pc
1947 relative adjustment. */
1948 relocation
= sec_addr (input_section
) + rel
->r_offset
;
1952 case R_RISCV_CALL_PLT
:
1954 case R_RISCV_RVC_JUMP
:
1955 if (bfd_link_pic (info
) && h
!= NULL
&& h
->plt
.offset
!= MINUS_ONE
)
1957 /* Refer to the PLT entry. */
1958 relocation
= sec_addr (htab
->elf
.splt
) + h
->plt
.offset
;
1959 unresolved_reloc
= FALSE
;
1963 case R_RISCV_TPREL_HI20
:
1964 relocation
= tpoff (info
, relocation
);
1967 case R_RISCV_TPREL_LO12_I
:
1968 case R_RISCV_TPREL_LO12_S
:
1969 relocation
= tpoff (info
, relocation
);
1972 case R_RISCV_TPREL_I
:
1973 case R_RISCV_TPREL_S
:
1974 relocation
= tpoff (info
, relocation
);
1975 if (VALID_ITYPE_IMM (relocation
+ rel
->r_addend
))
1977 /* We can use tp as the base register. */
1978 bfd_vma insn
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
1979 insn
&= ~(OP_MASK_RS1
<< OP_SH_RS1
);
1980 insn
|= X_TP
<< OP_SH_RS1
;
1981 bfd_put_32 (input_bfd
, insn
, contents
+ rel
->r_offset
);
1984 r
= bfd_reloc_overflow
;
1987 case R_RISCV_GPREL_I
:
1988 case R_RISCV_GPREL_S
:
1990 bfd_vma gp
= riscv_global_pointer_value (info
);
1991 bfd_boolean x0_base
= VALID_ITYPE_IMM (relocation
+ rel
->r_addend
);
1992 if (x0_base
|| VALID_ITYPE_IMM (relocation
+ rel
->r_addend
- gp
))
1994 /* We can use x0 or gp as the base register. */
1995 bfd_vma insn
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
1996 insn
&= ~(OP_MASK_RS1
<< OP_SH_RS1
);
1999 rel
->r_addend
-= gp
;
2000 insn
|= X_GP
<< OP_SH_RS1
;
2002 bfd_put_32 (input_bfd
, insn
, contents
+ rel
->r_offset
);
2005 r
= bfd_reloc_overflow
;
2009 case R_RISCV_PCREL_HI20
:
2010 absolute
= riscv_zero_pcrel_hi_reloc (rel
,
2017 r_type
= ELFNN_R_TYPE (rel
->r_info
);
2018 howto
= riscv_elf_rtype_to_howto (input_bfd
, r_type
);
2020 r
= bfd_reloc_notsupported
;
2021 else if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs
, pc
,
2022 relocation
+ rel
->r_addend
,
2024 r
= bfd_reloc_overflow
;
2027 case R_RISCV_PCREL_LO12_I
:
2028 case R_RISCV_PCREL_LO12_S
:
2029 /* Addends are not allowed, because then riscv_relax_delete_bytes
2030 would have to search through all relocs to update the addends.
2031 Also, riscv_resolve_pcrel_lo_relocs does not support addends
2032 when searching for a matching hi reloc. */
2035 r
= bfd_reloc_dangerous
;
2039 if (riscv_record_pcrel_lo_reloc (&pcrel_relocs
, input_section
, info
,
2040 howto
, rel
, relocation
, name
,
2043 r
= bfd_reloc_overflow
;
2046 case R_RISCV_TLS_DTPREL32
:
2047 case R_RISCV_TLS_DTPREL64
:
2048 relocation
= dtpoff (info
, relocation
);
2053 if ((input_section
->flags
& SEC_ALLOC
) == 0)
2056 if ((bfd_link_pic (info
)
2058 || (ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
2059 && !resolved_to_zero
)
2060 || h
->root
.type
!= bfd_link_hash_undefweak
)
2061 && (! howto
->pc_relative
2062 || !SYMBOL_CALLS_LOCAL (info
, h
)))
2063 || (!bfd_link_pic (info
)
2069 || h
->root
.type
== bfd_link_hash_undefweak
2070 || h
->root
.type
== bfd_link_hash_undefined
)))
2072 Elf_Internal_Rela outrel
;
2073 bfd_boolean skip_static_relocation
, skip_dynamic_relocation
;
2075 /* When generating a shared object, these relocations
2076 are copied into the output file to be resolved at run
2080 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
2082 skip_static_relocation
= outrel
.r_offset
!= (bfd_vma
) -2;
2083 skip_dynamic_relocation
= outrel
.r_offset
>= (bfd_vma
) -2;
2084 outrel
.r_offset
+= sec_addr (input_section
);
2086 if (skip_dynamic_relocation
)
2087 memset (&outrel
, 0, sizeof outrel
);
2088 else if (h
!= NULL
&& h
->dynindx
!= -1
2089 && !(bfd_link_pic (info
)
2090 && SYMBOLIC_BIND (info
, h
)
2093 outrel
.r_info
= ELFNN_R_INFO (h
->dynindx
, r_type
);
2094 outrel
.r_addend
= rel
->r_addend
;
2098 outrel
.r_info
= ELFNN_R_INFO (0, R_RISCV_RELATIVE
);
2099 outrel
.r_addend
= relocation
+ rel
->r_addend
;
2102 riscv_elf_append_rela (output_bfd
, sreloc
, &outrel
);
2103 if (skip_static_relocation
)
2108 case R_RISCV_TLS_GOT_HI20
:
2112 case R_RISCV_TLS_GD_HI20
:
2115 off
= h
->got
.offset
;
2120 off
= local_got_offsets
[r_symndx
];
2121 local_got_offsets
[r_symndx
] |= 1;
2124 tls_type
= _bfd_riscv_elf_tls_type (input_bfd
, h
, r_symndx
);
2125 BFD_ASSERT (tls_type
& (GOT_TLS_IE
| GOT_TLS_GD
));
2126 /* If this symbol is referenced by both GD and IE TLS, the IE
2127 reference's GOT slot follows the GD reference's slots. */
2129 if ((tls_type
& GOT_TLS_GD
) && (tls_type
& GOT_TLS_IE
))
2130 ie_off
= 2 * GOT_ENTRY_SIZE
;
2136 Elf_Internal_Rela outrel
;
2138 bfd_boolean need_relocs
= FALSE
;
2140 if (htab
->elf
.srelgot
== NULL
)
2145 bfd_boolean dyn
, pic
;
2146 dyn
= htab
->elf
.dynamic_sections_created
;
2147 pic
= bfd_link_pic (info
);
2149 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, pic
, h
)
2150 && (!pic
|| !SYMBOL_REFERENCES_LOCAL (info
, h
)))
2154 /* The GOT entries have not been initialized yet. Do it
2155 now, and emit any relocations. */
2156 if ((bfd_link_pic (info
) || indx
!= 0)
2158 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
2159 || h
->root
.type
!= bfd_link_hash_undefweak
))
2162 if (tls_type
& GOT_TLS_GD
)
2166 outrel
.r_offset
= sec_addr (htab
->elf
.sgot
) + off
;
2167 outrel
.r_addend
= 0;
2168 outrel
.r_info
= ELFNN_R_INFO (indx
, R_RISCV_TLS_DTPMODNN
);
2169 bfd_put_NN (output_bfd
, 0,
2170 htab
->elf
.sgot
->contents
+ off
);
2171 riscv_elf_append_rela (output_bfd
, htab
->elf
.srelgot
, &outrel
);
2174 BFD_ASSERT (! unresolved_reloc
);
2175 bfd_put_NN (output_bfd
,
2176 dtpoff (info
, relocation
),
2177 (htab
->elf
.sgot
->contents
+ off
+
2178 RISCV_ELF_WORD_BYTES
));
2182 bfd_put_NN (output_bfd
, 0,
2183 (htab
->elf
.sgot
->contents
+ off
+
2184 RISCV_ELF_WORD_BYTES
));
2185 outrel
.r_info
= ELFNN_R_INFO (indx
, R_RISCV_TLS_DTPRELNN
);
2186 outrel
.r_offset
+= RISCV_ELF_WORD_BYTES
;
2187 riscv_elf_append_rela (output_bfd
, htab
->elf
.srelgot
, &outrel
);
2192 /* If we are not emitting relocations for a
2193 general dynamic reference, then we must be in a
2194 static link or an executable link with the
2195 symbol binding locally. Mark it as belonging
2196 to module 1, the executable. */
2197 bfd_put_NN (output_bfd
, 1,
2198 htab
->elf
.sgot
->contents
+ off
);
2199 bfd_put_NN (output_bfd
,
2200 dtpoff (info
, relocation
),
2201 (htab
->elf
.sgot
->contents
+ off
+
2202 RISCV_ELF_WORD_BYTES
));
2206 if (tls_type
& GOT_TLS_IE
)
2210 bfd_put_NN (output_bfd
, 0,
2211 htab
->elf
.sgot
->contents
+ off
+ ie_off
);
2212 outrel
.r_offset
= sec_addr (htab
->elf
.sgot
)
2214 outrel
.r_addend
= 0;
2216 outrel
.r_addend
= tpoff (info
, relocation
);
2217 outrel
.r_info
= ELFNN_R_INFO (indx
, R_RISCV_TLS_TPRELNN
);
2218 riscv_elf_append_rela (output_bfd
, htab
->elf
.srelgot
, &outrel
);
2222 bfd_put_NN (output_bfd
, tpoff (info
, relocation
),
2223 htab
->elf
.sgot
->contents
+ off
+ ie_off
);
2228 BFD_ASSERT (off
< (bfd_vma
) -2);
2229 relocation
= sec_addr (htab
->elf
.sgot
) + off
+ (is_ie
? ie_off
: 0);
2230 if (!riscv_record_pcrel_hi_reloc (&pcrel_relocs
, pc
,
2232 r
= bfd_reloc_overflow
;
2233 unresolved_reloc
= FALSE
;
2237 r
= bfd_reloc_notsupported
;
2240 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2241 because such sections are not SEC_ALLOC and thus ld.so will
2242 not process them. */
2243 if (unresolved_reloc
2244 && !((input_section
->flags
& SEC_DEBUGGING
) != 0
2246 && _bfd_elf_section_offset (output_bfd
, info
, input_section
,
2247 rel
->r_offset
) != (bfd_vma
) -1)
2249 (*_bfd_error_handler
)
2250 (_("%pB(%pA+%#" PRIx64
"): "
2251 "unresolvable %s relocation against symbol `%s'"),
2254 (uint64_t) rel
->r_offset
,
2256 h
->root
.root
.string
);
2260 if (r
== bfd_reloc_ok
)
2261 r
= perform_relocation (howto
, rel
, relocation
, input_section
,
2262 input_bfd
, contents
);
2269 case bfd_reloc_overflow
:
2270 info
->callbacks
->reloc_overflow
2271 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
2272 (bfd_vma
) 0, input_bfd
, input_section
, rel
->r_offset
);
2275 case bfd_reloc_undefined
:
2276 info
->callbacks
->undefined_symbol
2277 (info
, name
, input_bfd
, input_section
, rel
->r_offset
,
2281 case bfd_reloc_outofrange
:
2282 msg
= _("%X%P: internal error: out of range error\n");
2285 case bfd_reloc_notsupported
:
2286 msg
= _("%X%P: internal error: unsupported relocation error\n");
2289 case bfd_reloc_dangerous
:
2290 info
->callbacks
->reloc_dangerous
2291 (info
, "%pcrel_lo with addend", input_bfd
, input_section
,
2296 msg
= _("%X%P: internal error: unknown error\n");
2301 info
->callbacks
->einfo (msg
);
2303 /* We already reported the error via a callback, so don't try to report
2304 it again by returning false. That leads to spurious errors. */
2309 ret
= riscv_resolve_pcrel_lo_relocs (&pcrel_relocs
);
2311 riscv_free_pcrel_relocs (&pcrel_relocs
);
2315 /* Finish up dynamic symbol handling. We set the contents of various
2316 dynamic sections here. */
2319 riscv_elf_finish_dynamic_symbol (bfd
*output_bfd
,
2320 struct bfd_link_info
*info
,
2321 struct elf_link_hash_entry
*h
,
2322 Elf_Internal_Sym
*sym
)
2324 struct riscv_elf_link_hash_table
*htab
= riscv_elf_hash_table (info
);
2325 const struct elf_backend_data
*bed
= get_elf_backend_data (output_bfd
);
2327 if (h
->plt
.offset
!= (bfd_vma
) -1)
2329 /* We've decided to create a PLT entry for this symbol. */
2331 bfd_vma i
, header_address
, plt_idx
, got_address
;
2332 uint32_t plt_entry
[PLT_ENTRY_INSNS
];
2333 Elf_Internal_Rela rela
;
2335 BFD_ASSERT (h
->dynindx
!= -1);
2337 /* Calculate the address of the PLT header. */
2338 header_address
= sec_addr (htab
->elf
.splt
);
2340 /* Calculate the index of the entry. */
2341 plt_idx
= (h
->plt
.offset
- PLT_HEADER_SIZE
) / PLT_ENTRY_SIZE
;
2343 /* Calculate the address of the .got.plt entry. */
2344 got_address
= riscv_elf_got_plt_val (plt_idx
, info
);
2346 /* Find out where the .plt entry should go. */
2347 loc
= htab
->elf
.splt
->contents
+ h
->plt
.offset
;
2349 /* Fill in the PLT entry itself. */
2350 riscv_make_plt_entry (got_address
, header_address
+ h
->plt
.offset
,
2352 for (i
= 0; i
< PLT_ENTRY_INSNS
; i
++)
2353 bfd_put_32 (output_bfd
, plt_entry
[i
], loc
+ 4*i
);
2355 /* Fill in the initial value of the .got.plt entry. */
2356 loc
= htab
->elf
.sgotplt
->contents
2357 + (got_address
- sec_addr (htab
->elf
.sgotplt
));
2358 bfd_put_NN (output_bfd
, sec_addr (htab
->elf
.splt
), loc
);
2360 /* Fill in the entry in the .rela.plt section. */
2361 rela
.r_offset
= got_address
;
2363 rela
.r_info
= ELFNN_R_INFO (h
->dynindx
, R_RISCV_JUMP_SLOT
);
2365 loc
= htab
->elf
.srelplt
->contents
+ plt_idx
* sizeof (ElfNN_External_Rela
);
2366 bed
->s
->swap_reloca_out (output_bfd
, &rela
, loc
);
2368 if (!h
->def_regular
)
2370 /* Mark the symbol as undefined, rather than as defined in
2371 the .plt section. Leave the value alone. */
2372 sym
->st_shndx
= SHN_UNDEF
;
2373 /* If the symbol is weak, we do need to clear the value.
2374 Otherwise, the PLT entry would provide a definition for
2375 the symbol even if the symbol wasn't defined anywhere,
2376 and so the symbol would never be NULL. */
2377 if (!h
->ref_regular_nonweak
)
2382 if (h
->got
.offset
!= (bfd_vma
) -1
2383 && !(riscv_elf_hash_entry (h
)->tls_type
& (GOT_TLS_GD
| GOT_TLS_IE
))
2384 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info
, h
))
2388 Elf_Internal_Rela rela
;
2390 /* This symbol has an entry in the GOT. Set it up. */
2392 sgot
= htab
->elf
.sgot
;
2393 srela
= htab
->elf
.srelgot
;
2394 BFD_ASSERT (sgot
!= NULL
&& srela
!= NULL
);
2396 rela
.r_offset
= sec_addr (sgot
) + (h
->got
.offset
&~ (bfd_vma
) 1);
2398 /* If this is a local symbol reference, we just want to emit a RELATIVE
2399 reloc. This can happen if it is a -Bsymbolic link, or a pie link, or
2400 the symbol was forced to be local because of a version file.
2401 The entry in the global offset table will already have been
2402 initialized in the relocate_section function. */
2403 if (bfd_link_pic (info
)
2404 && SYMBOL_REFERENCES_LOCAL (info
, h
))
2406 BFD_ASSERT((h
->got
.offset
& 1) != 0);
2407 asection
*sec
= h
->root
.u
.def
.section
;
2408 rela
.r_info
= ELFNN_R_INFO (0, R_RISCV_RELATIVE
);
2409 rela
.r_addend
= (h
->root
.u
.def
.value
2410 + sec
->output_section
->vma
2411 + sec
->output_offset
);
2415 BFD_ASSERT((h
->got
.offset
& 1) == 0);
2416 BFD_ASSERT (h
->dynindx
!= -1);
2417 rela
.r_info
= ELFNN_R_INFO (h
->dynindx
, R_RISCV_NN
);
2421 bfd_put_NN (output_bfd
, 0,
2422 sgot
->contents
+ (h
->got
.offset
& ~(bfd_vma
) 1));
2423 riscv_elf_append_rela (output_bfd
, srela
, &rela
);
2428 Elf_Internal_Rela rela
;
2431 /* This symbols needs a copy reloc. Set it up. */
2432 BFD_ASSERT (h
->dynindx
!= -1);
2434 rela
.r_offset
= sec_addr (h
->root
.u
.def
.section
) + h
->root
.u
.def
.value
;
2435 rela
.r_info
= ELFNN_R_INFO (h
->dynindx
, R_RISCV_COPY
);
2437 if (h
->root
.u
.def
.section
== htab
->elf
.sdynrelro
)
2438 s
= htab
->elf
.sreldynrelro
;
2440 s
= htab
->elf
.srelbss
;
2441 riscv_elf_append_rela (output_bfd
, s
, &rela
);
2444 /* Mark some specially defined symbols as absolute. */
2445 if (h
== htab
->elf
.hdynamic
2446 || (h
== htab
->elf
.hgot
|| h
== htab
->elf
.hplt
))
2447 sym
->st_shndx
= SHN_ABS
;
2452 /* Finish up the dynamic sections. */
2455 riscv_finish_dyn (bfd
*output_bfd
, struct bfd_link_info
*info
,
2456 bfd
*dynobj
, asection
*sdyn
)
2458 struct riscv_elf_link_hash_table
*htab
= riscv_elf_hash_table (info
);
2459 const struct elf_backend_data
*bed
= get_elf_backend_data (output_bfd
);
2460 size_t dynsize
= bed
->s
->sizeof_dyn
;
2461 bfd_byte
*dyncon
, *dynconend
;
2463 dynconend
= sdyn
->contents
+ sdyn
->size
;
2464 for (dyncon
= sdyn
->contents
; dyncon
< dynconend
; dyncon
+= dynsize
)
2466 Elf_Internal_Dyn dyn
;
2469 bed
->s
->swap_dyn_in (dynobj
, dyncon
, &dyn
);
2474 s
= htab
->elf
.sgotplt
;
2475 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
2478 s
= htab
->elf
.srelplt
;
2479 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
2482 s
= htab
->elf
.srelplt
;
2483 dyn
.d_un
.d_val
= s
->size
;
2489 bed
->s
->swap_dyn_out (output_bfd
, &dyn
, dyncon
);
2495 riscv_elf_finish_dynamic_sections (bfd
*output_bfd
,
2496 struct bfd_link_info
*info
)
2500 struct riscv_elf_link_hash_table
*htab
;
2502 htab
= riscv_elf_hash_table (info
);
2503 BFD_ASSERT (htab
!= NULL
);
2504 dynobj
= htab
->elf
.dynobj
;
2506 sdyn
= bfd_get_linker_section (dynobj
, ".dynamic");
2508 if (elf_hash_table (info
)->dynamic_sections_created
)
2513 splt
= htab
->elf
.splt
;
2514 BFD_ASSERT (splt
!= NULL
&& sdyn
!= NULL
);
2516 ret
= riscv_finish_dyn (output_bfd
, info
, dynobj
, sdyn
);
2521 /* Fill in the head and tail entries in the procedure linkage table. */
2525 uint32_t plt_header
[PLT_HEADER_INSNS
];
2526 riscv_make_plt_header (sec_addr (htab
->elf
.sgotplt
),
2527 sec_addr (splt
), plt_header
);
2529 for (i
= 0; i
< PLT_HEADER_INSNS
; i
++)
2530 bfd_put_32 (output_bfd
, plt_header
[i
], splt
->contents
+ 4*i
);
2532 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
2537 if (htab
->elf
.sgotplt
)
2539 asection
*output_section
= htab
->elf
.sgotplt
->output_section
;
2541 if (bfd_is_abs_section (output_section
))
2543 (*_bfd_error_handler
)
2544 (_("discarded output section: `%pA'"), htab
->elf
.sgotplt
);
2548 if (htab
->elf
.sgotplt
->size
> 0)
2550 /* Write the first two entries in .got.plt, needed for the dynamic
2552 bfd_put_NN (output_bfd
, (bfd_vma
) -1, htab
->elf
.sgotplt
->contents
);
2553 bfd_put_NN (output_bfd
, (bfd_vma
) 0,
2554 htab
->elf
.sgotplt
->contents
+ GOT_ENTRY_SIZE
);
2557 elf_section_data (output_section
)->this_hdr
.sh_entsize
= GOT_ENTRY_SIZE
;
2562 asection
*output_section
= htab
->elf
.sgot
->output_section
;
2564 if (htab
->elf
.sgot
->size
> 0)
2566 /* Set the first entry in the global offset table to the address of
2567 the dynamic section. */
2568 bfd_vma val
= sdyn
? sec_addr (sdyn
) : 0;
2569 bfd_put_NN (output_bfd
, val
, htab
->elf
.sgot
->contents
);
2572 elf_section_data (output_section
)->this_hdr
.sh_entsize
= GOT_ENTRY_SIZE
;
2578 /* Return address for Ith PLT stub in section PLT, for relocation REL
2579 or (bfd_vma) -1 if it should not be included. */
2582 riscv_elf_plt_sym_val (bfd_vma i
, const asection
*plt
,
2583 const arelent
*rel ATTRIBUTE_UNUSED
)
2585 return plt
->vma
+ PLT_HEADER_SIZE
+ i
* PLT_ENTRY_SIZE
;
2588 static enum elf_reloc_type_class
2589 riscv_reloc_type_class (const struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
2590 const asection
*rel_sec ATTRIBUTE_UNUSED
,
2591 const Elf_Internal_Rela
*rela
)
2593 switch (ELFNN_R_TYPE (rela
->r_info
))
2595 case R_RISCV_RELATIVE
:
2596 return reloc_class_relative
;
2597 case R_RISCV_JUMP_SLOT
:
2598 return reloc_class_plt
;
2600 return reloc_class_copy
;
2602 return reloc_class_normal
;
2606 /* Merge backend specific data from an object file to the output
2607 object file when linking. */
2610 _bfd_riscv_elf_merge_private_bfd_data (bfd
*ibfd
, struct bfd_link_info
*info
)
2612 bfd
*obfd
= info
->output_bfd
;
2613 flagword new_flags
= elf_elfheader (ibfd
)->e_flags
;
2614 flagword old_flags
= elf_elfheader (obfd
)->e_flags
;
2616 if (!is_riscv_elf (ibfd
) || !is_riscv_elf (obfd
))
2619 if (strcmp (bfd_get_target (ibfd
), bfd_get_target (obfd
)) != 0)
2621 (*_bfd_error_handler
)
2622 (_("%pB: ABI is incompatible with that of the selected emulation:\n"
2623 " target emulation `%s' does not match `%s'"),
2624 ibfd
, bfd_get_target (ibfd
), bfd_get_target (obfd
));
2628 if (!_bfd_elf_merge_object_attributes (ibfd
, info
))
2631 if (! elf_flags_init (obfd
))
2633 elf_flags_init (obfd
) = TRUE
;
2634 elf_elfheader (obfd
)->e_flags
= new_flags
;
2638 /* Disallow linking different float ABIs. */
2639 if ((old_flags
^ new_flags
) & EF_RISCV_FLOAT_ABI
)
2641 (*_bfd_error_handler
)
2642 (_("%pB: can't link hard-float modules with soft-float modules"), ibfd
);
2646 /* Disallow linking RVE and non-RVE. */
2647 if ((old_flags
^ new_flags
) & EF_RISCV_RVE
)
2649 (*_bfd_error_handler
)
2650 (_("%pB: can't link RVE with other target"), ibfd
);
2654 /* Allow linking RVC and non-RVC, and keep the RVC flag. */
2655 elf_elfheader (obfd
)->e_flags
|= new_flags
& EF_RISCV_RVC
;
2660 bfd_set_error (bfd_error_bad_value
);
2664 /* Delete some bytes from a section while relaxing. */
2667 riscv_relax_delete_bytes (bfd
*abfd
, asection
*sec
, bfd_vma addr
, size_t count
,
2668 struct bfd_link_info
*link_info
)
2670 unsigned int i
, symcount
;
2671 bfd_vma toaddr
= sec
->size
;
2672 struct elf_link_hash_entry
**sym_hashes
= elf_sym_hashes (abfd
);
2673 Elf_Internal_Shdr
*symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
2674 unsigned int sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
2675 struct bfd_elf_section_data
*data
= elf_section_data (sec
);
2676 bfd_byte
*contents
= data
->this_hdr
.contents
;
2678 /* Actually delete the bytes. */
2680 memmove (contents
+ addr
, contents
+ addr
+ count
, toaddr
- addr
- count
);
2682 /* Adjust the location of all of the relocs. Note that we need not
2683 adjust the addends, since all PC-relative references must be against
2684 symbols, which we will adjust below. */
2685 for (i
= 0; i
< sec
->reloc_count
; i
++)
2686 if (data
->relocs
[i
].r_offset
> addr
&& data
->relocs
[i
].r_offset
< toaddr
)
2687 data
->relocs
[i
].r_offset
-= count
;
2689 /* Adjust the local symbols defined in this section. */
2690 for (i
= 0; i
< symtab_hdr
->sh_info
; i
++)
2692 Elf_Internal_Sym
*sym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
+ i
;
2693 if (sym
->st_shndx
== sec_shndx
)
2695 /* If the symbol is in the range of memory we just moved, we
2696 have to adjust its value. */
2697 if (sym
->st_value
> addr
&& sym
->st_value
<= toaddr
)
2698 sym
->st_value
-= count
;
2700 /* If the symbol *spans* the bytes we just deleted (i.e. its
2701 *end* is in the moved bytes but its *start* isn't), then we
2702 must adjust its size.
2704 This test needs to use the original value of st_value, otherwise
2705 we might accidentally decrease size when deleting bytes right
2706 before the symbol. But since deleted relocs can't span across
2707 symbols, we can't have both a st_value and a st_size decrease,
2708 so it is simpler to just use an else. */
2709 else if (sym
->st_value
<= addr
2710 && sym
->st_value
+ sym
->st_size
> addr
2711 && sym
->st_value
+ sym
->st_size
<= toaddr
)
2712 sym
->st_size
-= count
;
2716 /* Now adjust the global symbols defined in this section. */
2717 symcount
= ((symtab_hdr
->sh_size
/ sizeof (ElfNN_External_Sym
))
2718 - symtab_hdr
->sh_info
);
2720 for (i
= 0; i
< symcount
; i
++)
2722 struct elf_link_hash_entry
*sym_hash
= sym_hashes
[i
];
2724 /* The '--wrap SYMBOL' option is causing a pain when the object file,
2725 containing the definition of __wrap_SYMBOL, includes a direct
2726 call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
2727 the same symbol (which is __wrap_SYMBOL), but still exist as two
2728 different symbols in 'sym_hashes', we don't want to adjust
2729 the global symbol __wrap_SYMBOL twice. */
2730 /* The same problem occurs with symbols that are versioned_hidden, as
2731 foo becomes an alias for foo@BAR, and hence they need the same
2733 if (link_info
->wrap_hash
!= NULL
2734 || sym_hash
->versioned
== versioned_hidden
)
2736 struct elf_link_hash_entry
**cur_sym_hashes
;
2738 /* Loop only over the symbols which have already been checked. */
2739 for (cur_sym_hashes
= sym_hashes
; cur_sym_hashes
< &sym_hashes
[i
];
2742 /* If the current symbol is identical to 'sym_hash', that means
2743 the symbol was already adjusted (or at least checked). */
2744 if (*cur_sym_hashes
== sym_hash
)
2747 /* Don't adjust the symbol again. */
2748 if (cur_sym_hashes
< &sym_hashes
[i
])
2752 if ((sym_hash
->root
.type
== bfd_link_hash_defined
2753 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
2754 && sym_hash
->root
.u
.def
.section
== sec
)
2756 /* As above, adjust the value if needed. */
2757 if (sym_hash
->root
.u
.def
.value
> addr
2758 && sym_hash
->root
.u
.def
.value
<= toaddr
)
2759 sym_hash
->root
.u
.def
.value
-= count
;
2761 /* As above, adjust the size if needed. */
2762 else if (sym_hash
->root
.u
.def
.value
<= addr
2763 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
> addr
2764 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
<= toaddr
)
2765 sym_hash
->size
-= count
;
2772 /* A second format for recording PC-relative hi relocations. This stores the
2773 information required to relax them to GP-relative addresses. */
2775 typedef struct riscv_pcgp_hi_reloc riscv_pcgp_hi_reloc
;
2776 struct riscv_pcgp_hi_reloc
2783 riscv_pcgp_hi_reloc
*next
;
2786 typedef struct riscv_pcgp_lo_reloc riscv_pcgp_lo_reloc
;
2787 struct riscv_pcgp_lo_reloc
2790 riscv_pcgp_lo_reloc
*next
;
2795 riscv_pcgp_hi_reloc
*hi
;
2796 riscv_pcgp_lo_reloc
*lo
;
2797 } riscv_pcgp_relocs
;
2800 riscv_init_pcgp_relocs (riscv_pcgp_relocs
*p
)
2808 riscv_free_pcgp_relocs (riscv_pcgp_relocs
*p
,
2809 bfd
*abfd ATTRIBUTE_UNUSED
,
2810 asection
*sec ATTRIBUTE_UNUSED
)
2812 riscv_pcgp_hi_reloc
*c
;
2813 riscv_pcgp_lo_reloc
*l
;
2815 for (c
= p
->hi
; c
!= NULL
;)
2817 riscv_pcgp_hi_reloc
*next
= c
->next
;
2822 for (l
= p
->lo
; l
!= NULL
;)
2824 riscv_pcgp_lo_reloc
*next
= l
->next
;
2831 riscv_record_pcgp_hi_reloc (riscv_pcgp_relocs
*p
, bfd_vma hi_sec_off
,
2832 bfd_vma hi_addend
, bfd_vma hi_addr
,
2833 unsigned hi_sym
, asection
*sym_sec
)
2835 riscv_pcgp_hi_reloc
*new = bfd_malloc (sizeof(*new));
2838 new->hi_sec_off
= hi_sec_off
;
2839 new->hi_addend
= hi_addend
;
2840 new->hi_addr
= hi_addr
;
2841 new->hi_sym
= hi_sym
;
2842 new->sym_sec
= sym_sec
;
2848 static riscv_pcgp_hi_reloc
*
2849 riscv_find_pcgp_hi_reloc(riscv_pcgp_relocs
*p
, bfd_vma hi_sec_off
)
2851 riscv_pcgp_hi_reloc
*c
;
2853 for (c
= p
->hi
; c
!= NULL
; c
= c
->next
)
2854 if (c
->hi_sec_off
== hi_sec_off
)
2860 riscv_delete_pcgp_hi_reloc(riscv_pcgp_relocs
*p
, bfd_vma hi_sec_off
)
2862 bfd_boolean out
= FALSE
;
2863 riscv_pcgp_hi_reloc
*c
;
2865 for (c
= p
->hi
; c
!= NULL
; c
= c
->next
)
2866 if (c
->hi_sec_off
== hi_sec_off
)
2873 riscv_use_pcgp_hi_reloc(riscv_pcgp_relocs
*p
, bfd_vma hi_sec_off
)
2875 bfd_boolean out
= FALSE
;
2876 riscv_pcgp_hi_reloc
*c
;
2878 for (c
= p
->hi
; c
!= NULL
; c
= c
->next
)
2879 if (c
->hi_sec_off
== hi_sec_off
)
2886 riscv_record_pcgp_lo_reloc (riscv_pcgp_relocs
*p
, bfd_vma hi_sec_off
)
2888 riscv_pcgp_lo_reloc
*new = bfd_malloc (sizeof(*new));
2891 new->hi_sec_off
= hi_sec_off
;
2898 riscv_find_pcgp_lo_reloc (riscv_pcgp_relocs
*p
, bfd_vma hi_sec_off
)
2900 riscv_pcgp_lo_reloc
*c
;
2902 for (c
= p
->lo
; c
!= NULL
; c
= c
->next
)
2903 if (c
->hi_sec_off
== hi_sec_off
)
2909 riscv_delete_pcgp_lo_reloc (riscv_pcgp_relocs
*p ATTRIBUTE_UNUSED
,
2910 bfd_vma lo_sec_off ATTRIBUTE_UNUSED
,
2911 size_t bytes ATTRIBUTE_UNUSED
)
2916 typedef bfd_boolean (*relax_func_t
) (bfd
*, asection
*, asection
*,
2917 struct bfd_link_info
*,
2918 Elf_Internal_Rela
*,
2919 bfd_vma
, bfd_vma
, bfd_vma
, bfd_boolean
*,
2920 riscv_pcgp_relocs
*);
2922 /* Relax AUIPC + JALR into JAL. */
2925 _bfd_riscv_relax_call (bfd
*abfd
, asection
*sec
, asection
*sym_sec
,
2926 struct bfd_link_info
*link_info
,
2927 Elf_Internal_Rela
*rel
,
2929 bfd_vma max_alignment
,
2930 bfd_vma reserve_size ATTRIBUTE_UNUSED
,
2932 riscv_pcgp_relocs
*pcgp_relocs ATTRIBUTE_UNUSED
)
2934 bfd_byte
*contents
= elf_section_data (sec
)->this_hdr
.contents
;
2935 bfd_signed_vma foff
= symval
- (sec_addr (sec
) + rel
->r_offset
);
2936 bfd_boolean near_zero
= (symval
+ RISCV_IMM_REACH
/2) < RISCV_IMM_REACH
;
2937 bfd_vma auipc
, jalr
;
2938 int rd
, r_type
, len
= 4, rvc
= elf_elfheader (abfd
)->e_flags
& EF_RISCV_RVC
;
2940 /* If the call crosses section boundaries, an alignment directive could
2941 cause the PC-relative offset to later increase. */
2942 if (VALID_UJTYPE_IMM (foff
) && sym_sec
->output_section
!= sec
->output_section
)
2943 foff
+= (foff
< 0 ? -max_alignment
: max_alignment
);
2945 /* See if this function call can be shortened. */
2946 if (!VALID_UJTYPE_IMM (foff
) && !(!bfd_link_pic (link_info
) && near_zero
))
2949 /* Shorten the function call. */
2950 BFD_ASSERT (rel
->r_offset
+ 8 <= sec
->size
);
2952 auipc
= bfd_get_32 (abfd
, contents
+ rel
->r_offset
);
2953 jalr
= bfd_get_32 (abfd
, contents
+ rel
->r_offset
+ 4);
2954 rd
= (jalr
>> OP_SH_RD
) & OP_MASK_RD
;
2955 rvc
= rvc
&& VALID_RVC_J_IMM (foff
) && ARCH_SIZE
== 32;
2957 if (rvc
&& (rd
== 0 || rd
== X_RA
))
2959 /* Relax to C.J[AL] rd, addr. */
2960 r_type
= R_RISCV_RVC_JUMP
;
2961 auipc
= rd
== 0 ? MATCH_C_J
: MATCH_C_JAL
;
2964 else if (VALID_UJTYPE_IMM (foff
))
2966 /* Relax to JAL rd, addr. */
2967 r_type
= R_RISCV_JAL
;
2968 auipc
= MATCH_JAL
| (rd
<< OP_SH_RD
);
2970 else /* near_zero */
2972 /* Relax to JALR rd, x0, addr. */
2973 r_type
= R_RISCV_LO12_I
;
2974 auipc
= MATCH_JALR
| (rd
<< OP_SH_RD
);
2977 /* Replace the R_RISCV_CALL reloc. */
2978 rel
->r_info
= ELFNN_R_INFO (ELFNN_R_SYM (rel
->r_info
), r_type
);
2979 /* Replace the AUIPC. */
2980 bfd_put (8 * len
, abfd
, auipc
, contents
+ rel
->r_offset
);
2982 /* Delete unnecessary JALR. */
2984 return riscv_relax_delete_bytes (abfd
, sec
, rel
->r_offset
+ len
, 8 - len
,
2988 /* Traverse all output sections and return the max alignment. */
2991 _bfd_riscv_get_max_alignment (asection
*sec
)
2993 unsigned int max_alignment_power
= 0;
2996 for (o
= sec
->output_section
->owner
->sections
; o
!= NULL
; o
= o
->next
)
2998 if (o
->alignment_power
> max_alignment_power
)
2999 max_alignment_power
= o
->alignment_power
;
3002 return (bfd_vma
) 1 << max_alignment_power
;
3005 /* Relax non-PIC global variable references. */
3008 _bfd_riscv_relax_lui (bfd
*abfd
,
3011 struct bfd_link_info
*link_info
,
3012 Elf_Internal_Rela
*rel
,
3014 bfd_vma max_alignment
,
3015 bfd_vma reserve_size
,
3017 riscv_pcgp_relocs
*pcgp_relocs ATTRIBUTE_UNUSED
)
3019 bfd_byte
*contents
= elf_section_data (sec
)->this_hdr
.contents
;
3020 bfd_vma gp
= riscv_global_pointer_value (link_info
);
3021 int use_rvc
= elf_elfheader (abfd
)->e_flags
& EF_RISCV_RVC
;
3023 /* Mergeable symbols and code might later move out of range. */
3024 if (sym_sec
->flags
& (SEC_MERGE
| SEC_CODE
))
3027 BFD_ASSERT (rel
->r_offset
+ 4 <= sec
->size
);
3031 /* If gp and the symbol are in the same output section, then
3032 consider only that section's alignment. */
3033 struct bfd_link_hash_entry
*h
=
3034 bfd_link_hash_lookup (link_info
->hash
, RISCV_GP_SYMBOL
, FALSE
, FALSE
,
3036 if (h
->u
.def
.section
->output_section
== sym_sec
->output_section
)
3037 max_alignment
= (bfd_vma
) 1 << sym_sec
->output_section
->alignment_power
;
3040 /* Is the reference in range of x0 or gp?
3041 Valid gp range conservatively because of alignment issue. */
3042 if (VALID_ITYPE_IMM (symval
)
3044 && VALID_ITYPE_IMM (symval
- gp
+ max_alignment
+ reserve_size
))
3046 && VALID_ITYPE_IMM (symval
- gp
- max_alignment
- reserve_size
)))
3048 unsigned sym
= ELFNN_R_SYM (rel
->r_info
);
3049 switch (ELFNN_R_TYPE (rel
->r_info
))
3051 case R_RISCV_LO12_I
:
3052 rel
->r_info
= ELFNN_R_INFO (sym
, R_RISCV_GPREL_I
);
3055 case R_RISCV_LO12_S
:
3056 rel
->r_info
= ELFNN_R_INFO (sym
, R_RISCV_GPREL_S
);
3060 /* We can delete the unnecessary LUI and reloc. */
3061 rel
->r_info
= ELFNN_R_INFO (0, R_RISCV_NONE
);
3063 return riscv_relax_delete_bytes (abfd
, sec
, rel
->r_offset
, 4,
3071 /* Can we relax LUI to C.LUI? Alignment might move the section forward;
3072 account for this assuming page alignment at worst. */
3074 && ELFNN_R_TYPE (rel
->r_info
) == R_RISCV_HI20
3075 && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval
))
3076 && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval
+ ELF_MAXPAGESIZE
)))
3078 /* Replace LUI with C.LUI if legal (i.e., rd != x0 and rd != x2/sp). */
3079 bfd_vma lui
= bfd_get_32 (abfd
, contents
+ rel
->r_offset
);
3080 unsigned rd
= ((unsigned)lui
>> OP_SH_RD
) & OP_MASK_RD
;
3081 if (rd
== 0 || rd
== X_SP
)
3084 lui
= (lui
& (OP_MASK_RD
<< OP_SH_RD
)) | MATCH_C_LUI
;
3085 bfd_put_32 (abfd
, lui
, contents
+ rel
->r_offset
);
3087 /* Replace the R_RISCV_HI20 reloc. */
3088 rel
->r_info
= ELFNN_R_INFO (ELFNN_R_SYM (rel
->r_info
), R_RISCV_RVC_LUI
);
3091 return riscv_relax_delete_bytes (abfd
, sec
, rel
->r_offset
+ 2, 2,
3098 /* Relax non-PIC TLS references. */
3101 _bfd_riscv_relax_tls_le (bfd
*abfd
,
3103 asection
*sym_sec ATTRIBUTE_UNUSED
,
3104 struct bfd_link_info
*link_info
,
3105 Elf_Internal_Rela
*rel
,
3107 bfd_vma max_alignment ATTRIBUTE_UNUSED
,
3108 bfd_vma reserve_size ATTRIBUTE_UNUSED
,
3110 riscv_pcgp_relocs
*prcel_relocs ATTRIBUTE_UNUSED
)
3112 /* See if this symbol is in range of tp. */
3113 if (RISCV_CONST_HIGH_PART (tpoff (link_info
, symval
)) != 0)
3116 BFD_ASSERT (rel
->r_offset
+ 4 <= sec
->size
);
3117 switch (ELFNN_R_TYPE (rel
->r_info
))
3119 case R_RISCV_TPREL_LO12_I
:
3120 rel
->r_info
= ELFNN_R_INFO (ELFNN_R_SYM (rel
->r_info
), R_RISCV_TPREL_I
);
3123 case R_RISCV_TPREL_LO12_S
:
3124 rel
->r_info
= ELFNN_R_INFO (ELFNN_R_SYM (rel
->r_info
), R_RISCV_TPREL_S
);
3127 case R_RISCV_TPREL_HI20
:
3128 case R_RISCV_TPREL_ADD
:
3129 /* We can delete the unnecessary instruction and reloc. */
3130 rel
->r_info
= ELFNN_R_INFO (0, R_RISCV_NONE
);
3132 return riscv_relax_delete_bytes (abfd
, sec
, rel
->r_offset
, 4, link_info
);
3139 /* Implement R_RISCV_ALIGN by deleting excess alignment NOPs. */
3142 _bfd_riscv_relax_align (bfd
*abfd
, asection
*sec
,
3144 struct bfd_link_info
*link_info
,
3145 Elf_Internal_Rela
*rel
,
3147 bfd_vma max_alignment ATTRIBUTE_UNUSED
,
3148 bfd_vma reserve_size ATTRIBUTE_UNUSED
,
3149 bfd_boolean
*again ATTRIBUTE_UNUSED
,
3150 riscv_pcgp_relocs
*pcrel_relocs ATTRIBUTE_UNUSED
)
3152 bfd_byte
*contents
= elf_section_data (sec
)->this_hdr
.contents
;
3153 bfd_vma alignment
= 1, pos
;
3154 while (alignment
<= rel
->r_addend
)
3157 symval
-= rel
->r_addend
;
3158 bfd_vma aligned_addr
= ((symval
- 1) & ~(alignment
- 1)) + alignment
;
3159 bfd_vma nop_bytes
= aligned_addr
- symval
;
3161 /* Once we've handled an R_RISCV_ALIGN, we can't relax anything else. */
3162 sec
->sec_flg0
= TRUE
;
3164 /* Make sure there are enough NOPs to actually achieve the alignment. */
3165 if (rel
->r_addend
< nop_bytes
)
3168 (_("%pB(%pA+%#" PRIx64
"): %" PRId64
" bytes required for alignment "
3169 "to %" PRId64
"-byte boundary, but only %" PRId64
" present"),
3170 abfd
, sym_sec
, (uint64_t) rel
->r_offset
,
3171 (int64_t) nop_bytes
, (int64_t) alignment
, (int64_t) rel
->r_addend
);
3172 bfd_set_error (bfd_error_bad_value
);
3176 /* Delete the reloc. */
3177 rel
->r_info
= ELFNN_R_INFO (0, R_RISCV_NONE
);
3179 /* If the number of NOPs is already correct, there's nothing to do. */
3180 if (nop_bytes
== rel
->r_addend
)
3183 /* Write as many RISC-V NOPs as we need. */
3184 for (pos
= 0; pos
< (nop_bytes
& -4); pos
+= 4)
3185 bfd_put_32 (abfd
, RISCV_NOP
, contents
+ rel
->r_offset
+ pos
);
3187 /* Write a final RVC NOP if need be. */
3188 if (nop_bytes
% 4 != 0)
3189 bfd_put_16 (abfd
, RVC_NOP
, contents
+ rel
->r_offset
+ pos
);
3191 /* Delete the excess bytes. */
3192 return riscv_relax_delete_bytes (abfd
, sec
, rel
->r_offset
+ nop_bytes
,
3193 rel
->r_addend
- nop_bytes
, link_info
);
3196 /* Relax PC-relative references to GP-relative references. */
3199 _bfd_riscv_relax_pc (bfd
*abfd
,
3202 struct bfd_link_info
*link_info
,
3203 Elf_Internal_Rela
*rel
,
3205 bfd_vma max_alignment
,
3206 bfd_vma reserve_size
,
3207 bfd_boolean
*again ATTRIBUTE_UNUSED
,
3208 riscv_pcgp_relocs
*pcgp_relocs
)
3210 bfd_vma gp
= riscv_global_pointer_value (link_info
);
3212 BFD_ASSERT (rel
->r_offset
+ 4 <= sec
->size
);
3214 /* Chain the _LO relocs to their cooresponding _HI reloc to compute the
3215 * actual target address. */
3216 riscv_pcgp_hi_reloc hi_reloc
;
3217 memset (&hi_reloc
, 0, sizeof (hi_reloc
));
3218 switch (ELFNN_R_TYPE (rel
->r_info
))
3220 case R_RISCV_PCREL_LO12_I
:
3221 case R_RISCV_PCREL_LO12_S
:
3223 riscv_pcgp_hi_reloc
*hi
= riscv_find_pcgp_hi_reloc (pcgp_relocs
,
3224 symval
- sec_addr(sym_sec
));
3227 riscv_record_pcgp_lo_reloc (pcgp_relocs
, symval
- sec_addr(sym_sec
));
3232 symval
= hi_reloc
.hi_addr
;
3233 sym_sec
= hi_reloc
.sym_sec
;
3234 if (!riscv_use_pcgp_hi_reloc(pcgp_relocs
, hi
->hi_sec_off
))
3236 (_("%pB(%pA+%#" PRIx64
"): Unable to clear RISCV_PCREL_HI20 reloc "
3237 "for corresponding RISCV_PCREL_LO12 reloc"),
3238 abfd
, sec
, (uint64_t) rel
->r_offset
);
3242 case R_RISCV_PCREL_HI20
:
3243 /* Mergeable symbols and code might later move out of range. */
3244 if (sym_sec
->flags
& (SEC_MERGE
| SEC_CODE
))
3247 /* If the cooresponding lo relocation has already been seen then it's not
3248 * safe to relax this relocation. */
3249 if (riscv_find_pcgp_lo_reloc (pcgp_relocs
, rel
->r_offset
))
3260 /* If gp and the symbol are in the same output section, then
3261 consider only that section's alignment. */
3262 struct bfd_link_hash_entry
*h
=
3263 bfd_link_hash_lookup (link_info
->hash
, RISCV_GP_SYMBOL
, FALSE
, FALSE
, TRUE
);
3264 if (h
->u
.def
.section
->output_section
== sym_sec
->output_section
)
3265 max_alignment
= (bfd_vma
) 1 << sym_sec
->output_section
->alignment_power
;
3268 /* Is the reference in range of x0 or gp?
3269 Valid gp range conservatively because of alignment issue. */
3270 if (VALID_ITYPE_IMM (symval
)
3272 && VALID_ITYPE_IMM (symval
- gp
+ max_alignment
+ reserve_size
))
3274 && VALID_ITYPE_IMM (symval
- gp
- max_alignment
- reserve_size
)))
3276 unsigned sym
= hi_reloc
.hi_sym
;
3277 switch (ELFNN_R_TYPE (rel
->r_info
))
3279 case R_RISCV_PCREL_LO12_I
:
3280 rel
->r_info
= ELFNN_R_INFO (sym
, R_RISCV_GPREL_I
);
3281 rel
->r_addend
+= hi_reloc
.hi_addend
;
3282 return riscv_delete_pcgp_lo_reloc (pcgp_relocs
, rel
->r_offset
, 4);
3284 case R_RISCV_PCREL_LO12_S
:
3285 rel
->r_info
= ELFNN_R_INFO (sym
, R_RISCV_GPREL_S
);
3286 rel
->r_addend
+= hi_reloc
.hi_addend
;
3287 return riscv_delete_pcgp_lo_reloc (pcgp_relocs
, rel
->r_offset
, 4);
3289 case R_RISCV_PCREL_HI20
:
3290 riscv_record_pcgp_hi_reloc (pcgp_relocs
,
3294 ELFNN_R_SYM(rel
->r_info
),
3296 /* We can delete the unnecessary AUIPC and reloc. */
3297 rel
->r_info
= ELFNN_R_INFO (0, R_RISCV_DELETE
);
3299 return riscv_delete_pcgp_hi_reloc (pcgp_relocs
, rel
->r_offset
);
3309 /* Relax PC-relative references to GP-relative references. */
3312 _bfd_riscv_relax_delete (bfd
*abfd
,
3314 asection
*sym_sec ATTRIBUTE_UNUSED
,
3315 struct bfd_link_info
*link_info
,
3316 Elf_Internal_Rela
*rel
,
3317 bfd_vma symval ATTRIBUTE_UNUSED
,
3318 bfd_vma max_alignment ATTRIBUTE_UNUSED
,
3319 bfd_vma reserve_size ATTRIBUTE_UNUSED
,
3320 bfd_boolean
*again ATTRIBUTE_UNUSED
,
3321 riscv_pcgp_relocs
*pcgp_relocs ATTRIBUTE_UNUSED
)
3323 if (!riscv_relax_delete_bytes(abfd
, sec
, rel
->r_offset
, rel
->r_addend
,
3326 rel
->r_info
= ELFNN_R_INFO(0, R_RISCV_NONE
);
3330 /* Relax a section. Pass 0 shortens code sequences unless disabled. Pass 1
3331 deletes the bytes that pass 0 made obselete. Pass 2, which cannot be
3332 disabled, handles code alignment directives. */
3335 _bfd_riscv_relax_section (bfd
*abfd
, asection
*sec
,
3336 struct bfd_link_info
*info
,
3339 Elf_Internal_Shdr
*symtab_hdr
= &elf_symtab_hdr (abfd
);
3340 struct riscv_elf_link_hash_table
*htab
= riscv_elf_hash_table (info
);
3341 struct bfd_elf_section_data
*data
= elf_section_data (sec
);
3342 Elf_Internal_Rela
*relocs
;
3343 bfd_boolean ret
= FALSE
;
3345 bfd_vma max_alignment
, reserve_size
= 0;
3346 riscv_pcgp_relocs pcgp_relocs
;
3350 if (bfd_link_relocatable (info
)
3352 || (sec
->flags
& SEC_RELOC
) == 0
3353 || sec
->reloc_count
== 0
3354 || (info
->disable_target_specific_optimizations
3355 && info
->relax_pass
== 0))
3358 riscv_init_pcgp_relocs (&pcgp_relocs
);
3360 /* Read this BFD's relocs if we haven't done so already. */
3362 relocs
= data
->relocs
;
3363 else if (!(relocs
= _bfd_elf_link_read_relocs (abfd
, sec
, NULL
, NULL
,
3364 info
->keep_memory
)))
3369 max_alignment
= htab
->max_alignment
;
3370 if (max_alignment
== (bfd_vma
) -1)
3372 max_alignment
= _bfd_riscv_get_max_alignment (sec
);
3373 htab
->max_alignment
= max_alignment
;
3377 max_alignment
= _bfd_riscv_get_max_alignment (sec
);
3379 /* Examine and consider relaxing each reloc. */
3380 for (i
= 0; i
< sec
->reloc_count
; i
++)
3383 Elf_Internal_Rela
*rel
= relocs
+ i
;
3384 relax_func_t relax_func
;
3385 int type
= ELFNN_R_TYPE (rel
->r_info
);
3389 if (info
->relax_pass
== 0)
3391 if (type
== R_RISCV_CALL
|| type
== R_RISCV_CALL_PLT
)
3392 relax_func
= _bfd_riscv_relax_call
;
3393 else if (type
== R_RISCV_HI20
3394 || type
== R_RISCV_LO12_I
3395 || type
== R_RISCV_LO12_S
)
3396 relax_func
= _bfd_riscv_relax_lui
;
3397 else if (!bfd_link_pic(info
)
3398 && (type
== R_RISCV_PCREL_HI20
3399 || type
== R_RISCV_PCREL_LO12_I
3400 || type
== R_RISCV_PCREL_LO12_S
))
3401 relax_func
= _bfd_riscv_relax_pc
;
3402 else if (type
== R_RISCV_TPREL_HI20
3403 || type
== R_RISCV_TPREL_ADD
3404 || type
== R_RISCV_TPREL_LO12_I
3405 || type
== R_RISCV_TPREL_LO12_S
)
3406 relax_func
= _bfd_riscv_relax_tls_le
;
3410 /* Only relax this reloc if it is paired with R_RISCV_RELAX. */
3411 if (i
== sec
->reloc_count
- 1
3412 || ELFNN_R_TYPE ((rel
+ 1)->r_info
) != R_RISCV_RELAX
3413 || rel
->r_offset
!= (rel
+ 1)->r_offset
)
3416 /* Skip over the R_RISCV_RELAX. */
3419 else if (info
->relax_pass
== 1 && type
== R_RISCV_DELETE
)
3420 relax_func
= _bfd_riscv_relax_delete
;
3421 else if (info
->relax_pass
== 2 && type
== R_RISCV_ALIGN
)
3422 relax_func
= _bfd_riscv_relax_align
;
3426 data
->relocs
= relocs
;
3428 /* Read this BFD's contents if we haven't done so already. */
3429 if (!data
->this_hdr
.contents
3430 && !bfd_malloc_and_get_section (abfd
, sec
, &data
->this_hdr
.contents
))
3433 /* Read this BFD's symbols if we haven't done so already. */
3434 if (symtab_hdr
->sh_info
!= 0
3435 && !symtab_hdr
->contents
3436 && !(symtab_hdr
->contents
=
3437 (unsigned char *) bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
3438 symtab_hdr
->sh_info
,
3439 0, NULL
, NULL
, NULL
)))
3442 /* Get the value of the symbol referred to by the reloc. */
3443 if (ELFNN_R_SYM (rel
->r_info
) < symtab_hdr
->sh_info
)
3445 /* A local symbol. */
3446 Elf_Internal_Sym
*isym
= ((Elf_Internal_Sym
*) symtab_hdr
->contents
3447 + ELFNN_R_SYM (rel
->r_info
));
3448 reserve_size
= (isym
->st_size
- rel
->r_addend
) > isym
->st_size
3449 ? 0 : isym
->st_size
- rel
->r_addend
;
3451 if (isym
->st_shndx
== SHN_UNDEF
)
3452 sym_sec
= sec
, symval
= sec_addr (sec
) + rel
->r_offset
;
3455 BFD_ASSERT (isym
->st_shndx
< elf_numsections (abfd
));
3456 sym_sec
= elf_elfsections (abfd
)[isym
->st_shndx
]->bfd_section
;
3458 /* The purpose of this code is unknown. It breaks linker scripts
3459 for embedded development that place sections at address zero.
3460 This code is believed to be unnecessary. Disabling it but not
3461 yet removing it, in case something breaks. */
3462 if (sec_addr (sym_sec
) == 0)
3465 symval
= sec_addr (sym_sec
) + isym
->st_value
;
3471 struct elf_link_hash_entry
*h
;
3473 indx
= ELFNN_R_SYM (rel
->r_info
) - symtab_hdr
->sh_info
;
3474 h
= elf_sym_hashes (abfd
)[indx
];
3476 while (h
->root
.type
== bfd_link_hash_indirect
3477 || h
->root
.type
== bfd_link_hash_warning
)
3478 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
3480 if (h
->plt
.offset
!= MINUS_ONE
)
3481 symval
= sec_addr (htab
->elf
.splt
) + h
->plt
.offset
;
3482 else if (h
->root
.u
.def
.section
->output_section
== NULL
3483 || (h
->root
.type
!= bfd_link_hash_defined
3484 && h
->root
.type
!= bfd_link_hash_defweak
))
3487 symval
= sec_addr (h
->root
.u
.def
.section
) + h
->root
.u
.def
.value
;
3489 if (h
->type
!= STT_FUNC
)
3491 (h
->size
- rel
->r_addend
) > h
->size
? 0 : h
->size
- rel
->r_addend
;
3492 sym_sec
= h
->root
.u
.def
.section
;
3495 symval
+= rel
->r_addend
;
3497 if (!relax_func (abfd
, sec
, sym_sec
, info
, rel
, symval
,
3498 max_alignment
, reserve_size
, again
,
3506 if (relocs
!= data
->relocs
)
3508 riscv_free_pcgp_relocs(&pcgp_relocs
, abfd
, sec
);
3514 # define PRSTATUS_SIZE 0 /* FIXME */
3515 # define PRSTATUS_OFFSET_PR_CURSIG 12
3516 # define PRSTATUS_OFFSET_PR_PID 24
3517 # define PRSTATUS_OFFSET_PR_REG 72
3518 # define ELF_GREGSET_T_SIZE 128
3519 # define PRPSINFO_SIZE 128
3520 # define PRPSINFO_OFFSET_PR_PID 16
3521 # define PRPSINFO_OFFSET_PR_FNAME 32
3522 # define PRPSINFO_OFFSET_PR_PSARGS 48
3524 # define PRSTATUS_SIZE 376
3525 # define PRSTATUS_OFFSET_PR_CURSIG 12
3526 # define PRSTATUS_OFFSET_PR_PID 32
3527 # define PRSTATUS_OFFSET_PR_REG 112
3528 # define ELF_GREGSET_T_SIZE 256
3529 # define PRPSINFO_SIZE 136
3530 # define PRPSINFO_OFFSET_PR_PID 24
3531 # define PRPSINFO_OFFSET_PR_FNAME 40
3532 # define PRPSINFO_OFFSET_PR_PSARGS 56
3535 /* Support for core dump NOTE sections. */
3538 riscv_elf_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
3540 switch (note
->descsz
)
3545 case PRSTATUS_SIZE
: /* sizeof(struct elf_prstatus) on Linux/RISC-V. */
3547 elf_tdata (abfd
)->core
->signal
3548 = bfd_get_16 (abfd
, note
->descdata
+ PRSTATUS_OFFSET_PR_CURSIG
);
3551 elf_tdata (abfd
)->core
->lwpid
3552 = bfd_get_32 (abfd
, note
->descdata
+ PRSTATUS_OFFSET_PR_PID
);
3556 /* Make a ".reg/999" section. */
3557 return _bfd_elfcore_make_pseudosection (abfd
, ".reg", ELF_GREGSET_T_SIZE
,
3558 note
->descpos
+ PRSTATUS_OFFSET_PR_REG
);
3562 riscv_elf_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
3564 switch (note
->descsz
)
3569 case PRPSINFO_SIZE
: /* sizeof(struct elf_prpsinfo) on Linux/RISC-V. */
3571 elf_tdata (abfd
)->core
->pid
3572 = bfd_get_32 (abfd
, note
->descdata
+ PRPSINFO_OFFSET_PR_PID
);
3575 elf_tdata (abfd
)->core
->program
= _bfd_elfcore_strndup
3576 (abfd
, note
->descdata
+ PRPSINFO_OFFSET_PR_FNAME
, 16);
3579 elf_tdata (abfd
)->core
->command
= _bfd_elfcore_strndup
3580 (abfd
, note
->descdata
+ PRPSINFO_OFFSET_PR_PSARGS
, 80);
3584 /* Note that for some reason, a spurious space is tacked
3585 onto the end of the args in some (at least one anyway)
3586 implementations, so strip it off if it exists. */
3589 char *command
= elf_tdata (abfd
)->core
->command
;
3590 int n
= strlen (command
);
3592 if (0 < n
&& command
[n
- 1] == ' ')
3593 command
[n
- 1] = '\0';
3599 /* Set the right mach type. */
3601 riscv_elf_object_p (bfd
*abfd
)
3603 /* There are only two mach types in RISCV currently. */
3604 if (strcmp (abfd
->xvec
->name
, "elf32-littleriscv") == 0)
3605 bfd_default_set_arch_mach (abfd
, bfd_arch_riscv
, bfd_mach_riscv32
);
3607 bfd_default_set_arch_mach (abfd
, bfd_arch_riscv
, bfd_mach_riscv64
);
3613 #define TARGET_LITTLE_SYM riscv_elfNN_vec
3614 #define TARGET_LITTLE_NAME "elfNN-littleriscv"
3616 #define elf_backend_reloc_type_class riscv_reloc_type_class
3618 #define bfd_elfNN_bfd_reloc_name_lookup riscv_reloc_name_lookup
3619 #define bfd_elfNN_bfd_link_hash_table_create riscv_elf_link_hash_table_create
3620 #define bfd_elfNN_bfd_reloc_type_lookup riscv_reloc_type_lookup
3621 #define bfd_elfNN_bfd_merge_private_bfd_data \
3622 _bfd_riscv_elf_merge_private_bfd_data
3624 #define elf_backend_copy_indirect_symbol riscv_elf_copy_indirect_symbol
3625 #define elf_backend_create_dynamic_sections riscv_elf_create_dynamic_sections
3626 #define elf_backend_check_relocs riscv_elf_check_relocs
3627 #define elf_backend_adjust_dynamic_symbol riscv_elf_adjust_dynamic_symbol
3628 #define elf_backend_size_dynamic_sections riscv_elf_size_dynamic_sections
3629 #define elf_backend_relocate_section riscv_elf_relocate_section
3630 #define elf_backend_finish_dynamic_symbol riscv_elf_finish_dynamic_symbol
3631 #define elf_backend_finish_dynamic_sections riscv_elf_finish_dynamic_sections
3632 #define elf_backend_gc_mark_hook riscv_elf_gc_mark_hook
3633 #define elf_backend_plt_sym_val riscv_elf_plt_sym_val
3634 #define elf_backend_grok_prstatus riscv_elf_grok_prstatus
3635 #define elf_backend_grok_psinfo riscv_elf_grok_psinfo
3636 #define elf_backend_object_p riscv_elf_object_p
3637 #define elf_info_to_howto_rel NULL
3638 #define elf_info_to_howto riscv_info_to_howto_rela
3639 #define bfd_elfNN_bfd_relax_section _bfd_riscv_relax_section
3641 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
3643 #define elf_backend_can_gc_sections 1
3644 #define elf_backend_can_refcount 1
3645 #define elf_backend_want_got_plt 1
3646 #define elf_backend_plt_readonly 1
3647 #define elf_backend_plt_alignment 4
3648 #define elf_backend_want_plt_sym 1
3649 #define elf_backend_got_header_size (ARCH_SIZE / 8)
3650 #define elf_backend_want_dynrelro 1
3651 #define elf_backend_rela_normal 1
3652 #define elf_backend_default_execstack 0
3654 #include "elfNN-target.h"