svn commit: r333600 - in head/contrib/elftoolchain: elfcopy readelf

Phil Shafer phil at FreeBSD.org
Mon May 14 05:21:20 UTC 2018


Author: phil
Date: Mon May 14 05:21:18 2018
New Revision: 333600
URL: https://svnweb.freebsd.org/changeset/base/333600

Log:
  Handle thread-local storage (TLS) segments correctly when
  copying (objcopy) and displaying (readelf) them.
  
  PR:		227552
  Submitted by:	kaiw (maintainer)
  Reported by:	jachmann at unitix.org
  Reviewed by:	phil
  MFC after:	1 day

Modified:
  head/contrib/elftoolchain/elfcopy/elfcopy.h
  head/contrib/elftoolchain/elfcopy/sections.c
  head/contrib/elftoolchain/elfcopy/segments.c
  head/contrib/elftoolchain/readelf/readelf.c

Modified: head/contrib/elftoolchain/elfcopy/elfcopy.h
==============================================================================
--- head/contrib/elftoolchain/elfcopy/elfcopy.h	Mon May 14 04:00:52 2018	(r333599)
+++ head/contrib/elftoolchain/elfcopy/elfcopy.h	Mon May 14 05:21:18 2018	(r333600)
@@ -127,6 +127,7 @@ struct section {
 	uint64_t	 cap;	/* section capacity */
 	uint64_t	 align;	/* section alignment */
 	uint64_t	 type;	/* section type */
+	uint64_t	 flags;	/* section flags */
 	uint64_t	 vma;	/* section virtual addr */
 	uint64_t	 lma;	/* section load addr */
 	uint64_t	 pad_sz;/* section padding size */

Modified: head/contrib/elftoolchain/elfcopy/sections.c
==============================================================================
--- head/contrib/elftoolchain/elfcopy/sections.c	Mon May 14 04:00:52 2018	(r333599)
+++ head/contrib/elftoolchain/elfcopy/sections.c	Mon May 14 05:21:18 2018	(r333600)
@@ -411,6 +411,7 @@ create_scn(struct elfcopy *ecp)
 			s->sz		= ish.sh_size;
 			s->align	= ish.sh_addralign;
 			s->type		= ish.sh_type;
+			s->flags	= ish.sh_flags;
 			s->vma		= ish.sh_addr;
 
 			/*

Modified: head/contrib/elftoolchain/elfcopy/segments.c
==============================================================================
--- head/contrib/elftoolchain/elfcopy/segments.c	Mon May 14 04:00:52 2018	(r333599)
+++ head/contrib/elftoolchain/elfcopy/segments.c	Mon May 14 05:21:18 2018	(r333600)
@@ -79,6 +79,8 @@ add_to_inseg_list(struct elfcopy *ecp, struct section 
 			continue;
 		if (s->vma + s->sz > seg->vaddr + seg->msz)
 			continue;
+		if (seg->type == PT_TLS && ((s->flags & SHF_TLS) == 0))
+			continue;
 
 		insert_to_inseg_list(seg, s);
 		if (seg->type == PT_LOAD)

Modified: head/contrib/elftoolchain/readelf/readelf.c
==============================================================================
--- head/contrib/elftoolchain/readelf/readelf.c	Mon May 14 04:00:52 2018	(r333599)
+++ head/contrib/elftoolchain/readelf/readelf.c	Mon May 14 05:21:18 2018	(r333600)
@@ -2378,11 +2378,22 @@ dump_phdr(struct readelf *re)
 		}
 		printf("   %2.2d     ", i);
 		/* skip NULL section. */
-		for (j = 1; (size_t)j < re->shnum; j++)
-			if (re->sl[j].addr >= phdr.p_vaddr &&
-			    re->sl[j].addr + re->sl[j].sz <=
+		for (j = 1; (size_t)j < re->shnum; j++) {
+			if (re->sl[j].off < phdr.p_offset)
+				continue;
+			if (re->sl[j].off + re->sl[j].sz >
+			    phdr.p_offset + phdr.p_filesz &&
+			    re->sl[j].type != SHT_NOBITS)
+				continue;
+			if (re->sl[j].addr < phdr.p_vaddr ||
+			    re->sl[j].addr + re->sl[j].sz >
 			    phdr.p_vaddr + phdr.p_memsz)
-				printf("%s ", re->sl[j].name);
+				continue;
+			if (phdr.p_type == PT_TLS &&
+			    (re->sl[j].flags & SHF_TLS) == 0)
+				continue;
+			printf("%s ", re->sl[j].name);
+		}
 		printf("\n");
 	}
 #undef	PH_HDR


More information about the svn-src-all mailing list