summaryrefslogtreecommitdiff
path: root/elfcopy
diff options
context:
space:
mode:
Diffstat (limited to 'elfcopy')
-rw-r--r--elfcopy/Makefile6
-rw-r--r--elfcopy/binary.c4
-rw-r--r--elfcopy/elfcopy.19
-rw-r--r--elfcopy/main.c35
4 files changed, 42 insertions, 12 deletions
diff --git a/elfcopy/Makefile b/elfcopy/Makefile
index 8b208e0ff467..dff967e13fb0 100644
--- a/elfcopy/Makefile
+++ b/elfcopy/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile 3381 2016-01-30 19:39:47Z jkoshy $
+# $Id: Makefile 3608 2018-04-14 21:23:04Z jkoshy $
TOP= ..
@@ -18,7 +18,7 @@ LDADD= -lelf -lelftc
LDADD+= -larchive
.endif
-.if defined(WITH_PE) && ${WITH_PE:tl} == "yes"
+.if defined(WITH_PE) && ${WITH_PE} == "yes"
SRCS+= pe.c
CFLAGS+= -DWITH_PE=1
@@ -51,4 +51,6 @@ ${EXTRA_TARGETS}: ${PROG}
.if ${OS_HOST} == "OpenBSD"
CFLAGS+= -I/usr/local/include
LDFLAGS+= -L/usr/local/lib
+.elif ${OS_HOST} == "DragonFly"
+LDADD+= -lbz2
.endif
diff --git a/elfcopy/binary.c b/elfcopy/binary.c
index ad86a6533c55..d6cce9c99576 100644
--- a/elfcopy/binary.c
+++ b/elfcopy/binary.c
@@ -36,7 +36,7 @@
#include "elfcopy.h"
-ELFTC_VCSID("$Id: binary.c 3445 2016-04-20 19:08:30Z emaste $");
+ELFTC_VCSID("$Id: binary.c 3611 2018-04-16 21:35:18Z jkoshy $");
/*
* Convert ELF object to `binary'. Sections with SHF_ALLOC flag set
@@ -215,7 +215,7 @@ create_elf_from_binary(struct elfcopy *ecp, int ifd, const char *ifn)
if ((sym_basename = strdup(ifn)) == NULL)
err(1, "strdup");
for (p = sym_basename; *p != '\0'; p++)
- if (!isalnum(*p))
+ if (!isalnum(*p & 0xFF))
*p = '_';
#define _GEN_SYMNAME(S) do { \
snprintf(name, sizeof(name), "%s%s%s", "_binary_", sym_basename, S); \
diff --git a/elfcopy/elfcopy.1 b/elfcopy/elfcopy.1
index 672885a8132b..a71451056aa3 100644
--- a/elfcopy/elfcopy.1
+++ b/elfcopy/elfcopy.1
@@ -21,9 +21,9 @@
.\" out of the use of this software, even if advised of the possibility of
.\" such damage.
.\"
-.\" $Id: elfcopy.1 3426 2016-03-05 13:32:28Z emaste $
+.\" $Id: elfcopy.1 3565 2017-08-31 02:24:19Z emaste $
.\"
-.Dd March 5, 2016
+.Dd August 30, 2017
.Os
.Dt ELFCOPY 1
.Sh NAME
@@ -83,6 +83,7 @@
.Op Fl -srec-forceS3
.Op Fl -srec-len Ns = Ns Ar val
.Op Fl -strip-dwo
+.Op Fl -strip-symbols= Ns Ar filename
.Op Fl -strip-unneeded
.Ar infile
.Op Ar outfile
@@ -339,6 +340,10 @@ This option is only meaningful when the output target is set to
.Dq srec .
.It Fl -strip-dwo
Do not copy .dwo debug sections to the output file.
+.It Fl -strip-symbols= Ns Ar filename
+Do not copy any of the symbols specified by
+.Ar filename
+to the output.
.It Fl -strip-unneeded
Do not copy symbols that are not needed for relocation processing.
.El
diff --git a/elfcopy/main.c b/elfcopy/main.c
index cc16dcab0cd6..b58c01ac7bbd 100644
--- a/elfcopy/main.c
+++ b/elfcopy/main.c
@@ -39,7 +39,7 @@
#include "elfcopy.h"
-ELFTC_VCSID("$Id: main.c 3520 2017-04-17 01:47:52Z kaiwang27 $");
+ELFTC_VCSID("$Id: main.c 3577 2017-09-14 02:19:42Z emaste $");
enum options
{
@@ -679,6 +679,8 @@ create_file(struct elfcopy *ecp, const char *src, const char *dst)
if ((ifd = open(elftemp, O_RDONLY)) == -1)
err(EXIT_FAILURE, "open %s failed", src);
close(efd);
+ if (unlink(elftemp) < 0)
+ err(EXIT_FAILURE, "unlink %s failed", elftemp);
free(elftemp);
}
@@ -1283,8 +1285,9 @@ parse_symlist_file(struct elfcopy *ecp, const char *fn, unsigned int op)
err(EXIT_FAILURE, "can not open %s", fn);
if ((data = malloc(sb.st_size + 1)) == NULL)
err(EXIT_FAILURE, "malloc failed");
- if (fread(data, 1, sb.st_size, fp) == 0 || ferror(fp))
- err(EXIT_FAILURE, "fread failed");
+ if (sb.st_size > 0)
+ if (fread(data, sb.st_size, 1, fp) != 1)
+ err(EXIT_FAILURE, "fread failed");
fclose(fp);
data[sb.st_size] = '\0';
@@ -1534,6 +1537,22 @@ print_version(void)
exit(EXIT_SUCCESS);
}
+/*
+ * Compare the ending of s with end.
+ */
+static int
+strrcmp(const char *s, const char *end)
+{
+ size_t endlen, slen;
+
+ slen = strlen(s);
+ endlen = strlen(end);
+
+ if (slen >= endlen)
+ s += slen - endlen;
+ return (strcmp(s, end));
+}
+
int
main(int argc, char **argv)
{
@@ -1567,12 +1586,16 @@ main(int argc, char **argv)
if ((ecp->progname = ELFTC_GETPROGNAME()) == NULL)
ecp->progname = "elfcopy";
- if (strcmp(ecp->progname, "strip") == 0)
+ if (strrcmp(ecp->progname, "strip") == 0)
strip_main(ecp, argc, argv);
- else if (strcmp(ecp->progname, "mcs") == 0)
+ else if (strrcmp(ecp->progname, "mcs") == 0)
mcs_main(ecp, argc, argv);
- else
+ else {
+ if (strrcmp(ecp->progname, "elfcopy") != 0 &&
+ strrcmp(ecp->progname, "objcopy") != 0)
+ warnx("program mode not known, defaulting to elfcopy");
elfcopy_main(ecp, argc, argv);
+ }
free_sec_add(ecp);
free_sec_act(ecp);