Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Jun 2019 18:29:08 +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: r348654 - head/contrib/elftoolchain/elfcopy
Message-ID:  <201906041829.x54IT8bb030081@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Tue Jun  4 18:29:08 2019
New Revision: 348654
URL: https://svnweb.freebsd.org/changeset/base/348654

Log:
  elfcopy: Use elf_getscn() instead of iterating over all sections.
  
  When removing a section, we would loop over all sections looking for
  a corresponding relocation section.  With r348652 it is much faster
  to just use elf_getscn().
  
  PR:		234949
  Reviewed by:	emaste
  MFC after:	2 weeks
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D20471

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

Modified: head/contrib/elftoolchain/elfcopy/sections.c
==============================================================================
--- head/contrib/elftoolchain/elfcopy/sections.c	Tue Jun  4 18:26:42 2019	(r348653)
+++ head/contrib/elftoolchain/elfcopy/sections.c	Tue Jun  4 18:29:08 2019	(r348654)
@@ -119,21 +119,19 @@ is_remove_reloc_sec(struct elfcopy *ecp, uint32_t sh_i
 		errx(EXIT_FAILURE, "elf_getshstrndx failed: %s",
 		    elf_errmsg(-1));
 
-	is = NULL;
-	while ((is = elf_nextscn(ecp->ein, is)) != NULL) {
-		if (sh_info == elf_ndxscn(is)) {
-			if (gelf_getshdr(is, &ish) == NULL)
-				errx(EXIT_FAILURE, "gelf_getshdr failed: %s",
-				    elf_errmsg(-1));
-			if ((name = elf_strptr(ecp->ein, indx, ish.sh_name)) ==
-			    NULL)
-				errx(EXIT_FAILURE, "elf_strptr failed: %s",
-				    elf_errmsg(-1));
-			if (is_remove_section(ecp, name))
-				return (1);
-			else
-				return (0);
-		}
+	is = elf_getscn(ecp->ein, sh_info);
+	if (is != NULL) {
+		if (gelf_getshdr(is, &ish) == NULL)
+			errx(EXIT_FAILURE, "gelf_getshdr failed: %s",
+			    elf_errmsg(-1));
+		if ((name = elf_strptr(ecp->ein, indx, ish.sh_name)) ==
+		    NULL)
+			errx(EXIT_FAILURE, "elf_strptr failed: %s",
+			    elf_errmsg(-1));
+		if (is_remove_section(ecp, name))
+			return (1);
+		else
+			return (0);
 	}
 	elferr = elf_errno();
 	if (elferr != 0)



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