projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Set dynamic tag VMA and size from dynamic section when possible
[deliverable/binutils-gdb.git]
/
bfd
/
elfxx-sparc.c
diff --git
a/bfd/elfxx-sparc.c
b/bfd/elfxx-sparc.c
index 492af3603f0a9b726c58998d032e805c879e0f80..bde53df2fe2917da2415c009dc4d4993411d52f5 100644
(file)
--- a/
bfd/elfxx-sparc.c
+++ b/
bfd/elfxx-sparc.c
@@
-1,5
+1,5
@@
/* SPARC-specific support for ELF
/* SPARC-specific support for ELF
- Copyright (C) 2005-201
5
Free Software Foundation, Inc.
+ Copyright (C) 2005-201
6
Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
This file is part of BFD, the Binary File Descriptor library.
@@
-1208,14
+1208,14
@@
_bfd_sparc_elf_create_dynamic_sections (bfd *dynobj,
return FALSE;
htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
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");
if (htab->is_vxworks)
{
if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
return FALSE;
htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
if (htab->is_vxworks)
{
if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
return FALSE;
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
{
htab->plt_header_size
= 4 * ARRAY_SIZE (sparc_vxworks_shared_plt0_entry);
{
htab->plt_header_size
= 4 * ARRAY_SIZE (sparc_vxworks_shared_plt0_entry);
@@
-1232,7
+1232,7
@@
_bfd_sparc_elf_create_dynamic_sections (bfd *dynobj,
}
if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss
}
if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss
- || (!
info->shared
&& !htab->srelbss))
+ || (!
bfd_link_pic (info)
&& !htab->srelbss))
abort ();
return TRUE;
abort ();
return TRUE;
@@
-1330,7
+1330,7
@@
sparc_elf_tls_transition (struct bfd_link_info *info, bfd *abfd,
&& ! _bfd_sparc_elf_tdata (abfd)->has_tlsgd)
r_type = R_SPARC_REV32;
&& ! _bfd_sparc_elf_tdata (abfd)->has_tlsgd)
r_type = R_SPARC_REV32;
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
return r_type;
switch (r_type)
return r_type;
switch (r_type)
@@
-1377,7
+1377,7
@@
_bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
int num_relocs;
bfd_boolean checked_tlsgd = FALSE;
int num_relocs;
bfd_boolean checked_tlsgd = FALSE;
- if (
info->relocatable
)
+ if (
bfd_link_relocatable (info)
)
return TRUE;
htab = _bfd_sparc_elf_hash_table (info);
return TRUE;
htab = _bfd_sparc_elf_hash_table (info);
@@
-1501,13
+1501,13
@@
_bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_SPARC_TLS_LE_HIX22:
case R_SPARC_TLS_LE_LOX10:
case R_SPARC_TLS_LE_HIX22:
case R_SPARC_TLS_LE_LOX10:
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
goto r_sparc_plt32;
break;
case R_SPARC_TLS_IE_HI22:
case R_SPARC_TLS_IE_LO10:
goto r_sparc_plt32;
break;
case R_SPARC_TLS_IE_HI22:
case R_SPARC_TLS_IE_LO10:
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
info->flags |= DF_STATIC_TLS;
/* Fall through */
info->flags |= DF_STATIC_TLS;
/* Fall through */
@@
-1617,7
+1617,7
@@
_bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_SPARC_TLS_GD_CALL:
case R_SPARC_TLS_LDM_CALL:
case R_SPARC_TLS_GD_CALL:
case R_SPARC_TLS_LDM_CALL:
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
{
/* These are basically R_SPARC_TLS_WPLT30 relocs against
__tls_get_addr. */
{
/* These are basically R_SPARC_TLS_WPLT30 relocs against
__tls_get_addr. */
@@
-1735,7
+1735,7
@@
_bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
h->non_got_ref = 1;
r_sparc_plt32:
h->non_got_ref = 1;
r_sparc_plt32:
- 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. */
{
/* We may need a .plt entry if the function this reloc
refers to is in a shared lib. */
@@
-1763,19
+1763,19
@@
_bfd_sparc_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. */
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
&& (! _bfd_sparc_elf_howto_table[r_type].pc_relative
|| (h != NULL
&& (! SYMBOLIC_BIND (info, h)
|| h->root.type == bfd_link_hash_defweak
|| !h->def_regular))))
&& (sec->flags & SEC_ALLOC) != 0
&& (! _bfd_sparc_elf_howto_table[r_type].pc_relative
|| (h != NULL
&& (! SYMBOLIC_BIND (info, h)
|| 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
|| !h->def_regular))
&& (sec->flags & SEC_ALLOC) != 0
&& h != NULL
&& (h->root.type == bfd_link_hash_defweak
|| !h->def_regular))
- || (!
info->shared
+ || (!
bfd_link_pic (info)
&& h != NULL
&& h->type == STT_GNU_IFUNC))
{
&& h != NULL
&& h->type == STT_GNU_IFUNC))
{
@@
-1878,8
+1878,8
@@
_bfd_sparc_elf_gc_mark_hook (asection *sec,
}
/* FIXME: The test here, in check_relocs and in relocate_section
}
/* FIXME: The test here, in check_relocs and in relocate_section
- dealing with TLS optimization, ought to be !
info->executable
. */
- if (
info->shared
)
+ dealing with TLS optimization, ought to be !
bfd_link_executable (info)
. */
+ if (
bfd_link_pic (info)
)
{
switch (SPARC_ELF_R_TYPE (rel->r_info))
{
{
switch (SPARC_ELF_R_TYPE (rel->r_info))
{
@@
-1928,7
+1928,7
@@
_bfd_sparc_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
bfd_signed_vma *local_got_refcounts;
const Elf_Internal_Rela *rel, *relend;
bfd_signed_vma *local_got_refcounts;
const Elf_Internal_Rela *rel, *relend;
- if (
info->relocatable
)
+ if (
bfd_link_relocatable (info)
)
return TRUE;
BFD_ASSERT (is_sparc_elf (abfd) || sec->reloc_count == 0);
return TRUE;
BFD_ASSERT (is_sparc_elf (abfd) || sec->reloc_count == 0);
@@
-2057,7
+2057,7
@@
_bfd_sparc_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
case R_SPARC_L44:
case R_SPARC_H34:
case R_SPARC_UA64:
case R_SPARC_L44:
case R_SPARC_H34:
case R_SPARC_UA64:
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
break;
/* Fall through. */
break;
/* Fall through. */
@@
-2158,7
+2158,7
@@
_bfd_sparc_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. */
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
return TRUE;
/* If there are no references to this symbol that do not use the
@@
-2247,7
+2247,7
@@
allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
return FALSE;
}
return FALSE;
}
- if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1,
info->shared
, h)
+ if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1,
bfd_link_pic (info)
, h)
|| (h->type == STT_GNU_IFUNC
&& h->def_regular))
{
|| (h->type == STT_GNU_IFUNC
&& h->def_regular))
{
@@
-2262,7
+2262,7
@@
allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
s->size = htab->plt_header_size;
/* Allocate space for the .rela.plt.unloaded relocations. */
s->size = htab->plt_header_size;
/* Allocate space for the .rela.plt.unloaded relocations. */
- if (htab->is_vxworks && !
info->shared
)
+ if (htab->is_vxworks && !
bfd_link_pic (info)
)
htab->srelplt2->size = sizeof (Elf32_External_Rela) * 2;
}
htab->srelplt2->size = sizeof (Elf32_External_Rela) * 2;
}
@@
-2293,7
+2293,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. */
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;
&& !h->def_regular)
{
h->root.u.def.section = s;
@@
-2315,7
+2315,7
@@
allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
htab->elf.sgotplt->size += 4;
/* ...and for the .rela.plt.unloaded relocations. */
htab->elf.sgotplt->size += 4;
/* ...and for the .rela.plt.unloaded relocations. */
- if (!
info->shared
)
+ if (!
bfd_link_pic (info)
)
htab->srelplt2->size += sizeof (Elf32_External_Rela) * 3;
}
}
htab->srelplt2->size += sizeof (Elf32_External_Rela) * 3;
}
}
@@
-2334,7
+2334,7
@@
allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
/* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary,
make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry. */
if (h->got.refcount > 0
/* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary,
make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry. */
if (h->got.refcount > 0
- && !
info->shared
+ && !
bfd_link_pic (info)
&& h->dynindx == -1
&& _bfd_sparc_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
h->got.offset = (bfd_vma) -1;
&& h->dynindx == -1
&& _bfd_sparc_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
h->got.offset = (bfd_vma) -1;
@@
-2369,7
+2369,9
@@
allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
else if (tls_type == GOT_TLS_GD)
htab->elf.srelgot->size += 2 * SPARC_ELF_RELA_BYTES (htab);
htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
else if (tls_type == GOT_TLS_GD)
htab->elf.srelgot->size += 2 * SPARC_ELF_RELA_BYTES (htab);
- else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
+ else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
+ bfd_link_pic (info),
+ h))
htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
}
else
htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
}
else
@@
-2385,7
+2387,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. */
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))
{
{
if (SYMBOL_CALLS_LOCAL (info, h))
{
@@
-2557,7
+2559,7
@@
_bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
if (elf_hash_table (info)->dynamic_sections_created)
{
/* Set the contents of the .interp section to the interpreter. */
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) && !info->nointerp
)
{
s = bfd_get_linker_section (dynobj, ".interp");
BFD_ASSERT (s != NULL);
{
s = bfd_get_linker_section (dynobj, ".interp");
BFD_ASSERT (s != NULL);
@@
-2631,7
+2633,7
@@
_bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
s->size += SPARC_ELF_WORD_BYTES (htab);
if (*local_tls_type == GOT_TLS_GD)
s->size += SPARC_ELF_WORD_BYTES (htab);
s->size += SPARC_ELF_WORD_BYTES (htab);
if (*local_tls_type == GOT_TLS_GD)
s->size += SPARC_ELF_WORD_BYTES (htab);
- if (
info->shared
+ if (
bfd_link_pic (info)
|| *local_tls_type == GOT_TLS_GD
|| *local_tls_type == GOT_TLS_IE)
srel->size += SPARC_ELF_RELA_BYTES (htab);
|| *local_tls_type == GOT_TLS_GD
|| *local_tls_type == GOT_TLS_IE)
srel->size += SPARC_ELF_RELA_BYTES (htab);
@@
-2745,7
+2747,7
@@
_bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
#define add_dynamic_entry(TAG, VAL) \
_bfd_elf_add_dynamic_entry (info, TAG, VAL)
#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;
{
if (!add_dynamic_entry (DT_DEBUG, 0))
return FALSE;
@@
-2864,7
+2866,7
@@
_bfd_sparc_elf_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
bfd_boolean *again)
{
struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
bfd_boolean *again)
{
- if (
link_info->relocatable
)
+ if (
bfd_link_relocatable (link_info)
)
(*link_info->callbacks->einfo)
(_("%P%F: --relax and -r may not be used together\n"));
(*link_info->callbacks->einfo)
(_("%P%F: --relax and -r may not be used together\n"));
@@
-2957,7
+2959,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
sreloc = elf_section_data (input_section)->sreloc;
/* We have to handle relocations in vxworks .tls_vars sections
specially, because the dynamic loader is 'weird'. */
sreloc = elf_section_data (input_section)->sreloc;
/* We have to handle relocations in vxworks .tls_vars sections
specially, because the dynamic loader is 'weird'. */
- is_vxworks_tls = (htab->is_vxworks &&
info->shared
+ is_vxworks_tls = (htab->is_vxworks &&
bfd_link_pic (info)
&& !strcmp (input_section->output_section->name,
".tls_vars"));
&& !strcmp (input_section->output_section->name,
".tls_vars"));
@@
-3003,7
+3005,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
sec = local_sections[r_symndx];
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
sec = local_sections[r_symndx];
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
- if (!
info->relocatable
+ if (!
bfd_link_relocatable (info)
&& ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
{
/* Relocate against local STT_GNU_IFUNC symbol. */
&& ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
{
/* Relocate against local STT_GNU_IFUNC symbol. */
@@
-3041,7
+3043,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
rel, 1, relend, howto, 0, contents);
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
continue;
if (h != NULL
@@
-3091,7
+3093,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
case R_SPARC_32:
case R_SPARC_64:
case R_SPARC_32:
case R_SPARC_64:
- if (
info->shared
&& h->non_got_ref)
+ if (
bfd_link_pic (info)
&& h->non_got_ref)
{
Elf_Internal_Rela outrel;
bfd_vma offset;
{
Elf_Internal_Rela outrel;
bfd_vma offset;
@@
-3109,7
+3111,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
if (h->dynindx == -1
|| h->forced_local
if (h->dynindx == -1
|| h->forced_local
- ||
info->executable
)
+ ||
bfd_link_executable (info)
)
{
outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
0, R_SPARC_IRELATIVE);
{
outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
0, R_SPARC_IRELATIVE);
@@
-3134,7
+3136,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
case R_SPARC_HI22:
case R_SPARC_LO10:
/* We should only see such relocs in static links. */
case R_SPARC_HI22:
case R_SPARC_LO10:
/* We should only see such relocs in static links. */
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
abort();
relocation = (plt_sec->output_section->vma
+ plt_sec->output_offset + h->plt.offset);
abort();
relocation = (plt_sec->output_section->vma
+ plt_sec->output_offset + h->plt.offset);
@@
-3206,8
+3208,10
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
BFD_ASSERT (off != (bfd_vma) -1);
dyn = elf_hash_table (info)->dynamic_sections_created;
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
&& SYMBOL_REFERENCES_LOCAL (info, h)))
{
/* This is actually a static link, or it is a
@@
-3249,7
+3253,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
else
{
else
{
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
{
asection *s;
Elf_Internal_Rela outrel;
{
asection *s;
Elf_Internal_Rela outrel;
@@
-3382,13
+3386,13
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
|| is_vxworks_tls)
break;
|| is_vxworks_tls)
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)))
&& (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
&& h != NULL
&& h->dynindx != -1
&& !h->non_got_ref
@@
-3464,10
+3468,10
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
memset (&outrel, 0, sizeof outrel);
/* h->dynindx may be -1 if the symbol was marked to
become local. */
memset (&outrel, 0, sizeof outrel);
/* h->dynindx may be -1 if the symbol was marked to
become local. */
- else if (h != NULL
&&
- h->dynindx != -1
- && (
! is_plt
- || !
info->shared
+ else if (h != NULL
+
&&
h->dynindx != -1
+ && (
_bfd_sparc_elf_howto_table[r_type].pc_relative
+ || !
bfd_link_pic (info)
|| !SYMBOLIC_BIND (info, h)
|| !h->def_regular))
{
|| !SYMBOLIC_BIND (info, h)
|| !h->def_regular))
{
@@
-3565,7
+3569,9
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
else if (h != NULL)
{
tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
else if (h != NULL)
{
tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
- if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
+ if (!bfd_link_pic (info)
+ && h->dynindx == -1
+ && tls_type == GOT_TLS_IE)
switch (SPARC_ELF_R_TYPE (rel->r_info))
{
case R_SPARC_TLS_GD_HI22:
switch (SPARC_ELF_R_TYPE (rel->r_info))
{
case R_SPARC_TLS_GD_HI22:
@@
-3687,7
+3693,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
case R_SPARC_TLS_LDM_HI22:
case R_SPARC_TLS_LDM_LO10:
case R_SPARC_TLS_LDM_HI22:
case R_SPARC_TLS_LDM_LO10:
- if (!
info->shared
)
+ if (!
bfd_link_pic (info)
)
{
bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
continue;
{
bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
continue;
@@
-3698,7
+3704,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
case R_SPARC_TLS_LDO_HIX22:
case R_SPARC_TLS_LDO_LOX10:
case R_SPARC_TLS_LDO_HIX22:
case R_SPARC_TLS_LDO_LOX10:
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
{
relocation -= dtpoff_base (info);
break;
{
relocation -= dtpoff_base (info);
break;
@@
-3710,7
+3716,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
case R_SPARC_TLS_LE_HIX22:
case R_SPARC_TLS_LE_LOX10:
case R_SPARC_TLS_LE_HIX22:
case R_SPARC_TLS_LE_LOX10:
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
{
Elf_Internal_Rela outrel;
bfd_boolean skip;
{
Elf_Internal_Rela outrel;
bfd_boolean skip;
@@
-3742,7
+3748,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
break;
case R_SPARC_TLS_LDM_CALL:
break;
case R_SPARC_TLS_LDM_CALL:
- if (!
info->shared
)
+ if (!
bfd_link_pic (info)
)
{
/* mov %g0, %o0 */
bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
{
/* mov %g0, %o0 */
bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
@@
-3756,13
+3762,13
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
else if (h != NULL)
tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
else if (h != NULL)
tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
- if (!
info->shared
+ if (!
bfd_link_pic (info)
|| (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
{
Elf_Internal_Rela *rel2;
bfd_vma insn;
|| (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
{
Elf_Internal_Rela *rel2;
bfd_vma insn;
- if (!
info->shared
&& (h == NULL || h->dynindx == -1))
+ if (!
bfd_link_pic (info)
&& (h == NULL || h->dynindx == -1))
{
/* GD -> LE */
bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
{
/* GD -> LE */
bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
@@
-3832,7
+3838,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
else if (h != NULL)
tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
else if (h != NULL)
tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
- if (!
info->shared
|| tls_type == GOT_TLS_IE)
+ if (!
bfd_link_pic (info)
|| tls_type == GOT_TLS_IE)
{
/* add %reg1, %reg2, %reg3, %tgd_add(foo)
changed into IE:
{
/* add %reg1, %reg2, %reg3, %tgd_add(foo)
changed into IE:
@@
-3840,7
+3846,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
or LE:
add %g7, %reg2, %reg3. */
bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
or LE:
add %g7, %reg2, %reg3. */
bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
- if ((h != NULL && h->dynindx != -1) ||
info->shared
)
+ if ((h != NULL && h->dynindx != -1) ||
bfd_link_pic (info)
)
relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000);
else
relocation = (insn & ~0x7c000) | 0x1c000;
relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000);
else
relocation = (insn & ~0x7c000) | 0x1c000;
@@
-3849,12
+3855,12
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
continue;
case R_SPARC_TLS_LDM_ADD:
continue;
case R_SPARC_TLS_LDM_ADD:
- if (!
info->shared
)
+ if (!
bfd_link_pic (info)
)
bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
continue;
case R_SPARC_TLS_LDO_ADD:
bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
continue;
case R_SPARC_TLS_LDO_ADD:
- if (!
info->shared
)
+ if (!
bfd_link_pic (info)
)
{
/* Change rs1 into %g7. */
bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
{
/* Change rs1 into %g7. */
bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
@@
-3865,7
+3871,7
@@
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
case R_SPARC_TLS_IE_LD:
case R_SPARC_TLS_IE_LDX:
case R_SPARC_TLS_IE_LD:
case R_SPARC_TLS_IE_LDX:
- if (!
info->shared
&& (h == NULL || h->dynindx == -1))
+ if (!
bfd_link_pic (info)
&& (h == NULL || h->dynindx == -1))
{
bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
int rs2 = insn & 0x1f;
{
bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
int rs2 = insn & 0x1f;
@@
-4226,7
+4232,7
@@
sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
htab = _bfd_sparc_elf_hash_table (info);
BFD_ASSERT (htab != NULL);
htab = _bfd_sparc_elf_hash_table (info);
BFD_ASSERT (htab != NULL);
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
{
plt_entry = sparc_vxworks_shared_plt_entry;
got_base = 0;
{
plt_entry = sparc_vxworks_shared_plt_entry;
got_base = 0;
@@
-4270,7
+4276,7
@@
sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
htab->elf.sgotplt->contents + got_offset);
/* Add relocations to .rela.plt.unloaded. */
htab->elf.sgotplt->contents + got_offset);
/* Add relocations to .rela.plt.unloaded. */
- if (!
info->shared
)
+ if (!
bfd_link_pic (info)
)
{
loc = (htab->srelplt2->contents
+ (2 + 3 * plt_index) * sizeof (Elf32_External_Rela));
{
loc = (htab->srelplt2->contents
+ (2 + 3 * plt_index) * sizeof (Elf32_External_Rela));
@@
-4376,7
+4382,7
@@
_bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
if (h == NULL
|| h->dynindx == -1
if (h == NULL
|| h->dynindx == -1
- || ((
info->executable
+ || ((
bfd_link_executable (info)
|| ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
&& h->def_regular
&& h->type == STT_GNU_IFUNC))
|| ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
&& h->def_regular
&& h->type == STT_GNU_IFUNC))
@@
-4476,7
+4482,7
@@
_bfd_sparc_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. */
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)
&& h->type == STT_GNU_IFUNC
&& h->def_regular)
{
&& h->type == STT_GNU_IFUNC
&& h->def_regular)
{
@@
-4491,7
+4497,7
@@
_bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
+ (h->got.offset & ~(bfd_vma) 1));
return TRUE;
}
+ (h->got.offset & ~(bfd_vma) 1));
return TRUE;
}
- else if (
info->shared
+ else if (
bfd_link_pic (info)
&& SYMBOL_REFERENCES_LOCAL (info, h))
{
asection *sec = h->root.u.def.section;
&& SYMBOL_REFERENCES_LOCAL (info, h))
{
asection *sec = h->root.u.def.section;
@@
-4624,13
+4630,13
@@
sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
{
asection *s;
{
asection *s;
- s = bfd_get_
section_by_name (output_bfd
, name);
+ s = bfd_get_
linker_section (dynobj
, name);
if (s == NULL)
dyn.d_un.d_val = 0;
else
{
if (! size)
if (s == NULL)
dyn.d_un.d_val = 0;
else
{
if (! size)
- dyn.d_un.d_ptr = s->
vma
;
+ dyn.d_un.d_ptr = s->
output_section->vma + s->output_offset
;
else
dyn.d_un.d_val = s->size;
}
else
dyn.d_un.d_val = s->size;
}
@@
-4779,7
+4785,7
@@
_bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *i
{
if (htab->is_vxworks)
{
{
if (htab->is_vxworks)
{
- if (
info->shared
)
+ if (
bfd_link_pic (info)
)
sparc_vxworks_finish_shared_plt (output_bfd, info);
else
sparc_vxworks_finish_exec_plt (output_bfd, info);
sparc_vxworks_finish_shared_plt (output_bfd, info);
else
sparc_vxworks_finish_exec_plt (output_bfd, info);
This page took
0.043062 seconds
and
4
git commands to generate.