aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorStefan Kristiansson <stefan.kristiansson@saunalahti.fi>2014-08-13 23:17:50 +0300
committerStefan Kristiansson <stefan.kristiansson@saunalahti.fi>2014-08-13 23:32:51 +0300
commitffccb7afb54cf09db1013f941e8dfc5127b01876 (patch)
tree6fee293bf8c41451f796bdbbbba4591a88f79210 /bfd
parent703ec4e8d0c1daac6033e14170c0ddd28c455c0a (diff)
downloadgdb-ffccb7afb54cf09db1013f941e8dfc5127b01876.zip
gdb-ffccb7afb54cf09db1013f941e8dfc5127b01876.tar.gz
gdb-ffccb7afb54cf09db1013f941e8dfc5127b01876.tar.bz2
bfd: or1k: avoid emitting R_OR1K_INSN_REL_26 in shared libs
This fixes a bug where R_OR1K_INSN_REL_26 relocations would be emitted into shared libraries even when the referenced symbol was hidden or the symbol was contained in the same .so which had been linked with -Bsymbolic. bfd/ * elf32-or1k.c (or1k_elf_relocate_section, or1k_elf_check_relocs, allocate_dynrelocs): Use SYMBOL_REFERENCES_LOCAL, SYMBOL_CALLS_LOCAL and SYMBOLIC_BIND.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf32-or1k.c24
2 files changed, 12 insertions, 18 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 8fda279..5fb7b43 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2014-08-13 Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
+
+ * elf32-or1k.c (or1k_elf_relocate_section, or1k_elf_check_relocs,
+ allocate_dynrelocs): Use SYMBOL_REFERENCES_LOCAL, SYMBOL_CALLS_LOCAL
+ and SYMBOLIC_BIND.
+
2014-08-12 Alan Modra <amodra@gmail.com>
* coff-aux.c (coff_m68k_aux_link_add_one_symbol): Only call "notice"
diff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c
index 2353d0d..5cf29e1 100644
--- a/bfd/elf32-or1k.c
+++ b/bfd/elf32-or1k.c
@@ -907,10 +907,7 @@ or1k_elf_relocate_section (bfd *output_bfd,
dyn = htab->root.dynamic_sections_created;
if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
|| (info->shared
- && (info->symbolic
- || h->dynindx == -1
- || h->forced_local)
- && h->def_regular))
+ && SYMBOL_REFERENCES_LOCAL (info, h)))
{
/* This is actually a static link, or it is a
-Bsymbolic link and the symbol is defined
@@ -1015,11 +1012,8 @@ or1k_elf_relocate_section (bfd *output_bfd,
&& (h == NULL
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|| h->root.type != bfd_link_hash_undefweak)
- && (!howto->pc_relative
- || (h != NULL
- && h->dynindx != -1
- && (!info->symbolic
- || !h->def_regular))))
+ && (howto->type != R_OR1K_INSN_REL_26
+ || !SYMBOL_CALLS_LOCAL (info, h)))
|| (!info->shared
&& h != NULL
&& h->dynindx != -1
@@ -1613,7 +1607,7 @@ or1k_elf_check_relocs (bfd *abfd,
&& (sec->flags & SEC_ALLOC) != 0
&& (ELF32_R_TYPE (rel->r_info) != R_OR1K_INSN_REL_26
|| (h != NULL
- && (! info->symbolic
+ && (!SYMBOLIC_BIND (info, h)
|| h->root.type == bfd_link_hash_defweak
|| !h->def_regular))))
|| (!info->shared
@@ -1991,11 +1985,7 @@ or1k_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
- && (info->symbolic
- || h->dynindx == -1
- || h->forced_local)
- && h->def_regular)
+ if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
{
rela.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
rela.r_addend = (h->root.u.def.value
@@ -2327,9 +2317,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
if (info->shared)
{
- if (h->def_regular
- && (h->forced_local
- || info->symbolic))
+ if (SYMBOL_CALLS_LOCAL (info, h))
{
struct elf_or1k_dyn_relocs **pp;