svn commit: r349705 - stable/12/contrib/elftoolchain/elfcopy

Mark Johnston markj at FreeBSD.org
Wed Jul 3 20:52:09 UTC 2019


Author: markj
Date: Wed Jul  3 20:52:07 2019
New Revision: 349705
URL: https://svnweb.freebsd.org/changeset/base/349705

Log:
  MFC r349423
  elfcopy: Provide a size hint when creating the section string table.

Modified:
  stable/12/contrib/elftoolchain/elfcopy/sections.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/contrib/elftoolchain/elfcopy/sections.c
==============================================================================
--- stable/12/contrib/elftoolchain/elfcopy/sections.c	Wed Jul  3 20:22:36 2019	(r349704)
+++ stable/12/contrib/elftoolchain/elfcopy/sections.c	Wed Jul  3 20:52:07 2019	(r349705)
@@ -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");


More information about the svn-src-stable-12 mailing list