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)
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to