Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Jun 2019 16:35:37 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r349423 - head/contrib/elftoolchain/elfcopy
Message-ID:  <201906261635.x5QGZbJ7051084@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201906261635.x5QGZbJ7051084>