From 02be4619f1326faebdf539a45539ba83e689470c Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 11 Jan 2013 14:09:59 +0000 Subject: [PATCH] * elf-bfd.h (_bfd_elf_strtab_refcount): Declare. * elf-strtab.c (_bfd_elf_strtab_refcount): New function. * elflink.c (elf_add_dt_needed_tag): Use _bfd_elf_strtab_refcount. --- bfd/ChangeLog | 6 ++++++ bfd/elf-bfd.h | 2 ++ bfd/elf-strtab.c | 6 ++++++ bfd/elflink.c | 4 +--- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ba90f46..0fcbe54 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,11 @@ 2013-01-12 Alan Modra + * elf-bfd.h (_bfd_elf_strtab_refcount): Declare. + * elf-strtab.c (_bfd_elf_strtab_refcount): New function. + * elflink.c (elf_add_dt_needed_tag): Use _bfd_elf_strtab_refcount. + +2013-01-12 Alan Modra + PR ld/12549 * elf-bfd.h (_bfd_elf_strtab_clear_refs): Declare. (_bfd_elf_strtab_clear_all_refs): Define. diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 85f8f31..a874593 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1938,6 +1938,8 @@ extern void _bfd_elf_strtab_addref (struct elf_strtab_hash *, bfd_size_type); extern void _bfd_elf_strtab_delref (struct elf_strtab_hash *, bfd_size_type); +extern unsigned int _bfd_elf_strtab_refcount + (struct elf_strtab_hash *, bfd_size_type); extern void _bfd_elf_strtab_clear_refs (struct elf_strtab_hash *, bfd_size_type); #define _bfd_elf_strtab_clear_all_refs(tab) \ diff --git a/bfd/elf-strtab.c b/bfd/elf-strtab.c index 1526755..45743f6 100644 --- a/bfd/elf-strtab.c +++ b/bfd/elf-strtab.c @@ -201,6 +201,12 @@ _bfd_elf_strtab_delref (struct elf_strtab_hash *tab, bfd_size_type idx) --tab->array[idx]->refcount; } +unsigned int +_bfd_elf_strtab_refcount (struct elf_strtab_hash *tab, bfd_size_type idx) +{ + return tab->array[idx]->refcount; +} + void _bfd_elf_strtab_clear_refs (struct elf_strtab_hash *tab, bfd_size_type idx) { diff --git a/bfd/elflink.c b/bfd/elflink.c index ee6288a..7861946 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -3091,19 +3091,17 @@ elf_add_dt_needed_tag (bfd *abfd, bfd_boolean do_it) { struct elf_link_hash_table *hash_table; - bfd_size_type oldsize; bfd_size_type strindex; if (!_bfd_elf_link_create_dynstrtab (abfd, info)) return -1; hash_table = elf_hash_table (info); - oldsize = _bfd_elf_strtab_size (hash_table->dynstr); strindex = _bfd_elf_strtab_add (hash_table->dynstr, soname, FALSE); if (strindex == (bfd_size_type) -1) return -1; - if (oldsize == _bfd_elf_strtab_size (hash_table->dynstr)) + if (_bfd_elf_strtab_refcount (hash_table->dynstr, strindex) != 1) { asection *sdyn; const struct elf_backend_data *bed; -- 2.7.4