* elf-bfd.h (struct elf_link_hash_table): Add copy_indirect and
hide_symbol members. (elf_link_hash_copy_indirect): New. (elf_link_hash_hide_symbol): New. * elflink.h (elf_link_add_object_symbols): Break out copy from indirect new new symbol to elf.c. (elf_link_assign_sym_version): Break out privatization of non-exported symbol to elf.c. * elf.c (_bfd_elf_link_hash_copy_indirect): New. (_bfd_elf_link_hash_hide_symbol): New. (_bfd_elf_link_hash_table_init): Init copy_indirect and hide_symbol.
This commit is contained in:
parent
7f8d5fc90b
commit
2920b85c63
4 changed files with 94 additions and 87 deletions
|
@ -1,3 +1,17 @@
|
|||
2000-02-13 Richard Henderson <rth@cygnus.com>
|
||||
|
||||
* elf-bfd.h (struct elf_link_hash_table): Add copy_indirect and
|
||||
hide_symbol members.
|
||||
(elf_link_hash_copy_indirect): New.
|
||||
(elf_link_hash_hide_symbol): New.
|
||||
* elflink.h (elf_link_add_object_symbols): Break out copy from
|
||||
indirect new new symbol to elf.c.
|
||||
(elf_link_assign_sym_version): Break out privatization of
|
||||
non-exported symbol to elf.c.
|
||||
* elf.c (_bfd_elf_link_hash_copy_indirect): New.
|
||||
(_bfd_elf_link_hash_hide_symbol): New.
|
||||
(_bfd_elf_link_hash_table_init): Init copy_indirect and hide_symbol.
|
||||
|
||||
2000-02-13 Ian Lance Taylor <ian@zembu.com>
|
||||
|
||||
* section.c (_bfd_strip_section_from_output): Add info parameter.
|
||||
|
|
|
@ -243,6 +243,12 @@ struct elf_link_hash_table
|
|||
PTR stab_info;
|
||||
/* A linked list of local symbols to be added to .dynsym. */
|
||||
struct elf_link_local_dynamic_entry *dynlocal;
|
||||
|
||||
void (*copy_indirect) PARAMS ((struct elf_link_hash_table *,
|
||||
struct elf_link_hash_entry *,
|
||||
struct elf_link_hash_entry *));
|
||||
void (*hide_symbol) PARAMS ((struct elf_link_hash_table *,
|
||||
struct elf_link_hash_entry *));
|
||||
};
|
||||
|
||||
/* Look up an entry in an ELF linker hash table. */
|
||||
|
@ -263,6 +269,16 @@ struct elf_link_hash_table
|
|||
/* Get the ELF linker hash table from a link_info structure. */
|
||||
|
||||
#define elf_hash_table(p) ((struct elf_link_hash_table *) ((p)->hash))
|
||||
|
||||
/* Call the copy_indirect method. */
|
||||
|
||||
#define elf_link_hash_copy_indirect(TABLE,DIR,IND) \
|
||||
((*(TABLE)->copy_indirect) ((TABLE), (DIR), (IND)))
|
||||
|
||||
/* Call the hide_symbol method. */
|
||||
|
||||
#define elf_link_hash_hide_symbol(TABLE,SYM) \
|
||||
((*(TABLE)->hide_symbol) ((TABLE), (SYM)))
|
||||
|
||||
/* Constant information held for an ELF backend. */
|
||||
|
||||
|
|
56
bfd/elf.c
56
bfd/elf.c
|
@ -906,6 +906,60 @@ _bfd_elf_link_hash_newfunc (entry, table, string)
|
|||
return (struct bfd_hash_entry *) ret;
|
||||
}
|
||||
|
||||
/* Copy data from an indirect symbol to its direct symbol, hiding the
|
||||
old indirect symbol. */
|
||||
|
||||
static void
|
||||
_bfd_elf_link_hash_copy_indirect (table, dir, ind)
|
||||
struct elf_link_hash_table *table;
|
||||
struct elf_link_hash_entry *dir, *ind;
|
||||
{
|
||||
/* Copy down any references that we may have already seen to the
|
||||
symbol which just became indirect. */
|
||||
|
||||
dir->elf_link_hash_flags |=
|
||||
(ind->elf_link_hash_flags
|
||||
& (ELF_LINK_HASH_REF_DYNAMIC
|
||||
| ELF_LINK_HASH_REF_REGULAR
|
||||
| ELF_LINK_HASH_REF_REGULAR_NONWEAK
|
||||
| ELF_LINK_NON_GOT_REF));
|
||||
|
||||
/* Copy over the global and procedure linkage table offset entries.
|
||||
These may have been already set up by a check_relocs routine. */
|
||||
if (dir->got.offset == (bfd_vma) -1)
|
||||
{
|
||||
dir->got.offset = ind->got.offset;
|
||||
ind->got.offset = (bfd_vma) -1;
|
||||
}
|
||||
BFD_ASSERT (ind->got.offset == (bfd_vma) -1);
|
||||
|
||||
if (dir->plt.offset == (bfd_vma) -1)
|
||||
{
|
||||
dir->plt.offset = ind->plt.offset;
|
||||
ind->plt.offset = (bfd_vma) -1;
|
||||
}
|
||||
BFD_ASSERT (ind->plt.offset == (bfd_vma) -1);
|
||||
|
||||
if (dir->dynindx == -1)
|
||||
{
|
||||
dir->dynindx = ind->dynindx;
|
||||
dir->dynstr_index = ind->dynstr_index;
|
||||
ind->dynindx = -1;
|
||||
ind->dynstr_index = 0;
|
||||
}
|
||||
BFD_ASSERT (ind->dynindx == -1);
|
||||
}
|
||||
|
||||
static void
|
||||
_bfd_elf_link_hash_hide_symbol(table, h)
|
||||
struct elf_link_hash_table *table;
|
||||
struct elf_link_hash_entry *h;
|
||||
{
|
||||
h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
|
||||
h->dynindx = -1;
|
||||
h->plt.offset = (bfd_vma) -1;
|
||||
}
|
||||
|
||||
/* Initialize an ELF linker hash table. */
|
||||
|
||||
boolean
|
||||
|
@ -925,6 +979,8 @@ _bfd_elf_link_hash_table_init (table, abfd, newfunc)
|
|||
table->needed = NULL;
|
||||
table->hgot = NULL;
|
||||
table->stab_info = NULL;
|
||||
table->copy_indirect = _bfd_elf_link_hash_copy_indirect;
|
||||
table->hide_symbol = _bfd_elf_link_hash_hide_symbol;
|
||||
return _bfd_link_hash_table_init (&table->root, abfd, newfunc);
|
||||
}
|
||||
|
||||
|
|
|
@ -1734,45 +1734,8 @@ elf_link_add_object_symbols (abfd, info)
|
|||
== 0);
|
||||
|
||||
ht = (struct elf_link_hash_entry *) hi->root.u.i.link;
|
||||
|
||||
/* Copy down any references that we may have
|
||||
already seen to the symbol which just became
|
||||
indirect. */
|
||||
ht->elf_link_hash_flags |=
|
||||
(hi->elf_link_hash_flags
|
||||
& (ELF_LINK_HASH_REF_DYNAMIC
|
||||
| ELF_LINK_HASH_REF_REGULAR
|
||||
| ELF_LINK_HASH_REF_REGULAR_NONWEAK
|
||||
| ELF_LINK_NON_GOT_REF));
|
||||
|
||||
/* Copy over the global and procedure linkage table
|
||||
offset entries. These may have been already set
|
||||
up by a check_relocs routine. */
|
||||
if (ht->got.offset == (bfd_vma) -1)
|
||||
{
|
||||
ht->got.offset = hi->got.offset;
|
||||
hi->got.offset = (bfd_vma) -1;
|
||||
}
|
||||
BFD_ASSERT (hi->got.offset == (bfd_vma) -1);
|
||||
|
||||
if (ht->plt.offset == (bfd_vma) -1)
|
||||
{
|
||||
ht->plt.offset = hi->plt.offset;
|
||||
hi->plt.offset = (bfd_vma) -1;
|
||||
}
|
||||
BFD_ASSERT (hi->plt.offset == (bfd_vma) -1);
|
||||
|
||||
if (ht->dynindx == -1)
|
||||
{
|
||||
ht->dynindx = hi->dynindx;
|
||||
ht->dynstr_index = hi->dynstr_index;
|
||||
hi->dynindx = -1;
|
||||
hi->dynstr_index = 0;
|
||||
}
|
||||
BFD_ASSERT (hi->dynindx == -1);
|
||||
|
||||
/* FIXME: There may be other information to copy
|
||||
over for particular targets. */
|
||||
elf_link_hash_copy_indirect (elf_hash_table (info),
|
||||
ht, hi);
|
||||
|
||||
/* See if the new flags lead us to realize that
|
||||
the symbol must be dynamic. */
|
||||
|
@ -1845,44 +1808,8 @@ elf_link_add_object_symbols (abfd, info)
|
|||
| ELF_LINK_HASH_DEF_REGULAR))
|
||||
== 0);
|
||||
|
||||
/* Copy down any references that we may have
|
||||
already seen to the symbol which just
|
||||
became indirect. */
|
||||
h->elf_link_hash_flags |=
|
||||
(hi->elf_link_hash_flags
|
||||
& (ELF_LINK_HASH_REF_DYNAMIC
|
||||
| ELF_LINK_HASH_REF_REGULAR
|
||||
| ELF_LINK_HASH_REF_REGULAR_NONWEAK
|
||||
| ELF_LINK_NON_GOT_REF));
|
||||
|
||||
/* Copy over the global and procedure linkage
|
||||
table offset entries. These may have been
|
||||
already set up by a check_relocs routine. */
|
||||
if (h->got.offset == (bfd_vma) -1)
|
||||
{
|
||||
h->got.offset = hi->got.offset;
|
||||
hi->got.offset = (bfd_vma) -1;
|
||||
}
|
||||
BFD_ASSERT (hi->got.offset == (bfd_vma) -1);
|
||||
|
||||
if (h->plt.offset == (bfd_vma) -1)
|
||||
{
|
||||
h->plt.offset = hi->plt.offset;
|
||||
hi->plt.offset = (bfd_vma) -1;
|
||||
}
|
||||
BFD_ASSERT (hi->got.offset == (bfd_vma) -1);
|
||||
|
||||
if (h->dynindx == -1)
|
||||
{
|
||||
h->dynindx = hi->dynindx;
|
||||
h->dynstr_index = hi->dynstr_index;
|
||||
hi->dynindx = -1;
|
||||
hi->dynstr_index = 0;
|
||||
}
|
||||
BFD_ASSERT (hi->dynindx == -1);
|
||||
|
||||
/* FIXME: There may be other information to
|
||||
copy over for particular targets. */
|
||||
elf_link_hash_copy_indirect (elf_hash_table (info),
|
||||
h, hi);
|
||||
|
||||
/* See if the new flags lead us to realize
|
||||
that the symbol must be dynamic. */
|
||||
|
@ -3758,10 +3685,8 @@ elf_link_assign_sym_version (h, data)
|
|||
&& ! sinfo->export_dynamic)
|
||||
{
|
||||
h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
|
||||
h->elf_link_hash_flags &=~
|
||||
ELF_LINK_HASH_NEEDS_PLT;
|
||||
h->dynindx = -1;
|
||||
h->plt.offset = (bfd_vma) -1;
|
||||
elf_link_hash_hide_symbol (elf_hash_table (info),
|
||||
h);
|
||||
/* FIXME: The name of the symbol has
|
||||
already been recorded in the dynamic
|
||||
string table section. */
|
||||
|
@ -3873,9 +3798,7 @@ elf_link_assign_sym_version (h, data)
|
|||
&& ! sinfo->export_dynamic)
|
||||
{
|
||||
h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
|
||||
h->elf_link_hash_flags &=~ ELF_LINK_HASH_NEEDS_PLT;
|
||||
h->dynindx = -1;
|
||||
h->plt.offset = (bfd_vma) -1;
|
||||
elf_link_hash_hide_symbol (elf_hash_table (info), h);
|
||||
/* FIXME: The name of the symbol has already
|
||||
been recorded in the dynamic string table
|
||||
section. */
|
||||
|
@ -3897,9 +3820,7 @@ elf_link_assign_sym_version (h, data)
|
|||
&& ! sinfo->export_dynamic)
|
||||
{
|
||||
h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
|
||||
h->elf_link_hash_flags &=~ ELF_LINK_HASH_NEEDS_PLT;
|
||||
h->dynindx = -1;
|
||||
h->plt.offset = (bfd_vma) -1;
|
||||
elf_link_hash_hide_symbol (elf_hash_table (info), h);
|
||||
/* FIXME: The name of the symbol has already been
|
||||
recorded in the dynamic string table section. */
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue