}
}
+/* Hide a linker-defined symbol, NAME, with hidden visibility. */
+
+static void
+elf_x86_hide_linker_defined (struct bfd_link_info *info,
+ const char *name)
+{
+ struct elf_link_hash_entry *h;
+
+ h = elf_link_hash_lookup (elf_hash_table (info), name,
+ FALSE, FALSE, FALSE);
+ if (h == NULL)
+ return;
+
+ while (h->root.type == bfd_link_hash_indirect)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+ if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
+ || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
+ _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
+}
+
bfd_boolean
_bfd_x86_elf_link_check_relocs (bfd *abfd, struct bfd_link_info *info)
{
elf_x86_linker_defined (info, "_end");
elf_x86_linker_defined (info, "_edata");
}
+ else
+ {
+ /* Hide hidden __bss_start, _end and _edata in shared
+ libraries. */
+ elf_x86_hide_linker_defined (info, "__bss_start");
+ elf_x86_hide_linker_defined (info, "_end");
+ elf_x86_hide_linker_defined (info, "_edata");
+ }
}
}
&& htab->interp == NULL)
|| info->dynamic_undefined_weak == 0))
|| ((h->def_regular || ELF_COMMON_DEF_P (h))
- && h->versioned == unversioned
&& info->version_info != NULL
- && bfd_hide_sym_by_version (info->version_info,
- h->root.root.string)))
+ && _bfd_elf_link_hide_sym_by_version (info, h)))
{
eh->local_ref = 2;
return TRUE;
}
- /* Symbols created by HIDDEN and PROVIDE_HIDDEN assignments in linker
- script aren't forced local here yet. */
- if (!h->root.ldscript_def)
- eh->local_ref = 1;
-
+ eh->local_ref = 1;
return FALSE;
}
{
number = aprop->u.number;
aprop->u.number = number | bprop->u.number;
- updated = number != (unsigned int) aprop->u.number;
+ /* Remove the property if ISA bits are empty. */
+ if (aprop->u.number == 0)
+ {
+ aprop->pr_kind = property_remove;
+ updated = TRUE;
+ }
+ else
+ updated = number != (unsigned int) aprop->u.number;
}
else
{
- /* Return TRUE if APROP is NULL to indicate that BPROP should
- be added to ABFD. */
- updated = aprop == NULL;
+ /* Only one of APROP and BPROP can be NULL. */
+ if (aprop != NULL)
+ {
+ if (aprop->u.number == 0)
+ {
+ /* Remove APROP if ISA bits are empty. */
+ aprop->pr_kind = property_remove;
+ updated = TRUE;
+ }
+ }
+ else
+ {
+ /* Return TRUE if APROP is NULL and ISA bits of BPROP
+ aren't empty to indicate that BPROP should be added
+ to ABFD. */
+ updated = bprop->u.number != 0;
+ }
}
break;