Author: markj
Date: Wed Jun 26 16:35:37 2019
New Revision: 349423
URL: https://svnweb.freebsd.org/changeset/base/349423

Log:
  elfcopy: Provide a size hint when creating the section string table.
  
  Use the input file's .shstrtab size as the hint if it exists.  This
  gives a small performance improvement when processing files with
  many sections.
  
  Reviewed by:  emaste
  MFC after:    1 week
  Sponsored by: The FreeBSD Foundation
  Differential Revision:        https://reviews.freebsd.org/D20544

Modified:
  head/contrib/elftoolchain/elfcopy/sections.c

Modified: head/contrib/elftoolchain/elfcopy/sections.c
==============================================================================
--- head/contrib/elftoolchain/elfcopy/sections.c        Wed Jun 26 16:32:41 
2019        (r349422)
+++ head/contrib/elftoolchain/elfcopy/sections.c        Wed Jun 26 16:35:37 
2019        (r349423)
@@ -1398,8 +1398,24 @@ update_shdr(struct elfcopy *ecp, int update_link)
 void
 init_shstrtab(struct elfcopy *ecp)
 {
+       Elf_Scn *shstrtab;
+       GElf_Shdr shdr;
        struct section *s;
+       size_t indx, sizehint;
 
+       if (elf_getshstrndx(ecp->ein, &indx) != 0) {
+               shstrtab = elf_getscn(ecp->ein, indx);
+               if (shstrtab == NULL)
+                       errx(EXIT_FAILURE, "elf_getscn failed: %s",
+                           elf_errmsg(-1));
+               if (gelf_getshdr(shstrtab, &shdr) != &shdr)
+                       errx(EXIT_FAILURE, "gelf_getshdr failed: %s",
+                           elf_errmsg(-1));
+               sizehint = shdr.sh_size;
+       } else {
+               sizehint = 0;
+       }
+
        if ((ecp->shstrtab = calloc(1, sizeof(*ecp->shstrtab))) == NULL)
                err(EXIT_FAILURE, "calloc failed");
        s = ecp->shstrtab;
@@ -1410,7 +1426,7 @@ init_shstrtab(struct elfcopy *ecp)
        s->loadable = 0;
        s->type = SHT_STRTAB;
        s->vma = 0;
-       s->strtab = elftc_string_table_create(0);
+       s->strtab = elftc_string_table_create(sizehint);
 
        add_to_shstrtab(ecp, "");
        add_to_shstrtab(ecp, ".symtab");
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to