2000-05-03 Martin v. Löwis <loewis@informatik.hu-berlin.de>

* elflink.h (elf_link_add_object_symbols): Reset dynindx for
	hidden and internal symbols.
	(elf_fix_symbol_flags): Clear NEEDS_PLT for symbols with
	visibility.
	* elflink.c (_bfd_elf_link_record_dynamic_symbol): Do not
	assign a PLT or GOT entry to symbols with hidden and
	internal visibility.
This commit is contained in:
H.J. Lu 2000-05-04 06:38:33 +00:00
parent fb166ee3a7
commit 0444bdd49c
3 changed files with 33 additions and 5 deletions

View File

@ -1,3 +1,13 @@
2000-05-03 Martin v. Löwis <loewis@informatik.hu-berlin.de>
* elflink.h (elf_link_add_object_symbols): Reset dynindx for
hidden and internal symbols.
(elf_fix_symbol_flags): Clear NEEDS_PLT for symbols with
visibility.
* elflink.c (_bfd_elf_link_record_dynamic_symbol): Do not
assign a PLT or GOT entry to symbols with hidden and
internal visibility.
2000-05-03 Mark Elbrecht <snowball3@bigfoot.com> 2000-05-03 Mark Elbrecht <snowball3@bigfoot.com>
* bfd/coff-go32.c (COFF_SECTION_ALIGNMENT_ENTRIES): Add entry for * bfd/coff-go32.c (COFF_SECTION_ALIGNMENT_ENTRIES): Add entry for

View File

@ -238,8 +238,8 @@ _bfd_elf_link_record_dynamic_symbol (info, h)
} }
h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL; h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
break; return true;
default: default:
break; break;
} }

View File

@ -891,6 +891,7 @@ elf_link_add_object_symbols (abfd, info)
Elf_External_Sym *esym; Elf_External_Sym *esym;
Elf_External_Sym *esymend; Elf_External_Sym *esymend;
struct elf_backend_data *bed; struct elf_backend_data *bed;
boolean visibility_changed = false;
bed = get_elf_backend_data (abfd); bed = get_elf_backend_data (abfd);
add_symbol_hook = bed->elf_add_symbol_hook; add_symbol_hook = bed->elf_add_symbol_hook;
@ -1581,7 +1582,10 @@ elf_link_add_object_symbols (abfd, info)
unsigned char symvis = ELF_ST_VISIBILITY (sym.st_other); unsigned char symvis = ELF_ST_VISIBILITY (sym.st_other);
if (symvis && (hvis > symvis || hvis == 0)) if (symvis && (hvis > symvis || hvis == 0))
h->other = sym.st_other; {
visibility_changed = true;
h->other = sym.st_other;
}
/* If neither has visibility, use the st_other of the /* If neither has visibility, use the st_other of the
definition. This is an arbitrary choice, since the definition. This is an arbitrary choice, since the
@ -1852,6 +1856,18 @@ elf_link_add_object_symbols (abfd, info)
goto error_return; goto error_return;
} }
} }
else if (dynsym && h->dynindx != -1 && visibility_changed)
/* If the symbol already has a dynamic index, but
visibility says it should not be visible, turn it into
a local symbol. */
switch (ELF_ST_VISIBILITY (h->other))
{
case STV_INTERNAL:
case STV_HIDDEN:
h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
(*bed->elf_backend_hide_symbol) (h);
break;
}
} }
} }
@ -3339,10 +3355,12 @@ elf_fix_symbol_flags (h, eif)
/* If -Bsymbolic was used (which means to bind references to global /* If -Bsymbolic was used (which means to bind references to global
symbols to the definition within the shared object), and this symbols to the definition within the shared object), and this
symbol was defined in a regular object, then it actually doesn't symbol was defined in a regular object, then it actually doesn't
need a PLT entry. */ need a PLT entry. Likewise, if the symbol has any kind of
visibility (internal, hidden, or protected), it doesn't need a
PLT. */
if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0
&& eif->info->shared && eif->info->shared
&& eif->info->symbolic && (eif->info->symbolic || ELF_ST_VISIBILITY (h->other))
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0) && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0)
{ {
h->elf_link_hash_flags &=~ ELF_LINK_HASH_NEEDS_PLT; h->elf_link_hash_flags &=~ ELF_LINK_HASH_NEEDS_PLT;