Always count the NULL entry in dynamic symbol table
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 26 Apr 2016 10:53:07 +0000 (03:53 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 26 Apr 2016 10:53:23 +0000 (03:53 -0700)
There is an unused NULL entry at the head of dynamic symbol table which
we must account for in our count even if the table is empty or unused
since it is intended for the mandatory DT_SYMTAB tag (.dynsym section)
in .dynamic section.

* elf-bfd.h (elf_link_hash_table): Update comments for
dynsymcount.
* elflink.c (_bfd_elf_link_renumber_dynsyms): Always count for
the unused NULL entry at the head of dynamic symbol table.
(bfd_elf_size_dynsym_hash_dynstr): Remove dynsymcount != 0
checks.

bfd/ChangeLog
bfd/elf-bfd.h
bfd/elflink.c

index a8a29bd298f2bee7f737192e6768bfca245d9b32..746adad33d89319be90eecd10516f3f9f3ef1d04 100644 (file)
@@ -1,3 +1,12 @@
+2016-04-26  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf-bfd.h (elf_link_hash_table): Update comments for
+       dynsymcount.
+       * elflink.c (_bfd_elf_link_renumber_dynsyms): Always count for
+       the unused NULL entry at the head of dynamic symbol table.
+       (bfd_elf_size_dynsym_hash_dynstr): Remove dynsymcount != 0
+       checks.
+
 2016-04-21  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elflink.c (_bfd_elf_link_create_dynstrtab): Exclude linker
index 5dce70e93d5e74385b93a091b6d08f798a9080bf..7447629b0e76f1262d50c2d8d1deb749f526aa6f 100644 (file)
@@ -520,8 +520,8 @@ struct elf_link_hash_table
   union gotplt_union init_got_offset;
   union gotplt_union init_plt_offset;
 
-  /* The number of symbols found in the link which must be put into
-     the .dynsym section.  */
+  /* The number of symbols found in the link which is intended for the
+     mandatory DT_SYMTAB tag (.dynsym section) in .dynamic section.  */
   bfd_size_type dynsymcount;
 
   /* The string table of dynamic symbols, which becomes the .dynstr
index 6f6726648fdc0c5f0d5bcb4de43a908173a3040a..a6b3c944080339c300badc18ace995a218a2572c 100644 (file)
@@ -905,11 +905,11 @@ _bfd_elf_link_renumber_dynsyms (bfd *output_bfd,
                          elf_link_renumber_hash_table_dynsyms,
                          &dynsymcount);
 
-  /* There is an unused NULL entry at the head of the table which
-     we must account for in our count.  We always create the dynsym
-     section, even if it is empty, with dynamic sections.  */
-  if (elf_hash_table (info)->dynamic_sections_created)
-    ++dynsymcount;
+  /* There is an unused NULL entry at the head of the table which we
+     must account for in our count even if the table is empty since it
+     is intended for the mandatory DT_SYMTAB tag (.dynsym section) in
+     .dynamic section.  */
+  dynsymcount++;
 
   elf_hash_table (info)->dynsymcount = dynsymcount;
   return dynsymcount;
@@ -6606,8 +6606,7 @@ bfd_elf_size_dynsym_hash_dynstr (bfd *output_bfd, struct bfd_link_info *info)
       /* Work out the size of the symbol version section.  */
       s = bfd_get_linker_section (dynobj, ".gnu.version");
       BFD_ASSERT (s != NULL);
-      if (dynsymcount != 0
-         && (s->flags & SEC_EXCLUDE) == 0)
+      if ((s->flags & SEC_EXCLUDE) == 0)
        {
          s->size = dynsymcount * sizeof (Elf_External_Versym);
          s->contents = (unsigned char *) bfd_zalloc (output_bfd, s->size);
@@ -6628,17 +6627,14 @@ bfd_elf_size_dynsym_hash_dynstr (bfd *output_bfd, struct bfd_link_info *info)
       BFD_ASSERT (s != NULL);
       s->size = dynsymcount * bed->s->sizeof_sym;
 
-      if (dynsymcount != 0)
-       {
-         s->contents = (unsigned char *) bfd_alloc (output_bfd, s->size);
-         if (s->contents == NULL)
-           return FALSE;
+      s->contents = (unsigned char *) bfd_alloc (output_bfd, s->size);
+      if (s->contents == NULL)
+       return FALSE;
 
-         /* The first entry in .dynsym is a dummy symbol.
-            Clear all the section syms, in case we don't output them all.  */
-         ++section_sym_count;
-         memset (s->contents, 0, section_sym_count * bed->s->sizeof_sym);
-       }
+      /* The first entry in .dynsym is a dummy symbol.  Clear all the
+        section syms, in case we don't output them all.  */
+      ++section_sym_count;
+      memset (s->contents, 0, section_sym_count * bed->s->sizeof_sym);
 
       elf_hash_table (info)->bucketcount = 0;