From 6fa3860b3b4e2e963d19b54d5f215416f998d294 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Thu, 10 Feb 2005 14:09:43 +0000 Subject: 2005-02-10 Paul Brook * elflink.c (bfd_elf_record_link_assignment): Make hidden and internal symbols local. (elf_link_renumber_hash_table_dynsyms): Ignore local symbols. (elf_link_renumber_local_hash_table_dynsyms): New function. (_bfd_elf_link_renumber_dynsyms): Number local dynamic symbols. ld/testsuite/ * ld-elfvsb/hidden2.s: New file * ld-elfvsb/hidden2.d: New file * ld-elfvsb/hidden2.ld: New file --- bfd/ChangeLog | 8 ++++++++ bfd/elflink.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 3 deletions(-) (limited to 'bfd') diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1cc875f..a5d36d7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2005-02-10 Paul Brook + + * elflink.c (bfd_elf_record_link_assignment): Make hidden and internal + symbols local. + (elf_link_renumber_hash_table_dynsyms): Ignore local symbols. + (elf_link_renumber_local_hash_table_dynsyms): New function. + (_bfd_elf_link_renumber_dynsyms): Number local dynamic symbols. + 2005-02-10 Jakub Jelinek * bfd-in.h (BFD_LINKER_CREATED): Define. diff --git a/bfd/elflink.c b/bfd/elflink.c index 6c65bab..4cbcc1b 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -484,6 +484,14 @@ bfd_elf_record_link_assignment (bfd *output_bfd ATTRIBUTE_UNUSED, h->def_regular = 1; + /* STV_HIDDEN and STV_INTERNAL symbols must be STB_LOCAL in shared objects + and executables. */ + if (!info->relocatable + && h->dynindx != -1 + && (ELF_ST_VISIBILITY (h->other) == STV_HIDDEN + || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL)) + h->forced_local = 1; + if ((h->def_dynamic || h->ref_dynamic || info->shared) @@ -624,6 +632,31 @@ elf_link_renumber_hash_table_dynsyms (struct elf_link_hash_entry *h, if (h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; + if (h->forced_local) + return TRUE; + + if (h->dynindx != -1) + h->dynindx = ++(*count); + + return TRUE; +} + + +/* Like elf_link_renumber_hash_table_dynsyms, but just number symbols with + STB_LOCAL binding. */ + +static bfd_boolean +elf_link_renumber_local_hash_table_dynsyms (struct elf_link_hash_entry *h, + void *data) +{ + size_t *count = data; + + if (h->root.type == bfd_link_hash_warning) + h = (struct elf_link_hash_entry *) h->root.u.i.link; + + if (!h->forced_local) + return TRUE; + if (h->dynindx != -1) h->dynindx = ++(*count); @@ -667,9 +700,10 @@ _bfd_elf_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED, } /* Assign dynsym indices. In a shared library we generate a section - symbol for each output section, which come first. Next come all of - the back-end allocated local dynamic syms, followed by the rest of - the global symbols. */ + symbol for each output section, which come first. Next come symbols + which have been forced to local binding. Then all of the back-end + allocated local dynamic syms, followed by the rest of the global + symbols. */ unsigned long _bfd_elf_link_renumber_dynsyms (bfd *output_bfd, struct bfd_link_info *info) @@ -687,6 +721,10 @@ _bfd_elf_link_renumber_dynsyms (bfd *output_bfd, struct bfd_link_info *info) elf_section_data (p)->dynindx = ++dynsymcount; } + elf_link_hash_traverse (elf_hash_table (info), + elf_link_renumber_local_hash_table_dynsyms, + &dynsymcount); + if (elf_hash_table (info)->dynlocal) { struct elf_link_local_dynamic_entry *p; -- cgit v1.1