svn commit: r360996 - stable/12/contrib/elftoolchain/elfcopy
Ed Maste
emaste at FreeBSD.org
Tue May 12 23:51:05 UTC 2020
Author: emaste
Date: Tue May 12 23:51:04 2020
New Revision: 360996
URL: https://svnweb.freebsd.org/changeset/base/360996
Log:
MFC r359166: objcopy: add new sections also when there is no .shstrtab
Previously objcopy (elfcopy) --add-sections inserted new sections before
.shstrtab, but omitted them if there was no .shstrtab.
Now, after processing existing sections add new sections if they were
not yet added.
PR: 241437
Reported by: arrowd
Submitted by: Tiger Gao <tig at FreeBSDFoundation.org>
Sponsored by: The FreeBSD Foundation
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 Tue May 12 23:46:52 2020 (r360995)
+++ stable/12/contrib/elftoolchain/elfcopy/sections.c Tue May 12 23:51:04 2020 (r360996)
@@ -28,6 +28,7 @@
#include <sys/stat.h>
#include <err.h>
#include <libgen.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -341,6 +342,7 @@ create_scn(struct elfcopy *ecp)
size_t indx;
uint64_t oldndx, newndx;
int elferr, sec_flags, reorder;
+ bool sections_added;
/*
* Insert a pseudo section that contains the ELF header
@@ -364,6 +366,7 @@ create_scn(struct elfcopy *ecp)
errx(EXIT_FAILURE, "elf_getshstrndx failed: %s",
elf_errmsg(-1));
+ sections_added = false;
reorder = 0;
is = NULL;
while ((is = elf_nextscn(ecp->ein, is)) != NULL) {
@@ -438,12 +441,14 @@ create_scn(struct elfcopy *ecp)
oldndx = newndx = SHN_UNDEF;
if (strcmp(name, ".symtab") != 0 &&
strcmp(name, ".strtab") != 0) {
+ /* Add new sections before .shstrtab if we have one. */
if (!strcmp(name, ".shstrtab")) {
/*
* Add sections specified by --add-section and
* gnu debuglink. we want these sections have
* smaller index than .shstrtab section.
*/
+ sections_added = true;
if (ecp->debuglink != NULL)
add_gnu_debuglink(ecp);
if (ecp->flags & SEC_ADD)
@@ -504,6 +509,12 @@ create_scn(struct elfcopy *ecp)
ecp->strtab = s;
insert_to_sec_list(ecp, s, 0);
+ }
+ if (!sections_added) {
+ if (ecp->debuglink != NULL)
+ add_gnu_debuglink(ecp);
+ if (ecp->flags & SEC_ADD)
+ insert_sections(ecp);
}
elferr = elf_errno();
if (elferr != 0)
More information about the svn-src-all
mailing list