aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf-bfd.h3
-rw-r--r--bfd/elflink.c12
3 files changed, 17 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 7dea00e..cc8f96f 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2015-03-27 Alan Modra <amodra@gmail.com>
+
+ PR ld/15228
+ PR ld/18167
+ * elflink.c (elf_merge_st_other): Add "sec" parameter. Don't set
+ protected_def when symbol section is read-only. Adjust all calls.
+ * elf-bfd.h (struct elf_link_hash_entry): Update protected_def comment.
+
2015-03-26 Tejas Belagod <tejas.belagod@arm.com>
* elfnn-aarch64.c (aarch64_build_one_stub): Replace the call to generic
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 13c32e0..53ef9d8 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -200,7 +200,8 @@ struct elf_link_hash_entry
unsigned int pointer_equality_needed : 1;
/* Symbol is a unique global symbol. */
unsigned int unique_global : 1;
- /* Symbol is defined with non-default visibility. */
+ /* Symbol is defined by a shared library with non-default visibility
+ in a read/write section. */
unsigned int protected_def : 1;
/* String table index in .dynstr if this is a dynamic symbol. */
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 748ff1b..022a535 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -844,7 +844,7 @@ _bfd_elf_link_renumber_dynsyms (bfd *output_bfd,
static void
elf_merge_st_other (bfd *abfd, struct elf_link_hash_entry *h,
- const Elf_Internal_Sym *isym,
+ const Elf_Internal_Sym *isym, asection *sec,
bfd_boolean definition, bfd_boolean dynamic)
{
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
@@ -865,7 +865,9 @@ elf_merge_st_other (bfd *abfd, struct elf_link_hash_entry *h,
if (symvis - 1 < hvis - 1)
h->other = symvis | (h->other & ~ELF_ST_VISIBILITY (-1));
}
- else if (definition && ELF_ST_VISIBILITY (isym->st_other) != STV_DEFAULT)
+ else if (definition
+ && ELF_ST_VISIBILITY (isym->st_other) != STV_DEFAULT
+ && (sec->flags & SEC_READONLY) == 0)
h->protected_def = 1;
}
@@ -1417,7 +1419,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
/* Merge st_other. If the symbol already has a dynamic index,
but visibility says it should not be visible, turn it into a
local symbol. */
- elf_merge_st_other (abfd, h, sym, newdef, newdyn);
+ elf_merge_st_other (abfd, h, sym, sec, newdef, newdyn);
if (h->dynindx != -1)
switch (ELF_ST_VISIBILITY (h->other))
{
@@ -4358,7 +4360,7 @@ error_free_dyn:
}
/* Merge st_other field. */
- elf_merge_st_other (abfd, h, isym, definition, dynamic);
+ elf_merge_st_other (abfd, h, isym, sec, definition, dynamic);
/* We don't want to make debug symbol dynamic. */
if (definition && (sec->flags & SEC_DEBUGGING) && !info->relocatable)
@@ -13268,7 +13270,7 @@ _bfd_elf_copy_link_hash_symbol_type (bfd *abfd,
ehdest->target_internal = ehsrc->target_internal;
isym.st_other = ehsrc->other;
- elf_merge_st_other (abfd, ehdest, &isym, TRUE, FALSE);
+ elf_merge_st_other (abfd, ehdest, &isym, NULL, TRUE, FALSE);
}
/* Append a RELA relocation REL to section S in BFD. */