diff options
-rw-r--r-- | bfd/ChangeLog | 14 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 16 | ||||
-rw-r--r-- | bfd/elf.c | 56 | ||||
-rw-r--r-- | bfd/elflink.h | 95 |
4 files changed, 94 insertions, 87 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1b629ea..c3425db 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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. diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 302ca7a..6f0624e 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -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. */ @@ -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); } diff --git a/bfd/elflink.h b/bfd/elflink.h index ce71d94..5bce135 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -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. */ } |