fix bfd for riscv.
This commit is contained in:
parent
4306995b47
commit
286899b79e
|
@ -26,10 +26,12 @@
|
|||
|
||||
#include "sysdep.h"
|
||||
#include "bfd.h"
|
||||
#include "libiberty.h"
|
||||
#include "libbfd.h"
|
||||
#include "bfdlink.h"
|
||||
#include "genlink.h"
|
||||
#include "bfd_stdint.h"
|
||||
#include "elf-bfd.h"
|
||||
#include "bfdlink.h"
|
||||
#include "objalloc.h"
|
||||
#include "elfxx-riscv.h"
|
||||
#include "elf/riscv.h"
|
||||
#include "opcode/riscv.h"
|
||||
|
@ -358,7 +360,7 @@ riscv_elf_create_dynamic_sections (bfd *dynobj,
|
|||
return FALSE;
|
||||
|
||||
htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
|
||||
if (!info->shared)
|
||||
if (!bfd_link_pic (info))
|
||||
{
|
||||
htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
|
||||
htab->sdyntdata =
|
||||
|
@ -367,7 +369,7 @@ riscv_elf_create_dynamic_sections (bfd *dynobj,
|
|||
}
|
||||
|
||||
if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss
|
||||
|| (!info->shared && (!htab->srelbss || !htab->sdyntdata)))
|
||||
|| (!bfd_link_pic (info) && (!htab->srelbss || !htab->sdyntdata)))
|
||||
abort ();
|
||||
|
||||
return TRUE;
|
||||
|
@ -498,7 +500,7 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
const Elf_Internal_Rela *rel;
|
||||
asection *sreloc = NULL;
|
||||
|
||||
if (info->relocatable)
|
||||
if (bfd_link_relocatable (info))
|
||||
return TRUE;
|
||||
|
||||
htab = riscv_elf_hash_table (info);
|
||||
|
@ -547,7 +549,7 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
break;
|
||||
|
||||
case R_RISCV_TLS_GOT_HI20:
|
||||
if (info->shared)
|
||||
if (bfd_link_pic (info))
|
||||
info->flags |= DF_STATIC_TLS;
|
||||
if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
|
||||
|| !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_IE))
|
||||
|
@ -579,19 +581,19 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
case R_RISCV_BRANCH:
|
||||
case R_RISCV_PCREL_HI20:
|
||||
/* In shared libs, these relocs are known to bind locally. */
|
||||
if (info->shared)
|
||||
if (bfd_link_pic (info))
|
||||
break;
|
||||
goto static_reloc;
|
||||
|
||||
case R_RISCV_TPREL_HI20:
|
||||
if (!info->executable)
|
||||
if (!bfd_link_executable (info))
|
||||
return bad_static_reloc (abfd, r_type, h);
|
||||
if (h != NULL)
|
||||
riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
|
||||
goto static_reloc;
|
||||
|
||||
case R_RISCV_HI20:
|
||||
if (info->shared)
|
||||
if (bfd_link_pic (info))
|
||||
return bad_static_reloc (abfd, r_type, h);
|
||||
/* Fall through. */
|
||||
|
||||
|
@ -606,7 +608,7 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
if (h != NULL)
|
||||
h->non_got_ref = 1;
|
||||
|
||||
if (h != NULL && !info->shared)
|
||||
if (h != NULL && !bfd_link_pic (info))
|
||||
{
|
||||
/* We may need a .plt entry if the function this reloc
|
||||
refers to is in a shared lib. */
|
||||
|
@ -634,14 +636,14 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
may need to keep relocations for symbols satisfied by a
|
||||
dynamic library if we manage to avoid copy relocs for the
|
||||
symbol. */
|
||||
if ((info->shared
|
||||
if ((bfd_link_pic (info)
|
||||
&& (sec->flags & SEC_ALLOC) != 0
|
||||
&& (! riscv_elf_rtype_to_howto (r_type)->pc_relative
|
||||
|| (h != NULL
|
||||
&& (! info->symbolic
|
||||
|| h->root.type == bfd_link_hash_defweak
|
||||
|| !h->def_regular))))
|
||||
|| (!info->shared
|
||||
|| (!bfd_link_pic (info)
|
||||
&& (sec->flags & SEC_ALLOC) != 0
|
||||
&& h != NULL
|
||||
&& (h->root.type == bfd_link_hash_defweak
|
||||
|
@ -757,7 +759,7 @@ riscv_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
|
|||
struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
|
||||
bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
|
||||
|
||||
if (info->relocatable)
|
||||
if (bfd_link_relocatable (info))
|
||||
return TRUE;
|
||||
|
||||
elf_section_data (sec)->local_dynrel = NULL;
|
||||
|
@ -816,7 +818,7 @@ riscv_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
|
|||
case R_RISCV_BRANCH:
|
||||
case R_RISCV_CALL:
|
||||
case R_RISCV_JAL:
|
||||
if (info->shared)
|
||||
if (bfd_link_pic (info))
|
||||
break;
|
||||
/* Fall through. */
|
||||
|
||||
|
@ -908,7 +910,7 @@ riscv_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
only references to the symbol are via the global offset table.
|
||||
For such cases we need not do anything here; the relocations will
|
||||
be handled correctly by relocate_section. */
|
||||
if (info->shared)
|
||||
if (bfd_link_pic (info))
|
||||
return TRUE;
|
||||
|
||||
/* If there are no references to this symbol that do not use the
|
||||
|
@ -960,9 +962,9 @@ riscv_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
}
|
||||
|
||||
if (eh->tls_type & ~GOT_NORMAL)
|
||||
return _bfd_elf_adjust_dynamic_copy (h, htab->sdyntdata);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdyntdata);
|
||||
|
||||
return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss);
|
||||
return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdynbss);
|
||||
}
|
||||
|
||||
/* Allocate space in .plt, .got and associated reloc sections for
|
||||
|
@ -995,7 +997,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
|
||||
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
|
||||
{
|
||||
asection *s = htab->elf.splt;
|
||||
|
||||
|
@ -1018,7 +1020,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
|||
location in the .plt. This is required to make function
|
||||
pointers compare as equal between the normal executable and
|
||||
the shared library. */
|
||||
if (! info->shared
|
||||
if (! bfd_link_pic (info)
|
||||
&& !h->def_regular)
|
||||
{
|
||||
h->root.u.def.section = s;
|
||||
|
@ -1074,7 +1076,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
|||
else
|
||||
{
|
||||
s->size += RISCV_ELF_WORD_BYTES;
|
||||
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
|
||||
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
|
||||
htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
|
||||
}
|
||||
}
|
||||
|
@ -1091,7 +1093,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
|||
space for pc-relative relocs that have become local due to symbol
|
||||
visibility changes. */
|
||||
|
||||
if (info->shared)
|
||||
if (bfd_link_pic (info))
|
||||
{
|
||||
if (SYMBOL_CALLS_LOCAL (info, h))
|
||||
{
|
||||
|
@ -1209,7 +1211,7 @@ riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
|
|||
if (elf_hash_table (info)->dynamic_sections_created)
|
||||
{
|
||||
/* Set the contents of the .interp section to the interpreter. */
|
||||
if (info->executable)
|
||||
if (bfd_link_executable (info))
|
||||
{
|
||||
s = bfd_get_linker_section (dynobj, ".interp");
|
||||
BFD_ASSERT (s != NULL);
|
||||
|
@ -1220,7 +1222,7 @@ riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
|
|||
|
||||
/* Set up .got offsets for local syms, and space for local dynamic
|
||||
relocs. */
|
||||
for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
|
||||
for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
|
||||
{
|
||||
bfd_signed_vma *local_got;
|
||||
bfd_signed_vma *end_local_got;
|
||||
|
@ -1274,7 +1276,7 @@ riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
|
|||
s->size += RISCV_ELF_WORD_BYTES;
|
||||
if (*local_tls_type & GOT_TLS_GD)
|
||||
s->size += RISCV_ELF_WORD_BYTES;
|
||||
if (info->shared
|
||||
if (bfd_link_pic (info)
|
||||
|| (*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)))
|
||||
srel->size += sizeof (ElfNN_External_Rela);
|
||||
}
|
||||
|
@ -1374,7 +1376,7 @@ riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
|
|||
#define add_dynamic_entry(TAG, VAL) \
|
||||
_bfd_elf_add_dynamic_entry (info, TAG, VAL)
|
||||
|
||||
if (info->executable)
|
||||
if (bfd_link_executable (info))
|
||||
{
|
||||
if (!add_dynamic_entry (DT_DEBUG, 0))
|
||||
return FALSE;
|
||||
|
@ -1730,13 +1732,13 @@ riscv_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
}
|
||||
else
|
||||
{
|
||||
bfd_boolean warned;
|
||||
bfd_boolean warned, ignored;
|
||||
/* bfd_boolean ignored; */
|
||||
|
||||
RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
|
||||
r_symndx, symtab_hdr, sym_hashes,
|
||||
h, sec, relocation,
|
||||
unresolved_reloc, warned /*, ignored */);
|
||||
unresolved_reloc, warned, ignored);
|
||||
if (warned)
|
||||
{
|
||||
/* To avoid generating warning messages about truncated
|
||||
|
@ -1753,7 +1755,7 @@ riscv_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
|
||||
rel, 1, relend, howto, 0, contents);
|
||||
|
||||
if (info->relocatable)
|
||||
if (bfd_link_relocatable (info))
|
||||
continue;
|
||||
|
||||
if (h != NULL)
|
||||
|
@ -1790,8 +1792,8 @@ riscv_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
BFD_ASSERT (off != (bfd_vma) -1);
|
||||
dyn = elf_hash_table (info)->dynamic_sections_created;
|
||||
|
||||
if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
|
||||
|| (info->shared
|
||||
if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
|
||||
|| (bfd_link_pic (info)
|
||||
&& SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||
{
|
||||
/* This is actually a static link, or it is a
|
||||
|
@ -1832,7 +1834,7 @@ riscv_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
off &= ~1;
|
||||
else
|
||||
{
|
||||
if (info->shared)
|
||||
if (bfd_link_pic (info))
|
||||
{
|
||||
asection *s;
|
||||
Elf_Internal_Rela outrel;
|
||||
|
@ -1885,7 +1887,7 @@ riscv_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
case R_RISCV_CALL_PLT:
|
||||
case R_RISCV_CALL:
|
||||
case R_RISCV_JAL:
|
||||
if (info->shared && h != NULL && h->plt.offset != MINUS_ONE)
|
||||
if (bfd_link_pic (info) && h != NULL && h->plt.offset != MINUS_ONE)
|
||||
{
|
||||
/* Refer to the PLT entry. */
|
||||
relocation = sec_addr (htab->elf.splt) + h->plt.offset;
|
||||
|
@ -1955,13 +1957,13 @@ riscv_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
if ((input_section->flags & SEC_ALLOC) == 0)
|
||||
break;
|
||||
|
||||
if ((info->shared
|
||||
if ((bfd_link_pic (info)
|
||||
&& (h == NULL
|
||||
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||
|| h->root.type != bfd_link_hash_undefweak)
|
||||
&& (! howto->pc_relative
|
||||
|| !SYMBOL_CALLS_LOCAL (info, h)))
|
||||
|| (!info->shared
|
||||
|| (!bfd_link_pic (info)
|
||||
&& h != NULL
|
||||
&& h->dynindx != -1
|
||||
&& !h->non_got_ref
|
||||
|
@ -1987,7 +1989,7 @@ riscv_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
if (skip_dynamic_relocation)
|
||||
memset (&outrel, 0, sizeof outrel);
|
||||
else if (h != NULL && h->dynindx != -1
|
||||
&& !(info->shared
|
||||
&& !(bfd_link_pic (info)
|
||||
&& SYMBOLIC_BIND (info, h)
|
||||
&& h->def_regular))
|
||||
{
|
||||
|
@ -2046,8 +2048,8 @@ riscv_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
bfd_boolean dyn;
|
||||
dyn = htab->elf.dynamic_sections_created;
|
||||
|
||||
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
|
||||
&& (!info->shared
|
||||
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
|
||||
&& (!bfd_link_pic (info)
|
||||
|| !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||
{
|
||||
indx = h->dynindx;
|
||||
|
@ -2056,7 +2058,7 @@ riscv_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
|
||||
/* The GOT entries have not been initialized yet. Do it
|
||||
now, and emit any relocations. */
|
||||
if ((info->shared || indx != 0)
|
||||
if ((bfd_link_pic (info) || indx != 0)
|
||||
&& (h == NULL
|
||||
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||
|| h->root.type != bfd_link_hash_undefweak))
|
||||
|
@ -2295,7 +2297,7 @@ riscv_elf_finish_dynamic_symbol (bfd *output_bfd,
|
|||
the symbol was forced to be local because of a version file.
|
||||
The entry in the global offset table will already have been
|
||||
initialized in the relocate_section function. */
|
||||
if (info->shared
|
||||
if (bfd_link_pic (info)
|
||||
&& (info->symbolic || h->dynindx == -1)
|
||||
&& h->def_regular)
|
||||
{
|
||||
|
@ -2672,7 +2674,7 @@ _bfd_riscv_relax_call (bfd *abfd, asection *sec,
|
|||
int r_type;
|
||||
|
||||
/* See if this function call can be shortened. */
|
||||
if (!VALID_UJTYPE_IMM (foff) && !(!link_info->shared && near_zero))
|
||||
if (!VALID_UJTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero))
|
||||
return TRUE;
|
||||
|
||||
/* Shorten the function call. */
|
||||
|
@ -2799,7 +2801,7 @@ _bfd_riscv_relax_section (bfd *abfd, asection *sec,
|
|||
|
||||
*again = FALSE;
|
||||
|
||||
if (info->relocatable
|
||||
if (bfd_link_relocatable (info)
|
||||
|| (sec->flags & SEC_RELOC) == 0
|
||||
|| sec->reloc_count == 0
|
||||
|| (/*info->disable_target_specific_optimizations*/ 0
|
||||
|
@ -2916,7 +2918,7 @@ fail:
|
|||
#define ELF_MAXPAGESIZE 0x2000
|
||||
#define ELF_COMMONPAGESIZE 0x2000
|
||||
|
||||
#define TARGET_LITTLE_SYM bfd_elfNN_riscv_vec
|
||||
#define TARGET_LITTLE_SYM riscv_elfNN_vec
|
||||
#define TARGET_LITTLE_NAME "elfNN-littleriscv"
|
||||
|
||||
#define elf_backend_reloc_type_class riscv_reloc_type_class
|
||||
|
|
Loading…
Reference in New Issue