svn commit: r348654 - head/contrib/elftoolchain/elfcopy
Mark Johnston
markj at FreeBSD.org
Tue Jun 4 18:29:09 UTC 2019
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)
More information about the svn-src-all
mailing list