Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Dec 2015 18:47:41 +0000 (UTC)
From:      Ed Maste <emaste@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r292116 - head/contrib/elftoolchain/elfcopy
Message-ID:  <201512111847.tBBIlfuF062988@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: emaste
Date: Fri Dec 11 18:47:41 2015
New Revision: 292116
URL: https://svnweb.freebsd.org/changeset/base/292116

Log:
  elfcopy: include extension but replace . when converting from binary
  
  The change in r291958 was not consistent with GNU objcopy. The start,
  end and size symbols created for ELF objects converted from binary need
  to include the full filename including the extension, but with the
  periods replaced with underscores.
  
  Reviewed by:	imp
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D4474

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

Modified: head/contrib/elftoolchain/elfcopy/binary.c
==============================================================================
--- head/contrib/elftoolchain/elfcopy/binary.c	Fri Dec 11 18:28:20 2015	(r292115)
+++ head/contrib/elftoolchain/elfcopy/binary.c	Fri Dec 11 18:47:41 2015	(r292116)
@@ -37,16 +37,6 @@
 
 ELFTC_VCSID("$Id: binary.c 3174 2015-03-27 17:13:41Z emaste $");
 
-static int
-basename_length(const char *filename)
-{
-	char *p;
-
-	if ((p = strchr(filename, '.')) != NULL)
-		return (p - filename);
-	return (strlen(filename));
-}
-
 /*
  * Convert ELF object to `binary'. Sections with SHF_ALLOC flag set
  * are copied to the result binary. The relative offsets for each section
@@ -150,6 +140,7 @@ create_elf_from_binary(struct elfcopy *e
 	GElf_Shdr sh;
 	void *content;
 	uint64_t off, data_start, data_end, data_size;
+	char *sym_basename, *p;
 
 	/* Reset internal section list. */
 	if (!TAILQ_EMPTY(&ecp->v_sec))
@@ -220,9 +211,13 @@ create_elf_from_binary(struct elfcopy *e
 	/* Count in .symtab and .strtab section headers.  */
 	shtab->sz += gelf_fsize(ecp->eout, ELF_T_SHDR, 2, EV_CURRENT);
 
+	if ((sym_basename = strdup(ifn)) == NULL)
+		err(1, "strdup");
+	p = sym_basename;
+	while ((p = strchr(p, '.')) != NULL)
+		*p++ = '_';
 #define	_GEN_SYMNAME(S) do {						\
-	snprintf(name, sizeof(name), "%s%.*s%s", "_binary_",		\
-	    basename_length(ifn), ifn, S);				\
+	snprintf(name, sizeof(name), "%s%s%s", "_binary_", sym_basename, S); \
 } while (0)
 
 	/*
@@ -244,6 +239,7 @@ create_elf_from_binary(struct elfcopy *e
 	finalize_external_symtab(ecp);
 	create_symtab_data(ecp);
 #undef	_GEN_SYMNAME
+	free(sym_basename);
 
 	/*
 	 * Write the underlying ehdr. Note that it should be called



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