From nobody@FreeBSD.org  Fri Nov 30 08:13:47 2012
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 9D0E9225
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 30 Nov 2012 08:13:47 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22])
	by mx1.freebsd.org (Postfix) with ESMTP id 813988FC08
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 30 Nov 2012 08:13:47 +0000 (UTC)
Received: from red.freebsd.org (localhost [127.0.0.1])
	by red.freebsd.org (8.14.5/8.14.5) with ESMTP id qAU8DlYP010099
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 30 Nov 2012 08:13:47 GMT
	(envelope-from nobody@red.freebsd.org)
Received: (from nobody@localhost)
	by red.freebsd.org (8.14.5/8.14.5/Submit) id qAU8Dlpb010098;
	Fri, 30 Nov 2012 08:13:47 GMT
	(envelope-from nobody)
Message-Id: <201211300813.qAU8Dlpb010098@red.freebsd.org>
Date: Fri, 30 Nov 2012 08:13:47 GMT
From: Pete Chou <petechou@gmail.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: [patch] crunchide support non-custom elf object layout
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         174011
>Category:       bin
>Synopsis:       [patch] crunchide(1): support non-custom elf object layout
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    pfg
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Nov 30 08:20:00 UTC 2012
>Closed-Date:    Mon Feb 18 21:19:46 UTC 2013
>Last-Modified:  Mon Feb 18 21:19:46 UTC 2013
>Originator:     Pete Chou
>Release:        9.0
>Organization:
>Environment:
FreeBSD bsd 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan  3 07:15:25 UTC 2012     root@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386
>Description:
I find crunchide can't handle the object files generated from other linkers like gold linker and mclinker.

The crunchide utility presumes the last 3 chunks of an ELF object layout are section headers, symbol table, and then string table. However, this is not specified in the ELF standards, and linkers may generate different layouts when doing partial linking (-r). For example, both gold and mclinker put section headers in the end of file instead.

I also report this at
http://lists.freebsd.org/pipermail/freebsd-toolchain/2012-November/000604.html
>How-To-Repeat:
1. Use gold linker or mclinker to do partial linking on the attached x86 object files.
${LD} -dc -r -o cat.lo cat_stub.o cat.o

2. Let crunchide handle the output from previous partial linking
crunchide -k _crunched_cat_stub cat.lo

If using gold linker, we'll find a warning:
 cat.lo: weird executable (string table not last section)

As for mclinker, crunchide will break the object file.

>Fix:
Basically, crunchide will only increase the size of string table, so the patch is to move everyting behind string table to the correct position.

Patch attached with submission follows:

diff --git exec_elf32.c exec_elf32.c
index 0eae31a..770448c 100644
--- exec_elf32.c
+++ exec_elf32.c
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD: release/9.0.0/usr.sbin/crunch/crunchide/exec_elf32.c 211222
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <limits.h>
 
 #include "extern.h"
 
@@ -235,17 +236,22 @@ int
 ELFNAMEEND(hide)(int fd, const char *fn)
 {
 	Elf_Ehdr ehdr;
-	Elf_Shdr *shdrp = NULL, *symtabshdr, *strtabshdr;
+	Elf_Shdr *shdrp = NULL, *symtabshdr, *strtabshdr, *shstrtabshdr;
+	Elf_Shdr shdrshdr;
 	Elf_Sym *symtabp = NULL;
-	char *strtabp = NULL;
+	char *strtabp = NULL, *shstrtabp = NULL;
 	Elf_Size  nsyms, nlocalsyms, ewi;
 	ssize_t shdrsize;
 	int rv, i, weird;
 	size_t nstrtab_size, nstrtab_nextoff, fn_size;
 	char *nstrtabp = NULL;
 	unsigned char data;
-	Elf_Off maxoff, stroff;
 	const char *weirdreason = NULL;
+	struct shlayout {
+		Elf_Shdr *shdr;
+		void * bufp;
+	};
+	struct shlayout *layoutp;
 
 	rv = 0;
 	if (xreadatoff(fd, &ehdr, 0, sizeof ehdr, fn) != sizeof ehdr)
@@ -260,62 +266,111 @@ ELFNAMEEND(hide)(int fd, const char *fn)
 	    shdrsize)
 		goto bad;
 
-	symtabshdr = strtabshdr = NULL;
+	symtabshdr = strtabshdr = shstrtabshdr = NULL;
 	weird = 0;
-	maxoff = stroff = 0;
 	for (i = 0; i < xe16toh(ehdr.e_shnum); i++) {
-		if (xewtoh(shdrp[i].sh_offset) > maxoff)
-			maxoff = xewtoh(shdrp[i].sh_offset);
 		switch (xe32toh(shdrp[i].sh_type)) {
 		case SHT_SYMTAB:
 			if (symtabshdr != NULL)
 				weird = 1;
 			symtabshdr = &shdrp[i];
 			strtabshdr = &shdrp[xe32toh(shdrp[i].sh_link)];
-
-			/* Check whether the string table is the last section */
-			stroff = xewtoh(shdrp[xe32toh(shdrp[i].sh_link)].sh_offset);
-			if (!weird && xe32toh(shdrp[i].sh_link) != (xe16toh(ehdr.e_shnum) - 1)) {
-				weird = 1;
-				weirdreason = "string table not last section";
-			}
+			break;
+		case SHT_STRTAB:
+			if (i == xe16toh(ehdr.e_shstrndx))
+				shstrtabshdr = &shdrp[i];
 			break;
 		}
 	}
 	if (! weirdreason)
 		weirdreason = "unsupported";
-	if (symtabshdr == NULL)
-		goto out;
-	if (strtabshdr == NULL)
-		weird = 1;
-	if (!weird && stroff != maxoff) {
+	if (symtabshdr == NULL || strtabshdr == NULL || shstrtabshdr == NULL)
 		weird = 1;
-		weirdreason = "string table section not last in file";
-	}   
 	if (weird) {
 		fprintf(stderr, "%s: weird executable (%s)\n", fn, weirdreason);
 		goto bad;
 	}
 
 	/*
+	 * sort section layout table by offset
+	 */
+	layoutp = xmalloc(sizeof(struct shlayout) * (xe16toh(ehdr.e_shnum) + 1),
+		fn, "layout table");
+	if (layoutp == NULL)
+		goto bad;
+
+	/* add a pseudo entry to represent the section header table */
+	shdrshdr.sh_offset = ehdr.e_shoff;
+	shdrshdr.sh_size = htoxew(shdrsize);
+	shdrshdr.sh_addralign = htoxew(ELFSIZE / 8);
+	layoutp[0].shdr = &shdrshdr;
+
+	/* insert and sort normal section headers */
+	for (i = 0; i < xe16toh(ehdr.e_shnum); i++) {
+		int l = 0, r = i;
+		while (l <= r) {
+			int m = ( l + r) / 2;
+			if (xewtoh(shdrp[i].sh_offset) <
+				xewtoh(layoutp[m].shdr->sh_offset))
+				r = m - 1;
+			else
+				l = m + 1;
+		}
+
+		if (l != i + 1)
+			memmove(&layoutp[l + 1], &layoutp[l],
+				sizeof(struct shlayout) * (i - l + 1));
+
+		layoutp[l].shdr = &shdrp[i];
+		layoutp[l].bufp = NULL;
+	}
+
+	/*
 	 * load up everything we need
 	 */
 
-	/* symbol table */
-	if ((symtabp = xmalloc(xewtoh(symtabshdr->sh_size), fn, "symbol table"))
-	    == NULL)
+	/* load section string table for debug use */
+	if ((shstrtabp = xmalloc(xewtoh(shstrtabshdr->sh_size), fn,
+		"section string table")) == NULL)
 		goto bad;
-	if (xreadatoff(fd, symtabp, xewtoh(symtabshdr->sh_offset),
-	    xewtoh(symtabshdr->sh_size), fn) != xewtoh(symtabshdr->sh_size))
+	if (xreadatoff(fd, shstrtabp, xewtoh(shstrtabshdr->sh_offset),
+		xewtoh(shstrtabshdr->sh_size), fn) != xewtoh(shstrtabshdr->sh_size))
 		goto bad;
 
-	/* string table */
-	if ((strtabp = xmalloc(xewtoh(strtabshdr->sh_size), fn, "string table"))
-	    == NULL)
-		goto bad;
-	if (xreadatoff(fd, strtabp, xewtoh(strtabshdr->sh_offset),
-	    xewtoh(strtabshdr->sh_size), fn) != xewtoh(strtabshdr->sh_size))
-		goto bad;
+	/* we need symtab, strtab, and everything behind strtab */
+	for (i = 0; i < xe16toh(ehdr.e_shnum) + 1; i++) {
+		static int strtabidx = INT_MAX;
+		size_t size;
+		if (layoutp[i].shdr == &shdrshdr) {
+			/* not load section header again */
+			layoutp[i].bufp = shdrp;
+			continue;
+		}
+		else if (layoutp[i].shdr == shstrtabshdr) {
+			/* not load section string table again */
+			layoutp[i].bufp = shstrtabp;
+			continue;
+		}
+
+		if (layoutp[i].shdr == strtabshdr)
+			strtabidx = i;
+		if (layoutp[i].shdr == symtabshdr || i >= strtabidx) {
+			size = xewtoh(layoutp[i].shdr->sh_size);
+			if ((layoutp[i].bufp = xmalloc(size, fn,
+				shstrtabp + xewtoh(layoutp[i].shdr->sh_name))) == NULL)
+				goto bad;
+			if (xreadatoff(fd, layoutp[i].bufp,
+				xewtoh(layoutp[i].shdr->sh_offset), size, fn) != size)
+				goto bad;
+
+			/* set symbol table */
+			if (layoutp[i].shdr == symtabshdr)
+				symtabp = layoutp[i].bufp;
+			/* set string table */
+			else if (layoutp[i].shdr == strtabshdr)
+				strtabp = layoutp[i].bufp;
+		}
+	}
 
 	nstrtab_size = 256;
 	nstrtabp = xmalloc(nstrtab_size, fn, "new string table");
@@ -366,26 +421,68 @@ ELFNAMEEND(hide)(int fd, const char *fn)
 	strtabshdr->sh_size = htoxew(nstrtab_nextoff);
 
 	/*
-	 * write new tables to the file
+	 * update section header table in ascending order of offset
 	 */
-	if (xwriteatoff(fd, shdrp, xewtoh(ehdr.e_shoff), shdrsize, fn) !=
-	    shdrsize)
-		goto bad;
-	if (xwriteatoff(fd, symtabp, xewtoh(symtabshdr->sh_offset),
-	    xewtoh(symtabshdr->sh_size), fn) != xewtoh(symtabshdr->sh_size))
-		goto bad;
-	/* write new symbol table strings */
-	if ((size_t)xwriteatoff(fd, nstrtabp, xewtoh(strtabshdr->sh_offset),
-	    xewtoh(strtabshdr->sh_size), fn) != xewtoh(strtabshdr->sh_size))
-		goto bad;
+	for (i = 0; layoutp[i].shdr != strtabshdr; i++)
+		;
+	for (; i < xe16toh(ehdr.e_shnum) + 1; i++) {
+		Elf_Off off, align;
+		off = xewtoh(layoutp[i - 1].shdr->sh_offset) +
+			xewtoh(layoutp[i - 1].shdr->sh_size);
+		align = xewtoh(layoutp[i].shdr->sh_addralign);
+		off = (off + (align - 1)) & ~(Elf_Off)(align - 1);
+		layoutp[i].shdr->sh_offset = htoxew(off);
+	}
+
+	/*
+	 * write data to the file in descending order of offset
+	 */
+	for (i = xe16toh(ehdr.e_shnum); i >= 0; i--) {
+		static int strtabidx = INT_MIN;
+		void *buf;
+		size_t size;
+
+		if (layoutp[i].shdr == strtabshdr) {
+			strtabidx = i;
+			/* new string table */
+			buf = nstrtabp;
+		} else
+			buf = layoutp[i].bufp;
+
+		if (layoutp[i].shdr == &shdrshdr ||
+			layoutp[i].shdr == symtabshdr || i >= strtabidx) {
+			if (buf == NULL)
+				goto bad;
+
+			if (layoutp[i].shdr == &shdrshdr) {
+				/* 
+				 * update elf header if the offset of section header
+				 * table is changed.
+				 */
+				if (ehdr.e_shoff != shdrshdr.sh_offset) {
+					ehdr.e_shoff = shdrshdr.sh_offset;
+					if (xwriteatoff(fd, &ehdr, 0, sizeof ehdr, fn)
+						!= sizeof ehdr)
+						goto bad;
+				}
+			}
+
+			size = xewtoh(layoutp[i].shdr->sh_size);
+			if (xwriteatoff(fd, buf, xewtoh(layoutp[i].shdr->sh_offset),
+				size, fn) != size)
+				goto bad;
+		}
+	}
 
 out:
-	if (shdrp != NULL)
-		free(shdrp);
-	if (symtabp != NULL)
-		free(symtabp);
-	if (strtabp != NULL)
-		free(strtabp);
+	if (layoutp != NULL) {
+		for (i = 0; i < xe16toh(ehdr.e_shnum) + 1; i++)
+			if (layoutp[i].bufp != NULL)
+				free(layoutp[i].bufp);
+		free(layoutp);
+	}
+	if (nstrtabp != NULL)
+		free(nstrtabp);
 	return (rv);
 
 bad:


>Release-Note:
>Audit-Trail:

From: pete <petechou@gmail.com>
To: bug-followup@freebsd.org
Cc:  
Subject: Re: bin/174011: [patch] crunchide support non-custom elf object layout
Date: Fri, 30 Nov 2012 16:43:39 +0800

 --bcaec554d1fe41f37804cfb267f5
 Content-Type: multipart/alternative; boundary=bcaec554d1fe41f36e04cfb267f3
 
 --bcaec554d1fe41f36e04cfb267f3
 Content-Type: text/plain; charset=ISO-8859-1
 
 Attached the test case files.
 
 Thanks,
 Pete
 
 --bcaec554d1fe41f36e04cfb267f3
 Content-Type: text/html; charset=ISO-8859-1
 
 Attached the test case files.<br><br clear="all">Thanks,<div>Pete</div><br>
 
 --bcaec554d1fe41f36e04cfb267f3--
 --bcaec554d1fe41f37804cfb267f5
 Content-Type: application/octet-stream; name="cat_stub.o"
 Content-Disposition: attachment; filename="cat_stub.o"
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_ha52e4750
 
 f0VMRgEBAQkAAAAAAAAAAAEAAwABAAAAAAAAAAAAAADEAAAAAAAAADQAAAAAACgACgAHAAAAAAAA
 AAAAAAAAAFWJ5V3p/P///wAAAABHQ0M6IChHTlUpIDQuMi4xIDIwMDcwODMxIHBhdGNoZWQgW0Zy
 ZWVCU0RdAAAuc3ltdGFiAC5zdHJ0YWIALnNoc3RydGFiAC5yZWwudGV4dAAuZGF0YQAuYnNzAC5j
 b21tZW50AC5ub3RlLkdOVS1zdGFjawAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAfAAAAAQAAAAYAAAAAAAAAQAAAAAkAAAAAAAAAAAAAABAAAAAAAAAAGwAAAAkAAAAA
 AAAAAAAAAAgDAAAIAAAACAAAAAEAAAAEAAAACAAAACUAAAABAAAAAwAAAAAAAABMAAAAAAAAAAAA
 AAAAAAAABAAAAAAAAAArAAAACAAAAAMAAAAAAAAATAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAMAAA
 AAEAAAAAAAAAAAAAAEwAAAAtAAAAAAAAAAAAAAABAAAAAAAAADkAAAABAAAAAAAAAAAAAAB5AAAA
 AAAAAAAAAAAAAAAAAQAAAAAAAAARAAAAAwAAAAAAAAAAAAAAeQAAAEkAAAAAAAAAAAAAAAEAAAAA
 AAAAAQAAAAIAAAAAAAAAAAAAAFQCAACQAAAACQAAAAcAAAAEAAAAEAAAAAkAAAADAAAAAAAAAAAA
 AADkAgAAJAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAABADx
 /wAAAAAAAAAAAAAAAAMAAQAAAAAAAAAAAAAAAAADAAMAAAAAAAAAAAAAAAAAAwAEAAAAAAAAAAAA
 AAAAAAMABgAAAAAAAAAAAAAAAAADAAUADAAAAAAAAAAJAAAAEgABAB8AAAAAAAAAAAAAABAAAAAA
 Y2F0X3N0dWIuYwBfY3J1bmNoZWRfY2F0X3N0dWIAbWFpbgAFAAAAAggAAA==
 --bcaec554d1fe41f37804cfb267f5
 Content-Type: application/octet-stream; name="cat.o"
 Content-Disposition: attachment; filename="cat.o"
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_ha52e8cx1
 
 f0VMRgEBAQkAAAAAAAAAAAEAAwABAAAAAAAAAAAAAADYDgAAAAAAADQAAAAAACgADgALAAAAAAAA
 AAAAAAAAAFWJ5VeJx1ZTg+wcOwUAAAAAD4R0BgAAix0AAAAAvgoAAADHRewAAAAAx0XwAAAAAIXb
 D4UqAQAAi0cEg+gBhcCJRwQPiPIDAACLBw+2GIPAAYkHg/v/D4QZAQAAg/4KD4RcAQAAg/sKD4TT
 AQAAg/sJD4Q5AgAAoQAAAACFwA+EkwAAAPfDgP///3R7hdt4GDsdAAAAAH0QoQAAAAD2RJg2BA+F
 oAIAAKEAAAAAhcAPhTIEAACLFQAAAACLQgiD6AGFwIlCCA+IDQUAAIsCxgBNg8ABiQKhAAAAAIXA
 D4UvBAAAixUAAAAAi0IIg+gBhcCJQggPiAoFAACLAsYALYPAAYkCg+N/hdt4DDsdAAAAAA+MLAIA
 AIs1AAAAAIX2D4VrAQAAixUAAAAAi0IIg+gBhcCJQggPiOYBAACLAg+2y4gYg8ABiQKDwQEPlMCE
 wHUjid6LHQAAAACF2w+E1v7//4k8JOj8////icOD+/8Phef+//+LDQAAAACFyQ+FTQIAAA+/RwzB
 6AaD4AGEwA+FUAIAAKEAAAAAhcAPhYICAAChAAAAAA+/QAzB6AaD4AGEwA+FYgUAAIPEHFteX13D
 oQAAAACFwHQQg/sKD4StAgAAx0XsAAAAAKEAAAAAhcAPhH7+//+hAAAAAIXAD4VWAgAAg0XwAYtF
 8MdEJAQAAAAAiUQkCKEAAAAAiQQk6Pz///+hAAAAAIXAD4UyBAAAoQAAAAAPv0AMwegGg+ABhMAP
 hT3///+D+woPhS3+//+hAAAAAIXAD4TJ/v//izUAAAAAhfYPhfwBAACLFQAAAACLQgiD6AGFwIlC
 CA+I8gIAAIsCxgAkizUAAAAAg8ABiQKF9g+Emv7//5CNdCYAoQAAAACJHCSJRCQE6Pz///+DwAEP
 lMDpov7//410JgCLDQAAAACFyQ+EWf7//4sVAAAAAIXSD4XLAQAAixUAAAAAi0IIg+gBhcCJQggP
 iKYCAACLAsYAXoPAAYkCoQAAAACFwA+FyAEAAIsVAAAAAItCCIPoAYXAiUIID4ifAgAAiwKJ3sYA
 SYPAAYkC6TL+//87Qhh8CYD7Cg+FDP7//4lUJASJHCTo/P///4nB6QX+//+hAAAAAPZEmDUCD4TE
 /f//oQAAAACFwA+F0AIAAIsVAAAAAItCCIPoAYXAiUIID4hJAwAAiwLGAF6DwAGJAqEAAAAAhcAP
 hacBAACD+3+LFQAAAAC5PwAAAHQFidmDyUCLQgiD6AGFwIlCCA+ItgIAAIsCiAiDwAEPtsmJAoPB
 AQ+ErP3//4ne6YT9//+JPCTo/P///4XAD5XAhMAPhLD9//+hAAAAAMcEJAUAAACJRCQE6Pz///+L
 FQAAAADHBQAAAAABAAAAhdIPhdUCAAChAAAAAGaDZwyfhcAPhH79//+hAAAAAIkEJOj8////hcAP
 lcDpdv3//4k8JOj8////icPpCfz//4P7Cg+Fof3//+np/f//oQAAAADHBCQkAAAAiUQkBOj8////
 g8ABD5TAhMAPhJz8///p9fz//4tF7IXAD4XH/P//x0XsAQAAAOlD/f//oQAAAADHBCReAAAAiUQk
 BOj8////g8ABD4TA/P//oQAAAACFwA+EOP7//6EAAAAAxwQkSQAAAIlEJATo/P///4PAAQ+Elfz/
 /4ne6W38//+hAAAAAMcEJE0AAACJRCQE6Pz///+DwAEPhHD8//+hAAAAAIXAD4TR+///oQAAAADH
 BCQtAAAAiUQkBOj8////g8ABD4XU+///6UD8//+D+3+hAAAAALo/AAAAdAWJ2oPKQIlEJASJFCTo
 /P///4PAAQ+EF/z//4ne6e/7//87QhgPjQX9//+JVCQExwQkJAAAAOj8////g8ABD5TA6er+//87
 QhgPjVH9//+JVCQExwQkXgAAAOj8////g8ABD4VC/f//6cX7//87QhgPjVj9//+JVCQExwQkSQAA
 AOj8////g8ABD4Sj+///id7pe/v//ztCGI10JgAPjeb6//+JVCQExwQkTQAAAOj8////g8ABD4XX
 +v//6XH7//87QhgPje36//+JVCQExwQkLQAAAOj8////g8ABD4Xe+v//6Ur7//+QjXQmAKEAAAAA
 xwQkXgAAAIlEJATo/P///4PAAQ+FM/3//+ki+///oQAAAACJBCTo/P///4XAD5XA6cb7//87Qhh8
 CYD5Cg+FPP3//4kMJIlUJATo/P///4nB6TX9//+LDQAAAACFyXVlD79ADMHoBYPgAYTAD4Rw+f//
 ixUAAAAAhdJ1WKEAAAAAZoNgDJ/pV/n//ztCGA+Nrvz//4lUJATHBCReAAAA6Pz///+DwAEPhZ/8
 ///pjvr//4k8JI22AAAAAOj8////6Zv6//+JBCTo/P///4XAD5XA65ahAAAAAIkEJOj8////6fz4
 ///HRCQECAAAAMcEJAEAAADo/P///5BVieVXVlOB7PwAAACJhRT///+hAAAAAIlF8DHAiZUQ////
 x4UY////AAAAAIuFGP///4uVFP///4sEgoXAiYUc////D4QNAQAAi7Uc////vw8AAAC5AgAAAPzz
 pg+FKwEAAMcFAAAAABEAAADHhSD///8AAAAAi4UQ////hcB0TYuFIP///4XAD4TwAAAAi4Ug////
 x0QkBBcAAACJBCTo/P///4nD6CX4//+JHCTo/P///4u1HP///4X2D4SjAAAAg4UY////Aelf////
 oQAAAACFwA+FPQEAAKEAAAAAD794DqEAAAAAhcAPhEMBAAChBAAAAIlEJAihAAAAAIlEJASLhSD/
 //+JBCTo/P///4P4AInDD47VAAAAMfbrB5Apw3TMAcaJ8AMFAAAAAIlcJAiJPCSJRCQE6Pz///+F
 wHnex0QkBAgAAADHBCQBAAAA6Pz///+LnRj///+F2w+E/v7//4tF8DMFAAAAAA+FGwIAAIHE/AAA
 AFteX13DoQAAAADoSPf//+km////i5Uc////x0QkBAAAAACJFQAAAACJFCTo/P///4XAiYUg////
 D4m//v//6Pz///+DOC0PhBkBAACLlRz////HBCQFAAAAiVQkBOj8////xwUAAAAAAQAAAOnX/v//
 jbYAAAAAD4x0AQAAi70g////hf8PhK/+//+LlSD///+JFCTo/P///+mc/v//oQAAAACJBCTo/P//
 /4nHoQAAAACFwA+Fvf7//42VJP///4lUJASJPCTo/P///4XAD4WYAQAAD7eFLP///yUA8AAAPQCA
 AAB0U4udZP///8cEJC8AAADo/P///znDD4bfAAAAi4Vk////owQAAAChBAAAAIkEJOj8////hcCj
 AAAAAA+FUf7//8dEJAQZAAAAxwQkAQAAAOj8////xwQkeQAAAOj8////PQGAAAAPncAPtsCD6AEl
 AADy/wUAABAAowQAAADrp41FhsdEJAhqAAAAx0QkBAAAAACJBCTo/P///8dEJAgAAAAAx0QkBAEA
 AADHBCQBAAAA6Pz///+FwImFIP///w+Iov7//4uVHP///41FiMZFhwHHRCQIaAAAAIkEJIlUJATo
 /P///4P4Z3ZK6Pz////HAD8AAADpbP7//8cEJC8AAADo/P///+kW////oQAAAADHBCQFAAAAiUQk
 BOj8////xwUAAAAAAQAAAOlo/v//6Pz///+LlSD///+DwAOJRCQIjUWGiUQkBIkUJOj8////hcB4
 T4uVIP///8dEJAQBAAAAiRQk6Pz///+DwAEPhaT8///HBCQAAAAA6Pz///9mkOmR/P//oQAAAADH
 RCQEBQAAAMcEJAEAAACJRCQI6Pz///+LhSD///+JBCTo/P///+mw/f//jXQmAI28JwAAAACNTCQE
 g+Tw/3H8VYnlVlNRg+wcizGLWQTHRCQENwAAAMcEJAIAAADo/P///410JgDHRCQIOAAAAIlcJASJ
 NCTo/P///4P4/w+EzAAAAIPoYoP4FHYxoQAAAADHRCQIIQAAAMdEJAQBAAAAxwQkAAAAAIlEJAzo
 /P///8cEJAEAAADo/P////8khQAAAADHBQAAAAABAAAA65ehAAAAAMdEJAQAAAAAiQQk6Pz////r
 gMcFAAAAAAEAAADHBQAAAAABAAAA6Wf////HBQAAAAABAAAA6Vj////HBQAAAAABAAAA6Un////H
 BQAAAAABAAAAxwUAAAAAAQAAAOkw////xwUAAAAAAQAAAMcFAAAAAAEAAADpF////4sNAAAAAKEA
 AAAAhcmNBIN1CosVAAAAAIXSdC+6AQAAAOih+v//oQAAAACJBCTo/P///4XAdEXHRCQECAAAAMcE
 JAEAAADo/P///4s1AAAAAIX2dceLHQAAAACF23W9iw0AAAAAhcl1s4sVAAAAAIXSdakx0uhN+v//
 66qhAAAAAIkEJOj8////AAAAJEZyZWVCU0Q6IHJlbGVhc2UvOS4wLjAvYmluL2NhdC9jYXQuYyAx
 ODQ0NzEgMjAwOC0xMC0zMCAxNDowNTo1N1ogaXZvcmFzICQAR0NDOiAoR05VKSA0LjIuMSAyMDA3
 MDgzMSBwYXRjaGVkIFtGcmVlQlNEXQAlNmQJACVzAHN0ZG91dAAtAHN0ZGluAHIAbWFsbG9jKCkg
 ZmFpbHVyZSBvZiBJTyBidWZmZXIAAGJlbnN0dXYAdXNhZ2U6IGNhdCBbLWJlbnN0dXZdIFtmaWxl
 IC4uLl0KAAAAUAwAAKULAAClCwAANwwAAKULAAClCwAApQsAAKULAAClCwAApQsAAKULAAClCwAA
 KAwAAKULAAClCwAApQsAAKULAAAZDAAAAAwAAOkLAADdCwAAAC5zeW10YWIALnN0cnRhYgAuc2hz
 dHJ0YWIALnJlbC50ZXh0AC5kYXRhAC5ic3MALmNvbW1lbnQALnJvZGF0YS5zdHIxLjEALnJvZGF0
 YS5zdHIxLjQALnJlbC5yb2RhdGEALm5vdGUuR05VLXN0YWNrAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAEAAAAGAAAAAAAAAEAAAADyDAAAAAAAAAAAAAAQAAAA
 AAAAABsAAAAJAAAAAAAAAAAAAACoFgAAeAUAAAwAAAABAAAABAAAAAgAAAAlAAAAAQAAAAMAAAAA
 AAAANA0AAAAAAAAAAAAAAAAAAAQAAAAAAAAAKwAAAAgAAAADAAAAAAAAADQNAAAIAAAAAAAAAAAA
 AAAEAAAAAAAAADAAAAABAAAAAAAAAAAAAAA0DQAAeAAAAAAAAAAAAAAAAQAAAAAAAAA5AAAAAQAA
 ADIAAAAAAAAArA0AAEAAAAAAAAAAAAAAAAEAAAABAAAASAAAAAEAAAAyAAAAAAAAAOwNAAAiAAAA
 AAAAAAAAAAAEAAAAAQAAAFsAAAABAAAAAgAAAAAAAAAQDgAAVAAAAAAAAAAAAAAABAAAAAAAAABX
 AAAACQAAAAAAAAAAAAAAIBwAAKgAAAAMAAAACAAAAAQAAAAIAAAAYwAAAAEAAAAAAAAAAAAAAGQO
 AAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAAADAAAAAAAAAAAAAABkDgAAcwAAAAAAAAAAAAAAAQAA
 AAAAAAABAAAAAgAAAAAAAAAAAAAACBEAAPADAAANAAAADgAAAAQAAAAQAAAACQAAAAMAAAAAAAAA
 AAAAAPgUAACtAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAE
 APH/AAAAAAAAAAAAAAAAAwABAAAAAAAAAAAAAAAAAAMAAwAAAAAAAAAAAAAAAAADAAQAAAAAAAAA
 AAAAAAAAAwAGAAcAAAAAAAAALwcAAAIAAQAQAAAAMAcAABUEAAACAAEAGgAAAAAAAAAEAAAAAQAE
 ACMAAAAEAAAABAAAAAEABAAAAAAAAAAAAAAAAAADAAcAAAAAAAAAAAAAAAAAAwAIAAAAAAAAAAAA
 AAAAAAMACgAAAAAAAAAAAAAAAAADAAUALgAAAAAAAAAAAAAAEAAAADcAAAAAAAAAAAAAABAAAABE
 AAAABAAAAAQAAAARAPL/SgAAAAAAAAAAAAAAEAAAAFgAAAAAAAAAAAAAABAAAABrAAAAAAAAAAAA
 AAAQAAAAdQAAAAAAAAAAAAAAEAAAAHoAAAAEAAAABAAAABEA8v+AAAAABAAAAAQAAAARAPL/hgAA
 AAQAAAAEAAAAEQDy/4wAAAAAAAAAAAAAABAAAACUAAAABAAAAAQAAAARAPL/mgAAAAAAAAAAAAAA
 EAAAAJ8AAAAEAAAABAAAABEA8v+lAAAAAAAAAAAAAAAQAAAArQAAAAAAAAAAAAAAEAAAALQAAAAE
 AAAABAAAABEA8v+9AAAAAAAAAAAAAAAQAAAAwgAAAAQAAAAEAAAAEQDy/8cAAAAAAAAAAAAAABAA
 AADPAAAAAAAAAAAAAAAQAAAA2AAAAAAAAAAAAAAAEAAAAN0AAAAAAAAAAAAAABAAAADhAAAAAAAA
 AAAAAAAQAAAA8wAAAAAAAAAAAAAAEAAAAPoAAAAAAAAAAAAAABAAAAABAQAAAAAAAAAAAAAQAAAA
 BgEAAAAAAAAAAAAAEAAAAAwBAAAAAAAAAAAAABAAAAARAQAAAAAAAAAAAAAQAAAAGQEAAAAAAAAA
 AAAAEAAAAB8BAAAAAAAAAAAAABAAAAAmAQAAAAAAAAAAAAAQAAAALAEAAAAAAAAAAAAAEAAAADQB
 AAAAAAAAAAAAABAAAAA7AQAAAAAAAAAAAAAQAAAAQgEAAAAAAAAAAAAAEAAAAEkBAAAAAAAAAAAA
 ABAAAABRAQAAAAAAAAAAAAAQAAAAYgEAAAAAAAAAAAAAEAAAAGoBAAAAAAAAAAAAABAAAABzAQAA
 UAsAAKIBAAASAAEAeAEAAAAAAAAAAAAAEAAAAIIBAAAAAAAAAAAAABAAAACJAQAAAAAAAAAAAAAQ
 AAAAkwEAAAAAAAAAAAAAEAAAAJoBAAAAAAAAAAAAABAAAACfAQAAAAAAAAAAAAAQAAAApgEAAAAA
 AAAAAAAAEAAAAABjYXQuYwBjb29rX2NhdABzY2FuZmlsZXMAYnVmLjQxNjAAYnNpemUuNDE1OQBf
 X3N0ZGlucABfX2lzdGhyZWFkZWQAdmZsYWcAX19tYl9zYl9saW1pdABfQ3VycmVudFJ1bmVMb2Nh
 bGUAX19zdGRvdXRwAGdldGMAc2ZsYWcAbmZsYWcAYmZsYWcAZnByaW50ZgBlZmxhZwBwdXRjAHRm
 bGFnAF9fc3didWYAZmVycm9yAGZpbGVuYW1lAHdhcm4AcnZhbABfX3NyZ2V0AGNsZWFyZXJyAGZl
 b2YAZXJyAF9fc3RhY2tfY2hrX2d1YXJkAGZkb3BlbgBmY2xvc2UAcmVhZAB3cml0ZQBvcGVuAF9f
 ZXJyb3IAY2xvc2UAZmlsZW5vAGZzdGF0AHN5c2NvbmYAbWFsbG9jAG1lbXNldABzb2NrZXQAc3Ry
 bGNweQBfX3N0YWNrX2Noa19mYWlsAGNvbm5lY3QAc2h1dGRvd24AbWFpbgBzZXRsb2NhbGUAZ2V0
 b3B0AF9fc3RkZXJycABmd3JpdGUAZXhpdABzZXRidWYAb3B0aW5kAAAAAA0AAAABDgAAGQAAAAEP
 AAB4AAAAARAAAJIAAAABEQAAmQAAAAESAACpAAAAAQ8AALcAAAABEwAA1wAAAAEPAADlAAAAARMA
 AA0BAAABEQAAGQEAAAEPAAAnAQAAARMAAFYBAAABDwAAZgEAAAIUAAB3AQAAAQ8AAJYBAAABDwAA
 owEAAAETAADCAQAAARUAANsBAAABFgAA6AEAAAEXAAD/AQAAAQUAAAgCAAABEwAAEAIAAAIYAAAV
 AgAAAQ8AACICAAABEwAAQgIAAAEZAABQAgAAAQ8AAF4CAAABEwAAegIAAAEPAACRAgAAARMAAJ0C
 AAACGgAAsgIAAAEbAADAAgAAAQ8AAM4CAAABEwAA7gIAAAEPAAD8AgAAARMAADgDAAACHAAARAMA
 AAESAABUAwAAAQ8AAGIDAAABEwAAggMAAAEPAACTAwAAARMAANQDAAACHQAA5gMAAAEeAADtAwAA
 AQUAAPYDAAACHwAA/AMAAAEPAAACBAAAASAAABMEAAABDwAAJQQAAAETAAAtBAAAAh0AAD8EAAAC
 IQAAWQQAAAETAABpBAAAAhoAAJgEAAABEwAAqAQAAAIaAAC2BAAAAQ8AAMMEAAABEwAA0wQAAAIa
 AADoBAAAARMAAPgEAAACGgAABgUAAAEPAAATBQAAARMAACMFAAACGgAAOQUAAAETAABRBQAAAhoA
 AHoFAAACHAAAngUAAAIcAADFBQAAAhwAAPIFAAACHAAAGQYAAAIcAAAxBgAAARMAAEEGAAACGgAA
 VAYAAAETAABcBgAAAh0AAIAGAAACHAAAjQYAAAEPAACpBgAAAQ8AALIGAAABDgAA1QYAAAIcAADx
 BgAAAiIAAP4GAAACIwAACgcAAAEOAAASBwAAAiIAAB8HAAABBQAAKwcAAAIkAABDBwAAASUAAIAH
 AAABBQAAlAcAAAEeAACYBwAAAQUAAMgHAAABBQAA0AcAAAImAADfBwAAAicAAP4HAAABDwAACwgA
 AAETAAAUCAAAAQQAACEIAAABBAAAKggAAAEEAAA8CAAAAigAAFoIAAABBAAAaggAAAIpAAB2CAAA
 AQUAAIIIAAACJAAAmQgAAAElAACvCAAAAQ4AAM0IAAABHgAA1QgAAAIqAADoCAAAAisAAP4IAAAB
 BQAABwkAAAIfAAANCQAAASAAAD4JAAACLAAASAkAAAETAABQCQAAAi0AAFcJAAABBAAAcQkAAAIu
 AACeCQAAAi8AALEJAAABBAAAtgkAAAEEAAC+CQAAAjAAAMUJAAABBAAA0wkAAAEFAADfCQAAAiQA
 AOsJAAACLwAACAoAAAEEAAAlCgAAAjEAAEEKAAACMgAAcAoAAAIzAAB6CgAAAisAAJEKAAACLwAA
 mwoAAAEeAACiCgAAAQUAAKsKAAACHwAAsQoAAAEgAAC/CgAAAjQAANsKAAACNQAA9QoAAAI2AAAK
 CwAAAh8AABYLAAABHgAAHgsAAAEFAAAuCwAAAiQAADwLAAACLAAAbAsAAAEFAAB4CwAAAjgAAIQL
 AAABBQAAkAsAAAI5AACmCwAAAToAAL0LAAABCgAAxgsAAAI7AADSCwAAAjwAANkLAAABCwAA3wsA
 AAEQAADqCwAAARMAAPoLAAACPQAAAgwAAAEQAAAMDAAAARsAABsMAAABFQAAKgwAAAEWAAA5DAAA
 ARAAAEMMAAABGQAAUgwAAAEWAABcDAAAARcAAGsMAAABFwAAcAwAAAE+AAB9DAAAARkAAJAMAAAB
 EwAAmAwAAAInAACkDAAAAQUAALAMAAACJAAAtgwAAAEWAADADAAAARUAAMoMAAABGwAA1AwAAAEQ
 AADmDAAAASAAAO4MAAACPAAAAAAAAAECAAAEAAAAAQIAAAgAAAABAgAADAAAAAECAAAQAAAAAQIA
 ABQAAAABAgAAGAAAAAECAAAcAAAAAQIAACAAAAABAgAAJAAAAAECAAAoAAAAAQIAACwAAAABAgAA
 MAAAAAECAAA0AAAAAQIAADgAAAABAgAAPAAAAAECAABAAAAAAQIAAEQAAAABAgAASAAAAAECAABM
 AAAAAQIAAFAAAAABAgAA
 --bcaec554d1fe41f37804cfb267f5--

From: pete <petechou@gmail.com>
To: bug-followup@freebsd.org
Cc:  
Subject: Re: bin/174011: [patch] crunchide support non-custom elf object layout
Date: Mon, 3 Dec 2012 18:29:33 +0800

 --f46d04016a757b39d004cff03ba1
 Content-Type: multipart/alternative; boundary=f46d04016a757b39c904cff03b9f
 
 --f46d04016a757b39c904cff03b9f
 Content-Type: text/plain; charset=ISO-8859-1
 
 Clean up style(9) nits.
 
 --f46d04016a757b39c904cff03b9f--
 --f46d04016a757b39d004cff03ba1
 Content-Type: text/plain; charset=US-ASCII; name="patch-2.txt"
 Content-Disposition: attachment; filename="patch-2.txt"
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_ha9g4gx50
 
 ZGlmZiAtLWdpdCBleGVjX2VsZjMyLmMgZXhlY19lbGYzMi5jCmluZGV4IDBlYWUzMWEuLjgyYzY2
 MDUgMTAwNjQ0Ci0tLSBleGVjX2VsZjMyLmMKKysrIGV4ZWNfZWxmMzIuYwpAQCAtNDUsNiArNDUs
 NyBAQCBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHJlbGVhc2UvOS4wLjAvdXNyLnNiaW4vY3J1bmNoL2Ny
 dW5jaGlkZS9leGVjX2VsZjMyLmMgMjExMjIyCiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIAogI2lu
 Y2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4K
 ICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTgyLDExICs4Myw5
 IEBAIF9fRkJTRElEKCIkRnJlZUJTRDogcmVsZWFzZS85LjAuMC91c3Iuc2Jpbi9jcnVuY2gvY3J1
 bmNoaWRlL2V4ZWNfZWxmMzIuYyAyMTEyMjIKICNkZWZpbmUJeGUzMnRvaCh4KQkoKGRhdGEgPT0g
 RUxGREFUQTJNU0IpID8gYmUzMnRvaCh4KSA6IGxlMzJ0b2goeCkpCiAjZGVmaW5lCWh0b3hlMzIo
 eCkJKChkYXRhID09IEVMRkRBVEEyTVNCKSA/IGh0b2JlMzIoeCkgOiBodG9sZTMyKHgpKQogCi1z
 dHJ1Y3QgbGlzdGVsZW0gewotCXN0cnVjdCBsaXN0ZWxlbSAqbmV4dDsKLQl2b2lkICptZW07Ci0J
 b2ZmX3QgZmlsZTsKLQlzaXplX3Qgc2l6ZTsKK3N0cnVjdCBzaGxheW91dCB7CisJRWxmX1NoZHIg
 KnNoZHI7CisJdm9pZAkqYnVmcDsKIH07CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC0yMzUsMTYgKzIz
 NCwxNyBAQCBpbnQKIEVMRk5BTUVFTkQoaGlkZSkoaW50IGZkLCBjb25zdCBjaGFyICpmbikKIHsK
 IAlFbGZfRWhkciBlaGRyOwotCUVsZl9TaGRyICpzaGRycCA9IE5VTEwsICpzeW10YWJzaGRyLCAq
 c3RydGFic2hkcjsKKwlzdHJ1Y3Qgc2hsYXlvdXQgKmxheW91dHA7CisJRWxmX1NoZHIgKnNoZHJw
 ID0gTlVMTCwgKnN5bXRhYnNoZHIsICpzdHJ0YWJzaGRyLCAqc2hzdHJ0YWJzaGRyOworCUVsZl9T
 aGRyIHNoZHJzaGRyOwogCUVsZl9TeW0gKnN5bXRhYnAgPSBOVUxMOwotCWNoYXIgKnN0cnRhYnAg
 PSBOVUxMOworCWNoYXIgKnNoc3RydGFicCA9IE5VTEwsICpzdHJ0YWJwID0gTlVMTDsKIAlFbGZf
 U2l6ZSAgbnN5bXMsIG5sb2NhbHN5bXMsIGV3aTsKIAlzc2l6ZV90IHNoZHJzaXplOwogCWludCBy
 diwgaSwgd2VpcmQ7CiAJc2l6ZV90IG5zdHJ0YWJfc2l6ZSwgbnN0cnRhYl9uZXh0b2ZmLCBmbl9z
 aXplOwogCWNoYXIgKm5zdHJ0YWJwID0gTlVMTDsKIAl1bnNpZ25lZCBjaGFyIGRhdGE7Ci0JRWxm
 X09mZiBtYXhvZmYsIHN0cm9mZjsKIAljb25zdCBjaGFyICp3ZWlyZHJlYXNvbiA9IE5VTEw7CiAK
 IAlydiA9IDA7CkBAIC0yNjAsNjIgKzI2MCwxMTUgQEAgRUxGTkFNRUVORChoaWRlKShpbnQgZmQs
 IGNvbnN0IGNoYXIgKmZuKQogCSAgICBzaGRyc2l6ZSkKIAkJZ290byBiYWQ7CiAKLQlzeW10YWJz
 aGRyID0gc3RydGFic2hkciA9IE5VTEw7CisJc3ltdGFic2hkciA9IHN0cnRhYnNoZHIgPSBzaHN0
 cnRhYnNoZHIgPSBOVUxMOwogCXdlaXJkID0gMDsKLQltYXhvZmYgPSBzdHJvZmYgPSAwOwogCWZv
 ciAoaSA9IDA7IGkgPCB4ZTE2dG9oKGVoZHIuZV9zaG51bSk7IGkrKykgewotCQlpZiAoeGV3dG9o
 KHNoZHJwW2ldLnNoX29mZnNldCkgPiBtYXhvZmYpCi0JCQltYXhvZmYgPSB4ZXd0b2goc2hkcnBb
 aV0uc2hfb2Zmc2V0KTsKIAkJc3dpdGNoICh4ZTMydG9oKHNoZHJwW2ldLnNoX3R5cGUpKSB7CiAJ
 CWNhc2UgU0hUX1NZTVRBQjoKIAkJCWlmIChzeW10YWJzaGRyICE9IE5VTEwpCiAJCQkJd2VpcmQg
 PSAxOwogCQkJc3ltdGFic2hkciA9ICZzaGRycFtpXTsKIAkJCXN0cnRhYnNoZHIgPSAmc2hkcnBb
 eGUzMnRvaChzaGRycFtpXS5zaF9saW5rKV07Ci0KLQkJCS8qIENoZWNrIHdoZXRoZXIgdGhlIHN0
 cmluZyB0YWJsZSBpcyB0aGUgbGFzdCBzZWN0aW9uICovCi0JCQlzdHJvZmYgPSB4ZXd0b2goc2hk
 cnBbeGUzMnRvaChzaGRycFtpXS5zaF9saW5rKV0uc2hfb2Zmc2V0KTsKLQkJCWlmICghd2VpcmQg
 JiYgeGUzMnRvaChzaGRycFtpXS5zaF9saW5rKSAhPSAoeGUxNnRvaChlaGRyLmVfc2hudW0pIC0g
 MSkpIHsKLQkJCQl3ZWlyZCA9IDE7Ci0JCQkJd2VpcmRyZWFzb24gPSAic3RyaW5nIHRhYmxlIG5v
 dCBsYXN0IHNlY3Rpb24iOwotCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0hUX1NUUlRBQjoKKwkJ
 CWlmIChpID09IHhlMTZ0b2goZWhkci5lX3Noc3RybmR4KSkKKwkJCQlzaHN0cnRhYnNoZHIgPSAm
 c2hkcnBbaV07CiAJCQlicmVhazsKIAkJfQogCX0KIAlpZiAoISB3ZWlyZHJlYXNvbikKIAkJd2Vp
 cmRyZWFzb24gPSAidW5zdXBwb3J0ZWQiOwotCWlmIChzeW10YWJzaGRyID09IE5VTEwpCi0JCWdv
 dG8gb3V0OwotCWlmIChzdHJ0YWJzaGRyID09IE5VTEwpCi0JCXdlaXJkID0gMTsKLQlpZiAoIXdl
 aXJkICYmIHN0cm9mZiAhPSBtYXhvZmYpIHsKKwlpZiAoc3ltdGFic2hkciA9PSBOVUxMIHx8IHN0
 cnRhYnNoZHIgPT0gTlVMTCB8fCBzaHN0cnRhYnNoZHIgPT0gTlVMTCkKIAkJd2VpcmQgPSAxOwot
 CQl3ZWlyZHJlYXNvbiA9ICJzdHJpbmcgdGFibGUgc2VjdGlvbiBub3QgbGFzdCBpbiBmaWxlIjsK
 LQl9ICAgCiAJaWYgKHdlaXJkKSB7CiAJCWZwcmludGYoc3RkZXJyLCAiJXM6IHdlaXJkIGV4ZWN1
 dGFibGUgKCVzKVxuIiwgZm4sIHdlaXJkcmVhc29uKTsKIAkJZ290byBiYWQ7CiAJfQogCiAJLyoK
 KwkgKiBzb3J0IHNlY3Rpb24gbGF5b3V0IHRhYmxlIGJ5IG9mZnNldAorCSAqLworCWxheW91dHAg
 PSB4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2hsYXlvdXQpICogKHhlMTZ0b2goZWhkci5lX3NobnVt
 KSArIDEpLAorCSAgICBmbiwgImxheW91dCB0YWJsZSIpOworCWlmIChsYXlvdXRwID09IE5VTEwp
 CisJCWdvdG8gYmFkOworCisJLyogYWRkIGEgcHNldWRvIGVudHJ5IHRvIHJlcHJlc2VudCB0aGUg
 c2VjdGlvbiBoZWFkZXIgdGFibGUgKi8KKwlzaGRyc2hkci5zaF9vZmZzZXQgPSBlaGRyLmVfc2hv
 ZmY7CisJc2hkcnNoZHIuc2hfc2l6ZSA9IGh0b3hldyhzaGRyc2l6ZSk7CisJc2hkcnNoZHIuc2hf
 YWRkcmFsaWduID0gaHRveGV3KEVMRlNJWkUgLyA4KTsKKwlsYXlvdXRwWzBdLnNoZHIgPSAmc2hk
 cnNoZHI7CisKKwkvKiBpbnNlcnQgYW5kIHNvcnQgbm9ybWFsIHNlY3Rpb24gaGVhZGVycyAqLwor
 CWZvciAoaSA9IDA7IGkgPCB4ZTE2dG9oKGVoZHIuZV9zaG51bSk7IGkrKykgeworCQlpbnQgbCA9
 IDAsIHIgPSBpLCBtOworCQl3aGlsZSAobCA8PSByKSB7CisJCQltID0gKCBsICsgcikgLyAyOwor
 CQkJaWYgKHhld3RvaChzaGRycFtpXS5zaF9vZmZzZXQpIDwKKwkJCSAgICB4ZXd0b2gobGF5b3V0
 cFttXS5zaGRyLT5zaF9vZmZzZXQpKQorCQkJCXIgPSBtIC0gMTsKKwkJCWVsc2UKKwkJCQlsID0g
 bSArIDE7CisJCX0KKworCQlpZiAobCAhPSBpICsgMSkgeworCQkJbWVtbW92ZSgmbGF5b3V0cFts
 ICsgMV0sICZsYXlvdXRwW2xdLAorCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2hsYXlvdXQpICogKGkg
 LSBsICsgMSkpOworCQl9CisKKwkJbGF5b3V0cFtsXS5zaGRyID0gJnNoZHJwW2ldOworCQlsYXlv
 dXRwW2xdLmJ1ZnAgPSBOVUxMOworCX0KKworCS8qCiAJICogbG9hZCB1cCBldmVyeXRoaW5nIHdl
 IG5lZWQKIAkgKi8KIAotCS8qIHN5bWJvbCB0YWJsZSAqLwotCWlmICgoc3ltdGFicCA9IHhtYWxs
 b2MoeGV3dG9oKHN5bXRhYnNoZHItPnNoX3NpemUpLCBmbiwgInN5bWJvbCB0YWJsZSIpKQotCSAg
 ICA9PSBOVUxMKQorCS8qIGxvYWQgc2VjdGlvbiBzdHJpbmcgdGFibGUgZm9yIGRlYnVnIHVzZSAq
 LworCWlmICgoc2hzdHJ0YWJwID0geG1hbGxvYyh4ZXd0b2goc2hzdHJ0YWJzaGRyLT5zaF9zaXpl
 KSwgZm4sCisJICAgICJzZWN0aW9uIHN0cmluZyB0YWJsZSIpKSA9PSBOVUxMKQogCQlnb3RvIGJh
 ZDsKLQlpZiAoeHJlYWRhdG9mZihmZCwgc3ltdGFicCwgeGV3dG9oKHN5bXRhYnNoZHItPnNoX29m
 ZnNldCksCi0JICAgIHhld3RvaChzeW10YWJzaGRyLT5zaF9zaXplKSwgZm4pICE9IHhld3RvaChz
 eW10YWJzaGRyLT5zaF9zaXplKSkKKwlpZiAoeHJlYWRhdG9mZihmZCwgc2hzdHJ0YWJwLCB4ZXd0
 b2goc2hzdHJ0YWJzaGRyLT5zaF9vZmZzZXQpLAorCSAgICB4ZXd0b2goc2hzdHJ0YWJzaGRyLT5z
 aF9zaXplKSwgZm4pICE9IHhld3RvaChzaHN0cnRhYnNoZHItPnNoX3NpemUpKQogCQlnb3RvIGJh
 ZDsKIAotCS8qIHN0cmluZyB0YWJsZSAqLwotCWlmICgoc3RydGFicCA9IHhtYWxsb2MoeGV3dG9o
 KHN0cnRhYnNoZHItPnNoX3NpemUpLCBmbiwgInN0cmluZyB0YWJsZSIpKQotCSAgICA9PSBOVUxM
 KQotCQlnb3RvIGJhZDsKLQlpZiAoeHJlYWRhdG9mZihmZCwgc3RydGFicCwgeGV3dG9oKHN0cnRh
 YnNoZHItPnNoX29mZnNldCksCi0JICAgIHhld3RvaChzdHJ0YWJzaGRyLT5zaF9zaXplKSwgZm4p
 ICE9IHhld3RvaChzdHJ0YWJzaGRyLT5zaF9zaXplKSkKLQkJZ290byBiYWQ7CisJLyogd2UgbmVl
 ZCBzeW10YWIsIHN0cnRhYiwgYW5kIGV2ZXJ5dGhpbmcgYmVoaW5kIHN0cnRhYiAqLworCWZvciAo
 aSA9IDA7IGkgPCB4ZTE2dG9oKGVoZHIuZV9zaG51bSkgKyAxOyBpKyspIHsKKwkJRWxmX09mZiBv
 ZmY7CisJCXNpemVfdCBzaXplOworCQlzdGF0aWMgaW50IHN0cnRhYmlkeCA9IElOVF9NQVg7CisK
 KwkJaWYgKGxheW91dHBbaV0uc2hkciA9PSAmc2hkcnNoZHIpIHsKKwkJCS8qIG5vdCBsb2FkIHNl
 Y3Rpb24gaGVhZGVyIGFnYWluICovCisJCQlsYXlvdXRwW2ldLmJ1ZnAgPSBzaGRycDsKKwkJCWNv
 bnRpbnVlOworCQl9CisJCWlmIChsYXlvdXRwW2ldLnNoZHIgPT0gc2hzdHJ0YWJzaGRyKSB7CisJ
 CQkvKiBub3QgbG9hZCBzZWN0aW9uIHN0cmluZyB0YWJsZSBhZ2FpbiAqLworCQkJbGF5b3V0cFtp
 XS5idWZwID0gc2hzdHJ0YWJwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobGF5b3V0cFtp
 XS5zaGRyID09IHN0cnRhYnNoZHIpCisJCQlzdHJ0YWJpZHggPSBpOworCQlpZiAobGF5b3V0cFtp
 XS5zaGRyID09IHN5bXRhYnNoZHIgfHwgaSA+PSBzdHJ0YWJpZHgpIHsKKwkJCW9mZiA9IHhld3Rv
 aChsYXlvdXRwW2ldLnNoZHItPnNoX29mZnNldCk7CisJCQlzaXplID0geGV3dG9oKGxheW91dHBb
 aV0uc2hkci0+c2hfc2l6ZSk7CisJCQlsYXlvdXRwW2ldLmJ1ZnAgPSB4bWFsbG9jKHNpemUsIGZu
 LAorCQkJICAgIHNoc3RydGFicCArIHhld3RvaChsYXlvdXRwW2ldLnNoZHItPnNoX25hbWUpKTsK
 KwkJCWlmIChsYXlvdXRwW2ldLmJ1ZnAgPT0gTlVMTCkKKwkJCQlnb3RvIGJhZDsKKwkJCWlmICh4
 cmVhZGF0b2ZmKGZkLCBsYXlvdXRwW2ldLmJ1ZnAsIG9mZiwgc2l6ZSwgZm4pICE9CisJCQkgICAg
 c2l6ZSkKKwkJCQlnb3RvIGJhZDsKKworCQkJLyogc2V0IHN5bWJvbCB0YWJsZSBhbmQgc3RyaW5n
 IHRhYmxlICovCisJCQlpZiAobGF5b3V0cFtpXS5zaGRyID09IHN5bXRhYnNoZHIpCisJCQkJc3lt
 dGFicCA9IGxheW91dHBbaV0uYnVmcDsKKwkJCWVsc2UgaWYgKGxheW91dHBbaV0uc2hkciA9PSBz
 dHJ0YWJzaGRyKQorCQkJCXN0cnRhYnAgPSBsYXlvdXRwW2ldLmJ1ZnA7CisJCX0KKwl9CiAKIAlu
 c3RydGFiX3NpemUgPSAyNTY7CiAJbnN0cnRhYnAgPSB4bWFsbG9jKG5zdHJ0YWJfc2l6ZSwgZm4s
 ICJuZXcgc3RyaW5nIHRhYmxlIik7CkBAIC0zNjYsMjYgKzQxOSw3MSBAQCBFTEZOQU1FRU5EKGhp
 ZGUpKGludCBmZCwgY29uc3QgY2hhciAqZm4pCiAJc3RydGFic2hkci0+c2hfc2l6ZSA9IGh0b3hl
 dyhuc3RydGFiX25leHRvZmYpOwogCiAJLyoKLQkgKiB3cml0ZSBuZXcgdGFibGVzIHRvIHRoZSBm
 aWxlCisJICogdXBkYXRlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluIGFzY2VuZGluZyBvcmRlciBv
 ZiBvZmZzZXQKIAkgKi8KLQlpZiAoeHdyaXRlYXRvZmYoZmQsIHNoZHJwLCB4ZXd0b2goZWhkci5l
 X3Nob2ZmKSwgc2hkcnNpemUsIGZuKSAhPQotCSAgICBzaGRyc2l6ZSkKLQkJZ290byBiYWQ7Ci0J
 aWYgKHh3cml0ZWF0b2ZmKGZkLCBzeW10YWJwLCB4ZXd0b2goc3ltdGFic2hkci0+c2hfb2Zmc2V0
 KSwKLQkgICAgeGV3dG9oKHN5bXRhYnNoZHItPnNoX3NpemUpLCBmbikgIT0geGV3dG9oKHN5bXRh
 YnNoZHItPnNoX3NpemUpKQotCQlnb3RvIGJhZDsKLQkvKiB3cml0ZSBuZXcgc3ltYm9sIHRhYmxl
 IHN0cmluZ3MgKi8KLQlpZiAoKHNpemVfdCl4d3JpdGVhdG9mZihmZCwgbnN0cnRhYnAsIHhld3Rv
 aChzdHJ0YWJzaGRyLT5zaF9vZmZzZXQpLAotCSAgICB4ZXd0b2goc3RydGFic2hkci0+c2hfc2l6
 ZSksIGZuKSAhPSB4ZXd0b2goc3RydGFic2hkci0+c2hfc2l6ZSkpCi0JCWdvdG8gYmFkOworCWZv
 ciAoaSA9IDA7IGxheW91dHBbaV0uc2hkciAhPSBzdHJ0YWJzaGRyOyBpKyspCisJCTsKKwlmb3Ig
 KDsgaSA8IHhlMTZ0b2goZWhkci5lX3NobnVtKSArIDE7IGkrKykgeworCQlFbGZfT2ZmIG9mZiwg
 YWxpZ247CisJCW9mZiA9IHhld3RvaChsYXlvdXRwW2kgLSAxXS5zaGRyLT5zaF9vZmZzZXQpICsK
 KwkJICAgIHhld3RvaChsYXlvdXRwW2kgLSAxXS5zaGRyLT5zaF9zaXplKTsKKwkJYWxpZ24gPSB4
 ZXd0b2gobGF5b3V0cFtpXS5zaGRyLT5zaF9hZGRyYWxpZ24pOworCQlvZmYgPSAob2ZmICsgKGFs
 aWduIC0gMSkpICYgfihhbGlnbiAtIDEpOworCQlsYXlvdXRwW2ldLnNoZHItPnNoX29mZnNldCA9
 IGh0b3hldyhvZmYpOworCX0KKworCS8qCisJICogd3JpdGUgZGF0YSB0byB0aGUgZmlsZSBpbiBk
 ZXNjZW5kaW5nIG9yZGVyIG9mIG9mZnNldAorCSAqLworCWZvciAoaSA9IHhlMTZ0b2goZWhkci5l
 X3NobnVtKTsgaSA+PSAwOyBpLS0pIHsKKwkJdm9pZCAqYnVmOworCQlFbGZfT2ZmIG9mZjsKKwkJ
 c2l6ZV90IHNpemU7CisJCXN0YXRpYyBpbnQgc3RydGFiaWR4ID0gSU5UX01JTjsKKworCQlpZiAo
 bGF5b3V0cFtpXS5zaGRyID09IHN0cnRhYnNoZHIpIHsKKwkJCXN0cnRhYmlkeCA9IGk7CisJCQkv
 KiBuZXcgc3RyaW5nIHRhYmxlICovCisJCQlidWYgPSBuc3RydGFicDsKKwkJfSBlbHNlCisJCQli
 dWYgPSBsYXlvdXRwW2ldLmJ1ZnA7CisKKwkJaWYgKGxheW91dHBbaV0uc2hkciA9PSAmc2hkcnNo
 ZHIgfHwKKwkJICAgIGxheW91dHBbaV0uc2hkciA9PSBzeW10YWJzaGRyIHx8IGkgPj0gc3RydGFi
 aWR4KSB7CisJCQlpZiAoYnVmID09IE5VTEwpCisJCQkJZ290byBiYWQ7CisKKwkJCS8qIAorCQkJ
 ICogdXBkYXRlIHRoZSBvZmZzZXQgb2Ygc2VjdGlvbiBoZWFkZXIgdGFibGUgaW4gZWxmCisJCQkg
 KiBoZWFkZXIgaWYgbmVlZGVkLgorCQkJICovCisJCQlpZiAobGF5b3V0cFtpXS5zaGRyID09ICZz
 aGRyc2hkciAmJgorCQkJICAgIGVoZHIuZV9zaG9mZiAhPSBzaGRyc2hkci5zaF9vZmZzZXQpIHsK
 KwkJCQllaGRyLmVfc2hvZmYgPSBzaGRyc2hkci5zaF9vZmZzZXQ7CisJCQkJb2ZmID0gKEVMRlNJ
 WkUgPT0gMzIpID8gMzIgOiA0NDsKKwkJCQlzaXplID0gc2l6ZW9mKEVsZl9PZmYpOworCQkJCWlm
 ICh4d3JpdGVhdG9mZihmZCwgJmVoZHIuZV9zaG9mZiwgb2ZmLCBzaXplLAorCQkJCSAgICBmbikg
 IT0gc2l6ZSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisKKwkJCW9mZiA9IHhld3RvaChsYXlvdXRw
 W2ldLnNoZHItPnNoX29mZnNldCk7CisJCQlzaXplID0geGV3dG9oKGxheW91dHBbaV0uc2hkci0+
 c2hfc2l6ZSk7CisJCQlpZiAoeHdyaXRlYXRvZmYoZmQsIGJ1Ziwgb2ZmLCBzaXplLCBmbikgIT0g
 c2l6ZSkKKwkJCQlnb3RvIGJhZDsKKwkJfQorCX0KIAogb3V0OgotCWlmIChzaGRycCAhPSBOVUxM
 KQotCQlmcmVlKHNoZHJwKTsKLQlpZiAoc3ltdGFicCAhPSBOVUxMKQotCQlmcmVlKHN5bXRhYnAp
 OwotCWlmIChzdHJ0YWJwICE9IE5VTEwpCi0JCWZyZWUoc3RydGFicCk7CisJaWYgKGxheW91dHAg
 IT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgeGUxNnRvaChlaGRyLmVfc2hudW0pICsgMTsg
 aSsrKSB7CisJCQlpZiAobGF5b3V0cFtpXS5idWZwICE9IE5VTEwpCisJCQkJZnJlZShsYXlvdXRw
 W2ldLmJ1ZnApOworCQl9CisJCWZyZWUobGF5b3V0cCk7CisJfQorCWlmIChuc3RydGFicCAhPSBO
 VUxMKQorCQlmcmVlKG5zdHJ0YWJwKTsKIAlyZXR1cm4gKHJ2KTsKIAogYmFkOgo=
 --f46d04016a757b39d004cff03ba1--

From: pete <petechou@gmail.com>
To: bug-followup@freebsd.org
Cc:  
Subject: Re: bin/174011: [patch] crunchide support non-custom elf object layout
Date: Mon, 3 Dec 2012 21:23:53 +0800

 --bcaec554d9d6e871af04cff2aaac
 Content-Type: multipart/alternative; boundary=bcaec554d9d6e871a704cff2aaaa
 
 --bcaec554d9d6e871a704cff2aaaa
 Content-Type: text/plain; charset=ISO-8859-1
 
 Update the patch against HEAD
 
 --bcaec554d9d6e871a704cff2aaaa--
 --bcaec554d9d6e871af04cff2aaac
 Content-Type: text/plain; charset=US-ASCII; name="patch-3.txt"
 Content-Disposition: attachment; filename="patch-3.txt"
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_ha9mommj0
 
 SW5kZXg6IGV4ZWNfZWxmMzIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBleGVjX2VsZjMyLmMJKHJldmlzaW9u
 IDI0MzgwOCkKKysrIGV4ZWNfZWxmMzIuYwkod29ya2luZyBjb3B5KQpAQCAtNDUsNiArNDUsNyBA
 QAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUg
 PGxpbWl0cy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5j
 bHVkZSA8c3RyaW5nLmg+CkBAIC04MiwxMSArODMsOSBAQAogI2RlZmluZQl4ZTMydG9oKHgpCSgo
 ZGF0YSA9PSBFTEZEQVRBMk1TQikgPyBiZTMydG9oKHgpIDogbGUzMnRvaCh4KSkKICNkZWZpbmUJ
 aHRveGUzMih4KQkoKGRhdGEgPT0gRUxGREFUQTJNU0IpID8gaHRvYmUzMih4KSA6IGh0b2xlMzIo
 eCkpCiAKLXN0cnVjdCBsaXN0ZWxlbSB7Ci0Jc3RydWN0IGxpc3RlbGVtICpuZXh0OwotCXZvaWQg
 Km1lbTsKLQlvZmZfdCBmaWxlOwotCXNpemVfdCBzaXplOworc3RydWN0IHNobGF5b3V0IHsKKwlF
 bGZfU2hkciAqc2hkcjsKKwl2b2lkCSpidWZwOwogfTsKIAogc3RhdGljIHNzaXplX3QKQEAgLTIz
 NSwxNiArMjM0LDE3IEBACiBFTEZOQU1FRU5EKGhpZGUpKGludCBmZCwgY29uc3QgY2hhciAqZm4p
 CiB7CiAJRWxmX0VoZHIgZWhkcjsKLQlFbGZfU2hkciAqc2hkcnAgPSBOVUxMLCAqc3ltdGFic2hk
 ciwgKnN0cnRhYnNoZHI7CisJc3RydWN0IHNobGF5b3V0ICpsYXlvdXRwOworCUVsZl9TaGRyICpz
 aGRycCA9IE5VTEwsICpzeW10YWJzaGRyLCAqc3RydGFic2hkciwgKnNoc3RydGFic2hkcjsKKwlF
 bGZfU2hkciBzaGRyc2hkcjsKIAlFbGZfU3ltICpzeW10YWJwID0gTlVMTDsKLQljaGFyICpzdHJ0
 YWJwID0gTlVMTDsKKwljaGFyICpzaHN0cnRhYnAgPSBOVUxMLCAqc3RydGFicCA9IE5VTEw7CiAJ
 RWxmX1NpemUgIG5zeW1zLCBld2k7CiAJc3NpemVfdCBzaGRyc2l6ZTsKIAlpbnQgcnYsIGksIHdl
 aXJkOwogCXNpemVfdCBuc3RydGFiX3NpemUsIG5zdHJ0YWJfbmV4dG9mZiwgZm5fc2l6ZTsKIAlj
 aGFyICpuc3RydGFicCA9IE5VTEw7CiAJdW5zaWduZWQgY2hhciBkYXRhOwotCUVsZl9PZmYgbWF4
 b2ZmLCBzdHJvZmY7CiAJY29uc3QgY2hhciAqd2VpcmRyZWFzb24gPSBOVUxMOwogCiAJcnYgPSAw
 OwpAQCAtMjYwLDYzICsyNjAsMTE2IEBACiAJICAgIHNoZHJzaXplKQogCQlnb3RvIGJhZDsKIAot
 CXN5bXRhYnNoZHIgPSBzdHJ0YWJzaGRyID0gTlVMTDsKKwlzeW10YWJzaGRyID0gc3RydGFic2hk
 ciA9IHNoc3RydGFic2hkciA9IE5VTEw7CiAJd2VpcmQgPSAwOwotCW1heG9mZiA9IHN0cm9mZiA9
 IDA7CiAJZm9yIChpID0gMDsgaSA8IHhlMTZ0b2goZWhkci5lX3NobnVtKTsgaSsrKSB7Ci0JCWlm
 ICh4ZXd0b2goc2hkcnBbaV0uc2hfb2Zmc2V0KSA+IG1heG9mZikKLQkJCW1heG9mZiA9IHhld3Rv
 aChzaGRycFtpXS5zaF9vZmZzZXQpOwogCQlzd2l0Y2ggKHhlMzJ0b2goc2hkcnBbaV0uc2hfdHlw
 ZSkpIHsKIAkJY2FzZSBTSFRfU1lNVEFCOgogCQkJaWYgKHN5bXRhYnNoZHIgIT0gTlVMTCkKIAkJ
 CQl3ZWlyZCA9IDE7CiAJCQlzeW10YWJzaGRyID0gJnNoZHJwW2ldOwogCQkJc3RydGFic2hkciA9
 ICZzaGRycFt4ZTMydG9oKHNoZHJwW2ldLnNoX2xpbmspXTsKLQotCQkJLyogQ2hlY2sgd2hldGhl
 ciB0aGUgc3RyaW5nIHRhYmxlIGlzIHRoZSBsYXN0IHNlY3Rpb24gKi8KLQkJCXN0cm9mZiA9IHhl
 d3RvaChzaGRycFt4ZTMydG9oKHNoZHJwW2ldLnNoX2xpbmspXS5zaF9vZmZzZXQpOwotCQkJaWYg
 KCF3ZWlyZCAmJiB4ZTMydG9oKHNoZHJwW2ldLnNoX2xpbmspICE9ICh4ZTE2dG9oKGVoZHIuZV9z
 aG51bSkgLSAxKSkgewotCQkJCXdlaXJkID0gMTsKLQkJCQl3ZWlyZHJlYXNvbiA9ICJzdHJpbmcg
 dGFibGUgbm90IGxhc3Qgc2VjdGlvbiI7Ci0JCQl9CiAJCQlicmVhazsKKwkJY2FzZSBTSFRfU1RS
 VEFCOgorCQkJaWYgKGkgPT0geGUxNnRvaChlaGRyLmVfc2hzdHJuZHgpKQorCQkJCXNoc3RydGFi
 c2hkciA9ICZzaGRycFtpXTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCWlmICghIHdlaXJkcmVhc29u
 KQogCQl3ZWlyZHJlYXNvbiA9ICJ1bnN1cHBvcnRlZCI7Ci0JaWYgKHN5bXRhYnNoZHIgPT0gTlVM
 TCkKLQkJZ290byBvdXQ7Ci0JaWYgKHN0cnRhYnNoZHIgPT0gTlVMTCkKKwlpZiAoc3ltdGFic2hk
 ciA9PSBOVUxMIHx8IHN0cnRhYnNoZHIgPT0gTlVMTCB8fCBzaHN0cnRhYnNoZHIgPT0gTlVMTCkK
 IAkJd2VpcmQgPSAxOwotCWlmICghd2VpcmQgJiYgc3Ryb2ZmICE9IG1heG9mZikgewotCQl3ZWly
 ZCA9IDE7Ci0JCXdlaXJkcmVhc29uID0gInN0cmluZyB0YWJsZSBzZWN0aW9uIG5vdCBsYXN0IGlu
 IGZpbGUiOwotCX0gICAKIAlpZiAod2VpcmQpIHsKIAkJZnByaW50ZihzdGRlcnIsICIlczogd2Vp
 cmQgZXhlY3V0YWJsZSAoJXMpXG4iLCBmbiwgd2VpcmRyZWFzb24pOwogCQlnb3RvIGJhZDsKIAl9
 CiAKIAkvKgorCSAqIHNvcnQgc2VjdGlvbiBsYXlvdXQgdGFibGUgYnkgb2Zmc2V0CisJICovCisJ
 bGF5b3V0cCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzaGxheW91dCkgKiAoeGUxNnRvaChlaGRy
 LmVfc2hudW0pICsgMSksCisJICAgIGZuLCAibGF5b3V0IHRhYmxlIik7CisJaWYgKGxheW91dHAg
 PT0gTlVMTCkKKwkJZ290byBiYWQ7CisKKwkvKiBhZGQgYSBwc2V1ZG8gZW50cnkgdG8gcmVwcmVz
 ZW50IHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZSAqLworCXNoZHJzaGRyLnNoX29mZnNldCA9IGVo
 ZHIuZV9zaG9mZjsKKwlzaGRyc2hkci5zaF9zaXplID0gaHRveGV3KHNoZHJzaXplKTsKKwlzaGRy
 c2hkci5zaF9hZGRyYWxpZ24gPSBodG94ZXcoRUxGU0laRSAvIDgpOworCWxheW91dHBbMF0uc2hk
 ciA9ICZzaGRyc2hkcjsKKworCS8qIGluc2VydCBhbmQgc29ydCBub3JtYWwgc2VjdGlvbiBoZWFk
 ZXJzICovCisJZm9yIChpID0gMDsgaSA8IHhlMTZ0b2goZWhkci5lX3NobnVtKTsgaSsrKSB7CisJ
 CWludCBsID0gMCwgciA9IGksIG07CisJCXdoaWxlIChsIDw9IHIpIHsKKwkJCW0gPSAoIGwgKyBy
 KSAvIDI7CisJCQlpZiAoeGV3dG9oKHNoZHJwW2ldLnNoX29mZnNldCkgPAorCQkJICAgIHhld3Rv
 aChsYXlvdXRwW21dLnNoZHItPnNoX29mZnNldCkpCisJCQkJciA9IG0gLSAxOworCQkJZWxzZQor
 CQkJCWwgPSBtICsgMTsKKwkJfQorCisJCWlmIChsICE9IGkgKyAxKSB7CisJCQltZW1tb3ZlKCZs
 YXlvdXRwW2wgKyAxXSwgJmxheW91dHBbbF0sCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzaGxheW91
 dCkgKiAoaSAtIGwgKyAxKSk7CisJCX0KKworCQlsYXlvdXRwW2xdLnNoZHIgPSAmc2hkcnBbaV07
 CisJCWxheW91dHBbbF0uYnVmcCA9IE5VTEw7CisJfQorCisJLyoKIAkgKiBsb2FkIHVwIGV2ZXJ5
 dGhpbmcgd2UgbmVlZAogCSAqLwogCi0JLyogc3ltYm9sIHRhYmxlICovCi0JaWYgKChzeW10YWJw
 ID0geG1hbGxvYyh4ZXd0b2goc3ltdGFic2hkci0+c2hfc2l6ZSksIGZuLCAic3ltYm9sIHRhYmxl
 IikpCi0JICAgID09IE5VTEwpCisJLyogbG9hZCBzZWN0aW9uIHN0cmluZyB0YWJsZSBmb3IgZGVi
 dWcgdXNlICovCisJaWYgKChzaHN0cnRhYnAgPSB4bWFsbG9jKHhld3RvaChzaHN0cnRhYnNoZHIt
 PnNoX3NpemUpLCBmbiwKKwkgICAgInNlY3Rpb24gc3RyaW5nIHRhYmxlIikpID09IE5VTEwpCiAJ
 CWdvdG8gYmFkOwotCWlmICh4cmVhZGF0b2ZmKGZkLCBzeW10YWJwLCB4ZXd0b2goc3ltdGFic2hk
 ci0+c2hfb2Zmc2V0KSwKLQkgICAgeGV3dG9oKHN5bXRhYnNoZHItPnNoX3NpemUpLCBmbikgIT0g
 eGV3dG9oKHN5bXRhYnNoZHItPnNoX3NpemUpKQorCWlmICh4cmVhZGF0b2ZmKGZkLCBzaHN0cnRh
 YnAsIHhld3RvaChzaHN0cnRhYnNoZHItPnNoX29mZnNldCksCisJICAgIHhld3RvaChzaHN0cnRh
 YnNoZHItPnNoX3NpemUpLCBmbikgIT0geGV3dG9oKHNoc3RydGFic2hkci0+c2hfc2l6ZSkpCiAJ
 CWdvdG8gYmFkOwogCi0JLyogc3RyaW5nIHRhYmxlICovCi0JaWYgKChzdHJ0YWJwID0geG1hbGxv
 Yyh4ZXd0b2goc3RydGFic2hkci0+c2hfc2l6ZSksIGZuLCAic3RyaW5nIHRhYmxlIikpCi0JICAg
 ID09IE5VTEwpCi0JCWdvdG8gYmFkOwotCWlmICh4cmVhZGF0b2ZmKGZkLCBzdHJ0YWJwLCB4ZXd0
 b2goc3RydGFic2hkci0+c2hfb2Zmc2V0KSwKLQkgICAgeGV3dG9oKHN0cnRhYnNoZHItPnNoX3Np
 emUpLCBmbikgIT0geGV3dG9oKHN0cnRhYnNoZHItPnNoX3NpemUpKQotCQlnb3RvIGJhZDsKKwkv
 KiB3ZSBuZWVkIHN5bXRhYiwgc3RydGFiLCBhbmQgZXZlcnl0aGluZyBiZWhpbmQgc3RydGFiICov
 CisJZm9yIChpID0gMDsgaSA8IHhlMTZ0b2goZWhkci5lX3NobnVtKSArIDE7IGkrKykgeworCQlF
 bGZfT2ZmIG9mZjsKKwkJc2l6ZV90IHNpemU7CisJCXN0YXRpYyBpbnQgc3RydGFiaWR4ID0gSU5U
 X01BWDsKIAorCQlpZiAobGF5b3V0cFtpXS5zaGRyID09ICZzaGRyc2hkcikgeworCQkJLyogbm90
 IGxvYWQgc2VjdGlvbiBoZWFkZXIgYWdhaW4gKi8KKwkJCWxheW91dHBbaV0uYnVmcCA9IHNoZHJw
 OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGxheW91dHBbaV0uc2hkciA9PSBzaHN0cnRhYnNo
 ZHIpIHsKKwkJCS8qIG5vdCBsb2FkIHNlY3Rpb24gc3RyaW5nIHRhYmxlIGFnYWluICovCisJCQls
 YXlvdXRwW2ldLmJ1ZnAgPSBzaHN0cnRhYnA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChs
 YXlvdXRwW2ldLnNoZHIgPT0gc3RydGFic2hkcikKKwkJCXN0cnRhYmlkeCA9IGk7CisJCWlmIChs
 YXlvdXRwW2ldLnNoZHIgPT0gc3ltdGFic2hkciB8fCBpID49IHN0cnRhYmlkeCkgeworCQkJb2Zm
 ID0geGV3dG9oKGxheW91dHBbaV0uc2hkci0+c2hfb2Zmc2V0KTsKKwkJCXNpemUgPSB4ZXd0b2go
 bGF5b3V0cFtpXS5zaGRyLT5zaF9zaXplKTsKKwkJCWxheW91dHBbaV0uYnVmcCA9IHhtYWxsb2Mo
 c2l6ZSwgZm4sCisJCQkgICAgc2hzdHJ0YWJwICsgeGV3dG9oKGxheW91dHBbaV0uc2hkci0+c2hf
 bmFtZSkpOworCQkJaWYgKGxheW91dHBbaV0uYnVmcCA9PSBOVUxMKQorCQkJCWdvdG8gYmFkOwor
 CQkJaWYgKHhyZWFkYXRvZmYoZmQsIGxheW91dHBbaV0uYnVmcCwgb2ZmLCBzaXplLCBmbikgIT0K
 KwkJCSAgICBzaXplKQorCQkJCWdvdG8gYmFkOworCisJCQkvKiBzZXQgc3ltYm9sIHRhYmxlIGFu
 ZCBzdHJpbmcgdGFibGUgKi8KKwkJCWlmIChsYXlvdXRwW2ldLnNoZHIgPT0gc3ltdGFic2hkcikK
 KwkJCQlzeW10YWJwID0gbGF5b3V0cFtpXS5idWZwOworCQkJZWxzZSBpZiAobGF5b3V0cFtpXS5z
 aGRyID09IHN0cnRhYnNoZHIpCisJCQkJc3RydGFicCA9IGxheW91dHBbaV0uYnVmcDsKKwkJfQor
 CX0KKwogCW5zdHJ0YWJfc2l6ZSA9IDI1NjsKIAluc3RydGFicCA9IHhtYWxsb2MobnN0cnRhYl9z
 aXplLCBmbiwgIm5ldyBzdHJpbmcgdGFibGUiKTsKIAlpZiAobnN0cnRhYnAgPT0gTlVMTCkKQEAg
 LTM2NSwyNiArNDE4LDcxIEBACiAJc3RydGFic2hkci0+c2hfc2l6ZSA9IGh0b3hldyhuc3RydGFi
 X25leHRvZmYpOwogCiAJLyoKLQkgKiB3cml0ZSBuZXcgdGFibGVzIHRvIHRoZSBmaWxlCisJICog
 dXBkYXRlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluIGFzY2VuZGluZyBvcmRlciBvZiBvZmZzZXQK
 IAkgKi8KLQlpZiAoeHdyaXRlYXRvZmYoZmQsIHNoZHJwLCB4ZXd0b2goZWhkci5lX3Nob2ZmKSwg
 c2hkcnNpemUsIGZuKSAhPQotCSAgICBzaGRyc2l6ZSkKLQkJZ290byBiYWQ7Ci0JaWYgKHh3cml0
 ZWF0b2ZmKGZkLCBzeW10YWJwLCB4ZXd0b2goc3ltdGFic2hkci0+c2hfb2Zmc2V0KSwKLQkgICAg
 eGV3dG9oKHN5bXRhYnNoZHItPnNoX3NpemUpLCBmbikgIT0geGV3dG9oKHN5bXRhYnNoZHItPnNo
 X3NpemUpKQotCQlnb3RvIGJhZDsKLQkvKiB3cml0ZSBuZXcgc3ltYm9sIHRhYmxlIHN0cmluZ3Mg
 Ki8KLQlpZiAoKHNpemVfdCl4d3JpdGVhdG9mZihmZCwgbnN0cnRhYnAsIHhld3RvaChzdHJ0YWJz
 aGRyLT5zaF9vZmZzZXQpLAotCSAgICB4ZXd0b2goc3RydGFic2hkci0+c2hfc2l6ZSksIGZuKSAh
 PSB4ZXd0b2goc3RydGFic2hkci0+c2hfc2l6ZSkpCi0JCWdvdG8gYmFkOworCWZvciAoaSA9IDA7
 IGxheW91dHBbaV0uc2hkciAhPSBzdHJ0YWJzaGRyOyBpKyspCisJCTsKKwlmb3IgKDsgaSA8IHhl
 MTZ0b2goZWhkci5lX3NobnVtKSArIDE7IGkrKykgeworCQlFbGZfT2ZmIG9mZiwgYWxpZ247CisJ
 CW9mZiA9IHhld3RvaChsYXlvdXRwW2kgLSAxXS5zaGRyLT5zaF9vZmZzZXQpICsKKwkJICAgIHhl
 d3RvaChsYXlvdXRwW2kgLSAxXS5zaGRyLT5zaF9zaXplKTsKKwkJYWxpZ24gPSB4ZXd0b2gobGF5
 b3V0cFtpXS5zaGRyLT5zaF9hZGRyYWxpZ24pOworCQlvZmYgPSAob2ZmICsgKGFsaWduIC0gMSkp
 ICYgfihhbGlnbiAtIDEpOworCQlsYXlvdXRwW2ldLnNoZHItPnNoX29mZnNldCA9IGh0b3hldyhv
 ZmYpOworCX0KIAorCS8qCisJICogd3JpdGUgZGF0YSB0byB0aGUgZmlsZSBpbiBkZXNjZW5kaW5n
 IG9yZGVyIG9mIG9mZnNldAorCSAqLworCWZvciAoaSA9IHhlMTZ0b2goZWhkci5lX3NobnVtKTsg
 aSA+PSAwOyBpLS0pIHsKKwkJdm9pZCAqYnVmOworCQlFbGZfT2ZmIG9mZjsKKwkJc2l6ZV90IHNp
 emU7CisJCXN0YXRpYyBpbnQgc3RydGFiaWR4ID0gSU5UX01JTjsKKworCQlpZiAobGF5b3V0cFtp
 XS5zaGRyID09IHN0cnRhYnNoZHIpIHsKKwkJCXN0cnRhYmlkeCA9IGk7CisJCQkvKiBuZXcgc3Ry
 aW5nIHRhYmxlICovCisJCQlidWYgPSBuc3RydGFicDsKKwkJfSBlbHNlCisJCQlidWYgPSBsYXlv
 dXRwW2ldLmJ1ZnA7CisKKwkJaWYgKGxheW91dHBbaV0uc2hkciA9PSAmc2hkcnNoZHIgfHwKKwkJ
 ICAgIGxheW91dHBbaV0uc2hkciA9PSBzeW10YWJzaGRyIHx8IGkgPj0gc3RydGFiaWR4KSB7CisJ
 CQlpZiAoYnVmID09IE5VTEwpCisJCQkJZ290byBiYWQ7CisKKwkJCS8qIAorCQkJICogdXBkYXRl
 IHRoZSBvZmZzZXQgb2Ygc2VjdGlvbiBoZWFkZXIgdGFibGUgaW4gZWxmCisJCQkgKiBoZWFkZXIg
 aWYgbmVlZGVkLgorCQkJICovCisJCQlpZiAobGF5b3V0cFtpXS5zaGRyID09ICZzaGRyc2hkciAm
 JgorCQkJICAgIGVoZHIuZV9zaG9mZiAhPSBzaGRyc2hkci5zaF9vZmZzZXQpIHsKKwkJCQllaGRy
 LmVfc2hvZmYgPSBzaGRyc2hkci5zaF9vZmZzZXQ7CisJCQkJb2ZmID0gKEVMRlNJWkUgPT0gMzIp
 ID8gMzIgOiA0NDsKKwkJCQlzaXplID0gc2l6ZW9mKEVsZl9PZmYpOworCQkJCWlmICh4d3JpdGVh
 dG9mZihmZCwgJmVoZHIuZV9zaG9mZiwgb2ZmLCBzaXplLAorCQkJCSAgICBmbikgIT0gc2l6ZSkK
 KwkJCQkJZ290byBiYWQ7CisJCQl9CisKKwkJCW9mZiA9IHhld3RvaChsYXlvdXRwW2ldLnNoZHIt
 PnNoX29mZnNldCk7CisJCQlzaXplID0geGV3dG9oKGxheW91dHBbaV0uc2hkci0+c2hfc2l6ZSk7
 CisJCQlpZiAoeHdyaXRlYXRvZmYoZmQsIGJ1Ziwgb2ZmLCBzaXplLCBmbikgIT0gc2l6ZSkKKwkJ
 CQlnb3RvIGJhZDsKKwkJfQorCX0KKwogb3V0OgotCWlmIChzaGRycCAhPSBOVUxMKQotCQlmcmVl
 KHNoZHJwKTsKLQlpZiAoc3ltdGFicCAhPSBOVUxMKQotCQlmcmVlKHN5bXRhYnApOwotCWlmIChz
 dHJ0YWJwICE9IE5VTEwpCi0JCWZyZWUoc3RydGFicCk7CisJaWYgKGxheW91dHAgIT0gTlVMTCkg
 eworCQlmb3IgKGkgPSAwOyBpIDwgeGUxNnRvaChlaGRyLmVfc2hudW0pICsgMTsgaSsrKSB7CisJ
 CQlpZiAobGF5b3V0cFtpXS5idWZwICE9IE5VTEwpCisJCQkJZnJlZShsYXlvdXRwW2ldLmJ1ZnAp
 OworCQl9CisJCWZyZWUobGF5b3V0cCk7CisJfQorCWlmIChuc3RydGFicCAhPSBOVUxMKQorCQlm
 cmVlKG5zdHJ0YWJwKTsKIAlyZXR1cm4gKHJ2KTsKIAogYmFkOgo=
 --bcaec554d9d6e871af04cff2aaac--

From: pete <petechou@gmail.com>
To: bug-followup@freebsd.org
Cc:  
Subject: Re: bin/174011: [patch] crunchide support non-custom elf object layout
Date: Mon, 17 Dec 2012 16:55:57 +0800

 --f46d04088e1183a55d04d1088ebb
 Content-Type: multipart/alternative; boundary=f46d04088e1183a55a04d1088eb9
 
 --f46d04088e1183a55a04d1088eb9
 Content-Type: text/plain; charset=ISO-8859-1
 
 Update the patch for performance improvement.
 
 Also thanks Kai Wang for helping test and refine the patch, esp,. on a stripped
 executable.
 
 --f46d04088e1183a55a04d1088eb9
 Content-Type: text/html; charset=ISO-8859-1
 Content-Transfer-Encoding: quoted-printable
 
 Update the patch for performance improvement.<div><br></div><div>Also thank=
 s Kai Wang for helping test and refine the patch, esp,. on a=A0<span style=
 =3D"font-family:arial,sans-serif;font-size:13px">stripped executable.</span=
 ></div>
 
 
 --f46d04088e1183a55a04d1088eb9--
 --f46d04088e1183a55d04d1088ebb
 Content-Type: text/plain; charset=US-ASCII; name="patch-6.txt"
 Content-Disposition: attachment; filename="patch-6.txt"
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_hatd6wie1
 
 SW5kZXg6IGV4ZWNfZWxmMzIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBleGVjX2VsZjMyLmMJKHJldmlzaW9u
 IDI0NDE5OSkKKysrIGV4ZWNfZWxmMzIuYwkod29ya2luZyBjb3B5KQpAQCAtNDUsNiArNDUsNyBA
 QAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUg
 PGxpbWl0cy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5j
 bHVkZSA8c3RyaW5nLmg+CkBAIC04MiwxMSArODMsOSBAQAogI2RlZmluZQl4ZTMydG9oKHgpCSgo
 ZGF0YSA9PSBFTEZEQVRBMk1TQikgPyBiZTMydG9oKHgpIDogbGUzMnRvaCh4KSkKICNkZWZpbmUJ
 aHRveGUzMih4KQkoKGRhdGEgPT0gRUxGREFUQTJNU0IpID8gaHRvYmUzMih4KSA6IGh0b2xlMzIo
 eCkpCiAKLXN0cnVjdCBsaXN0ZWxlbSB7Ci0Jc3RydWN0IGxpc3RlbGVtICpuZXh0OwotCXZvaWQg
 Km1lbTsKLQlvZmZfdCBmaWxlOwotCXNpemVfdCBzaXplOworc3RydWN0IHNobGF5b3V0IHsKKwlF
 bGZfU2hkciAqc2hkcjsKKwl2b2lkICpidWZwOwogfTsKIAogc3RhdGljIHNzaXplX3QKQEAgLTIz
 NSwxNyArMjM0LDIwIEBACiBFTEZOQU1FRU5EKGhpZGUpKGludCBmZCwgY29uc3QgY2hhciAqZm4p
 CiB7CiAJRWxmX0VoZHIgZWhkcjsKLQlFbGZfU2hkciAqc2hkcnAgPSBOVUxMLCAqc3ltdGFic2hk
 ciwgKnN0cnRhYnNoZHI7CisJc3RydWN0IHNobGF5b3V0ICpsYXlvdXRwID0gTlVMTDsKKwlFbGZf
 U2hkciAqc2hkcnAgPSBOVUxMLCAqc3ltdGFic2hkciwgKnN0cnRhYnNoZHIsICpzaHN0cnRhYnNo
 ZHI7CisJRWxmX1NoZHIgc2hkcnNoZHI7CiAJRWxmX1N5bSAqc3ltdGFicCA9IE5VTEw7Ci0JY2hh
 ciAqc3RydGFicCA9IE5VTEw7Ci0JRWxmX1NpemUgIG5zeW1zLCBld2k7CisJY2hhciAqc2hzdHJ0
 YWJwID0gTlVMTCwgKnN0cnRhYnAgPSBOVUxMOworCUVsZl9TaXplIG5zeW1zLCBld2k7CisJRWxm
 X09mZiBvZmY7CiAJc3NpemVfdCBzaGRyc2l6ZTsKLQlpbnQgcnYsIGksIHdlaXJkOwotCXNpemVf
 dCBuc3RydGFiX3NpemUsIG5zdHJ0YWJfbmV4dG9mZiwgZm5fc2l6ZTsKKwlpbnQgcnYsIGksIHdl
 aXJkLCBsLCBtLCByLCBzdHJ0YWJpZHg7CisJc2l6ZV90IG5zdHJ0YWJfc2l6ZSwgbnN0cnRhYl9u
 ZXh0b2ZmLCBmbl9zaXplLCBzaXplOwogCWNoYXIgKm5zdHJ0YWJwID0gTlVMTDsKIAl1bnNpZ25l
 ZCBjaGFyIGRhdGE7Ci0JRWxmX09mZiBtYXhvZmYsIHN0cm9mZjsKIAljb25zdCBjaGFyICp3ZWly
 ZHJlYXNvbiA9IE5VTEw7CisJdm9pZCAqYnVmOwogCiAJcnYgPSAwOwogCWlmICh4cmVhZGF0b2Zm
 KGZkLCAmZWhkciwgMCwgc2l6ZW9mIGVoZHIsIGZuKSAhPSBzaXplb2YgZWhkcikKQEAgLTI2MCw2
 MyArMjYyLDEyNCBAQAogCSAgICBzaGRyc2l6ZSkKIAkJZ290byBiYWQ7CiAKLQlzeW10YWJzaGRy
 ID0gc3RydGFic2hkciA9IE5VTEw7CisJc3ltdGFic2hkciA9IHN0cnRhYnNoZHIgPSBzaHN0cnRh
 YnNoZHIgPSBOVUxMOwogCXdlaXJkID0gMDsKLQltYXhvZmYgPSBzdHJvZmYgPSAwOwogCWZvciAo
 aSA9IDA7IGkgPCB4ZTE2dG9oKGVoZHIuZV9zaG51bSk7IGkrKykgewotCQlpZiAoeGV3dG9oKHNo
 ZHJwW2ldLnNoX29mZnNldCkgPiBtYXhvZmYpCi0JCQltYXhvZmYgPSB4ZXd0b2goc2hkcnBbaV0u
 c2hfb2Zmc2V0KTsKIAkJc3dpdGNoICh4ZTMydG9oKHNoZHJwW2ldLnNoX3R5cGUpKSB7CiAJCWNh
 c2UgU0hUX1NZTVRBQjoKLQkJCWlmIChzeW10YWJzaGRyICE9IE5VTEwpCisJCQlpZiAoc3ltdGFi
 c2hkciAhPSBOVUxMKSB7CiAJCQkJd2VpcmQgPSAxOworCQkJCXdlaXJkcmVhc29uID0gIm11bHRp
 cGxlIHN5bWJvbCB0YWJsZXMiOworCQkJfQogCQkJc3ltdGFic2hkciA9ICZzaGRycFtpXTsKIAkJ
 CXN0cnRhYnNoZHIgPSAmc2hkcnBbeGUzMnRvaChzaGRycFtpXS5zaF9saW5rKV07Ci0KLQkJCS8q
 IENoZWNrIHdoZXRoZXIgdGhlIHN0cmluZyB0YWJsZSBpcyB0aGUgbGFzdCBzZWN0aW9uICovCi0J
 CQlzdHJvZmYgPSB4ZXd0b2goc2hkcnBbeGUzMnRvaChzaGRycFtpXS5zaF9saW5rKV0uc2hfb2Zm
 c2V0KTsKLQkJCWlmICghd2VpcmQgJiYgeGUzMnRvaChzaGRycFtpXS5zaF9saW5rKSAhPSAoeGUx
 NnRvaChlaGRyLmVfc2hudW0pIC0gMSkpIHsKLQkJCQl3ZWlyZCA9IDE7Ci0JCQkJd2VpcmRyZWFz
 b24gPSAic3RyaW5nIHRhYmxlIG5vdCBsYXN0IHNlY3Rpb24iOwotCQkJfQogCQkJYnJlYWs7CisJ
 CWNhc2UgU0hUX1NUUlRBQjoKKwkJCWlmIChpID09IHhlMTZ0b2goZWhkci5lX3Noc3RybmR4KSkK
 KwkJCQlzaHN0cnRhYnNoZHIgPSAmc2hkcnBbaV07CisJCQlicmVhazsKIAkJfQogCX0KLQlpZiAo
 ISB3ZWlyZHJlYXNvbikKLQkJd2VpcmRyZWFzb24gPSAidW5zdXBwb3J0ZWQiOwogCWlmIChzeW10
 YWJzaGRyID09IE5VTEwpCiAJCWdvdG8gb3V0OwotCWlmIChzdHJ0YWJzaGRyID09IE5VTEwpCisJ
 aWYgKHN0cnRhYnNoZHIgPT0gTlVMTCkgewogCQl3ZWlyZCA9IDE7Ci0JaWYgKCF3ZWlyZCAmJiBz
 dHJvZmYgIT0gbWF4b2ZmKSB7CisJCXdlaXJkcmVhc29uID0gInN0cmluZyB0YWJsZSBkb2VzIG5v
 dCBleGlzdCI7CisJfQorCWlmIChzaHN0cnRhYnNoZHIgPT0gTlVMTCkgewogCQl3ZWlyZCA9IDE7
 Ci0JCXdlaXJkcmVhc29uID0gInN0cmluZyB0YWJsZSBzZWN0aW9uIG5vdCBsYXN0IGluIGZpbGUi
 OwotCX0gICAKKwkJd2VpcmRyZWFzb24gPSAic2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGRv
 ZXMgbm90IGV4aXN0IjsKKwl9CisJaWYgKHdlaXJkcmVhc29uID09IE5VTEwpCisJCXdlaXJkcmVh
 c29uID0gInVuc3VwcG9ydGVkIjsKIAlpZiAod2VpcmQpIHsKIAkJZnByaW50ZihzdGRlcnIsICIl
 czogd2VpcmQgZXhlY3V0YWJsZSAoJXMpXG4iLCBmbiwgd2VpcmRyZWFzb24pOwogCQlnb3RvIGJh
 ZDsKIAl9CiAKIAkvKgorCSAqIHNvcnQgc2VjdGlvbiBsYXlvdXQgdGFibGUgYnkgb2Zmc2V0CisJ
 ICovCisJbGF5b3V0cCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzaGxheW91dCkgKiAoeGUxNnRv
 aChlaGRyLmVfc2hudW0pICsgMSksCisJICAgIGZuLCAibGF5b3V0IHRhYmxlIik7CisJaWYgKGxh
 eW91dHAgPT0gTlVMTCkKKwkJZ290byBiYWQ7CisKKwkvKiBhZGQgYSBwc2V1ZG8gZW50cnkgdG8g
 cmVwcmVzZW50IHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZSAqLworCXNoZHJzaGRyLnNoX29mZnNl
 dCA9IGVoZHIuZV9zaG9mZjsKKwlzaGRyc2hkci5zaF9zaXplID0gaHRveGV3KHNoZHJzaXplKTsK
 KwlzaGRyc2hkci5zaF9hZGRyYWxpZ24gPSBodG94ZXcoRUxGU0laRSAvIDgpOworCWxheW91dHBb
 eGUxNnRvaChlaGRyLmVfc2hudW0pXS5zaGRyID0gJnNoZHJzaGRyOworCisJLyogaW5zZXJ0IGFu
 ZCBzb3J0IG5vcm1hbCBzZWN0aW9uIGhlYWRlcnMgKi8KKwlmb3IgKGkgPSB4ZTE2dG9oKGVoZHIu
 ZV9zaG51bSkgLSAxOyBpID49IDA7IGktLSkgeworCQlsID0gaSArIDE7CisJCXIgPSB4ZTE2dG9o
 KGVoZHIuZV9zaG51bSk7CisJCXdoaWxlIChsIDw9IHIpIHsKKwkJCW0gPSAobCArIHIpIC8gMjsK
 KwkJCWlmICh4ZXd0b2goc2hkcnBbaV0uc2hfb2Zmc2V0KSA+CisJCQkgICAgeGV3dG9oKGxheW91
 dHBbbV0uc2hkci0+c2hfb2Zmc2V0KSkKKwkJCQlsID0gbSArIDE7CisJCQllbHNlCisJCQkJciA9
 IG0gLSAxOworCQl9CisKKwkJaWYgKHIgIT0gaSkgeworCQkJbWVtbW92ZSgmbGF5b3V0cFtpXSwg
 JmxheW91dHBbaSArIDFdLAorCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2hsYXlvdXQpICogKHIgLSBp
 KSk7CisJCX0KKworCQlsYXlvdXRwW3JdLnNoZHIgPSAmc2hkcnBbaV07CisJCWxheW91dHBbcl0u
 YnVmcCA9IE5VTEw7CisJfQorCisJLyoKIAkgKiBsb2FkIHVwIGV2ZXJ5dGhpbmcgd2UgbmVlZAog
 CSAqLwogCi0JLyogc3ltYm9sIHRhYmxlICovCi0JaWYgKChzeW10YWJwID0geG1hbGxvYyh4ZXd0
 b2goc3ltdGFic2hkci0+c2hfc2l6ZSksIGZuLCAic3ltYm9sIHRhYmxlIikpCi0JICAgID09IE5V
 TEwpCisJLyogbG9hZCBzZWN0aW9uIHN0cmluZyB0YWJsZSBmb3IgZGVidWcgdXNlICovCisJaWYg
 KChzaHN0cnRhYnAgPSB4bWFsbG9jKHhld3RvaChzaHN0cnRhYnNoZHItPnNoX3NpemUpLCBmbiwK
 KwkgICAgInNlY3Rpb24gc3RyaW5nIHRhYmxlIikpID09IE5VTEwpCiAJCWdvdG8gYmFkOwotCWlm
 ICh4cmVhZGF0b2ZmKGZkLCBzeW10YWJwLCB4ZXd0b2goc3ltdGFic2hkci0+c2hfb2Zmc2V0KSwK
 LQkgICAgeGV3dG9oKHN5bXRhYnNoZHItPnNoX3NpemUpLCBmbikgIT0geGV3dG9oKHN5bXRhYnNo
 ZHItPnNoX3NpemUpKQorCWlmICh4cmVhZGF0b2ZmKGZkLCBzaHN0cnRhYnAsIHhld3RvaChzaHN0
 cnRhYnNoZHItPnNoX29mZnNldCksCisJICAgIHhld3RvaChzaHN0cnRhYnNoZHItPnNoX3NpemUp
 LCBmbikgIT0geGV3dG9oKHNoc3RydGFic2hkci0+c2hfc2l6ZSkpCiAJCWdvdG8gYmFkOwogCi0J
 Lyogc3RyaW5nIHRhYmxlICovCi0JaWYgKChzdHJ0YWJwID0geG1hbGxvYyh4ZXd0b2goc3RydGFi
 c2hkci0+c2hfc2l6ZSksIGZuLCAic3RyaW5nIHRhYmxlIikpCi0JICAgID09IE5VTEwpCi0JCWdv
 dG8gYmFkOwotCWlmICh4cmVhZGF0b2ZmKGZkLCBzdHJ0YWJwLCB4ZXd0b2goc3RydGFic2hkci0+
 c2hfb2Zmc2V0KSwKLQkgICAgeGV3dG9oKHN0cnRhYnNoZHItPnNoX3NpemUpLCBmbikgIT0geGV3
 dG9oKHN0cnRhYnNoZHItPnNoX3NpemUpKQotCQlnb3RvIGJhZDsKKwkvKiB3ZSBuZWVkIHN5bXRh
 Yiwgc3RydGFiLCBhbmQgZXZlcnl0aGluZyBiZWhpbmQgc3RydGFiICovCisJc3RydGFiaWR4ID0g
 SU5UX01BWDsKKwlmb3IgKGkgPSAwOyBpIDwgeGUxNnRvaChlaGRyLmVfc2hudW0pICsgMTsgaSsr
 KSB7CisJCWlmIChsYXlvdXRwW2ldLnNoZHIgPT0gJnNoZHJzaGRyKSB7CisJCQkvKiBub3QgbG9h
 ZCBzZWN0aW9uIGhlYWRlciBhZ2FpbiAqLworCQkJbGF5b3V0cFtpXS5idWZwID0gc2hkcnA7CisJ
 CQljb250aW51ZTsKKwkJfQorCQlpZiAobGF5b3V0cFtpXS5zaGRyID09IHNoc3RydGFic2hkcikg
 eworCQkJLyogbm90IGxvYWQgc2VjdGlvbiBzdHJpbmcgdGFibGUgYWdhaW4gKi8KKwkJCWxheW91
 dHBbaV0uYnVmcCA9IHNoc3RydGFicDsKKwkJCWNvbnRpbnVlOworCQl9CiAKKwkJaWYgKGxheW91
 dHBbaV0uc2hkciA9PSBzdHJ0YWJzaGRyKQorCQkJc3RydGFiaWR4ID0gaTsKKwkJaWYgKGxheW91
 dHBbaV0uc2hkciA9PSBzeW10YWJzaGRyIHx8IGkgPj0gc3RydGFiaWR4KSB7CisJCQlvZmYgPSB4
 ZXd0b2gobGF5b3V0cFtpXS5zaGRyLT5zaF9vZmZzZXQpOworCQkJc2l6ZSA9IHhld3RvaChsYXlv
 dXRwW2ldLnNoZHItPnNoX3NpemUpOworCQkJbGF5b3V0cFtpXS5idWZwID0geG1hbGxvYyhzaXpl
 LCBmbiwKKwkJCSAgICBzaHN0cnRhYnAgKyB4ZXd0b2gobGF5b3V0cFtpXS5zaGRyLT5zaF9uYW1l
 KSk7CisJCQlpZiAobGF5b3V0cFtpXS5idWZwID09IE5VTEwpCisJCQkJZ290byBiYWQ7CisJCQlp
 ZiAoeHJlYWRhdG9mZihmZCwgbGF5b3V0cFtpXS5idWZwLCBvZmYsIHNpemUsIGZuKSAhPQorCQkJ
 ICAgIHNpemUpCisJCQkJZ290byBiYWQ7CisKKwkJCS8qIHNldCBzeW1ib2wgdGFibGUgYW5kIHN0
 cmluZyB0YWJsZSAqLworCQkJaWYgKGxheW91dHBbaV0uc2hkciA9PSBzeW10YWJzaGRyKQorCQkJ
 CXN5bXRhYnAgPSBsYXlvdXRwW2ldLmJ1ZnA7CisJCQllbHNlIGlmIChsYXlvdXRwW2ldLnNoZHIg
 PT0gc3RydGFic2hkcikKKwkJCQlzdHJ0YWJwID0gbGF5b3V0cFtpXS5idWZwOworCQl9CisJfQor
 CiAJbnN0cnRhYl9zaXplID0gMjU2OwogCW5zdHJ0YWJwID0geG1hbGxvYyhuc3RydGFiX3NpemUs
 IGZuLCAibmV3IHN0cmluZyB0YWJsZSIpOwogCWlmIChuc3RydGFicCA9PSBOVUxMKQpAQCAtMzY1
 LDI2ICs0MjgsNjMgQEAKIAlzdHJ0YWJzaGRyLT5zaF9zaXplID0gaHRveGV3KG5zdHJ0YWJfbmV4
 dG9mZik7CiAKIAkvKgotCSAqIHdyaXRlIG5ldyB0YWJsZXMgdG8gdGhlIGZpbGUKKwkgKiB1cGRh
 dGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW4gYXNjZW5kaW5nIG9yZGVyIG9mIG9mZnNldAogCSAq
 LwotCWlmICh4d3JpdGVhdG9mZihmZCwgc2hkcnAsIHhld3RvaChlaGRyLmVfc2hvZmYpLCBzaGRy
 c2l6ZSwgZm4pICE9Ci0JICAgIHNoZHJzaXplKQotCQlnb3RvIGJhZDsKLQlpZiAoeHdyaXRlYXRv
 ZmYoZmQsIHN5bXRhYnAsIHhld3RvaChzeW10YWJzaGRyLT5zaF9vZmZzZXQpLAotCSAgICB4ZXd0
 b2goc3ltdGFic2hkci0+c2hfc2l6ZSksIGZuKSAhPSB4ZXd0b2goc3ltdGFic2hkci0+c2hfc2l6
 ZSkpCi0JCWdvdG8gYmFkOwotCS8qIHdyaXRlIG5ldyBzeW1ib2wgdGFibGUgc3RyaW5ncyAqLwot
 CWlmICgoc2l6ZV90KXh3cml0ZWF0b2ZmKGZkLCBuc3RydGFicCwgeGV3dG9oKHN0cnRhYnNoZHIt
 PnNoX29mZnNldCksCi0JICAgIHhld3RvaChzdHJ0YWJzaGRyLT5zaF9zaXplKSwgZm4pICE9IHhl
 d3RvaChzdHJ0YWJzaGRyLT5zaF9zaXplKSkKLQkJZ290byBiYWQ7CisJZm9yIChpID0gc3RydGFi
 aWR4ICsgMTsgaSA8IHhlMTZ0b2goZWhkci5lX3NobnVtKSArIDE7IGkrKykgeworCQlFbGZfT2Zm
 IG9mZiwgYWxpZ247CisJCW9mZiA9IHhld3RvaChsYXlvdXRwW2kgLSAxXS5zaGRyLT5zaF9vZmZz
 ZXQpICsKKwkJICAgIHhld3RvaChsYXlvdXRwW2kgLSAxXS5zaGRyLT5zaF9zaXplKTsKKwkJYWxp
 Z24gPSB4ZXd0b2gobGF5b3V0cFtpXS5zaGRyLT5zaF9hZGRyYWxpZ24pOworCQlvZmYgPSAob2Zm
 ICsgKGFsaWduIC0gMSkpICYgfihhbGlnbiAtIDEpOworCQlsYXlvdXRwW2ldLnNoZHItPnNoX29m
 ZnNldCA9IGh0b3hldyhvZmYpOworCX0KIAorCS8qCisJICogd3JpdGUgZGF0YSB0byB0aGUgZmls
 ZSBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIG9mZnNldAorCSAqLworCWZvciAoaSA9IHhlMTZ0b2go
 ZWhkci5lX3NobnVtKTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKGxheW91dHBbaV0uc2hkciA9PSBz
 dHJ0YWJzaGRyKSB7CisJCQkvKiBuZXcgc3RyaW5nIHRhYmxlICovCisJCQlidWYgPSBuc3RydGFi
 cDsKKwkJfSBlbHNlCisJCQlidWYgPSBsYXlvdXRwW2ldLmJ1ZnA7CisKKwkJaWYgKGxheW91dHBb
 aV0uc2hkciA9PSAmc2hkcnNoZHIgfHwKKwkJICAgIGxheW91dHBbaV0uc2hkciA9PSBzeW10YWJz
 aGRyIHx8IGkgPj0gc3RydGFiaWR4KSB7CisJCQlpZiAoYnVmID09IE5VTEwpCisJCQkJZ290byBi
 YWQ7CisKKwkJCS8qIAorCQkJICogdXBkYXRlIHRoZSBvZmZzZXQgb2Ygc2VjdGlvbiBoZWFkZXIg
 dGFibGUgaW4gZWxmCisJCQkgKiBoZWFkZXIgaWYgbmVlZGVkLgorCQkJICovCisJCQlpZiAobGF5
 b3V0cFtpXS5zaGRyID09ICZzaGRyc2hkciAmJgorCQkJICAgIGVoZHIuZV9zaG9mZiAhPSBzaGRy
 c2hkci5zaF9vZmZzZXQpIHsKKwkJCQllaGRyLmVfc2hvZmYgPSBzaGRyc2hkci5zaF9vZmZzZXQ7
 CisJCQkJb2ZmID0gKEVMRlNJWkUgPT0gMzIpID8gMzIgOiA0NDsKKwkJCQlzaXplID0gc2l6ZW9m
 KEVsZl9PZmYpOworCQkJCWlmICh4d3JpdGVhdG9mZihmZCwgJmVoZHIuZV9zaG9mZiwgb2ZmLCBz
 aXplLAorCQkJCSAgICBmbikgIT0gc2l6ZSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisKKwkJCW9m
 ZiA9IHhld3RvaChsYXlvdXRwW2ldLnNoZHItPnNoX29mZnNldCk7CisJCQlzaXplID0geGV3dG9o
 KGxheW91dHBbaV0uc2hkci0+c2hfc2l6ZSk7CisJCQlpZiAoeHdyaXRlYXRvZmYoZmQsIGJ1Ziwg
 b2ZmLCBzaXplLCBmbikgIT0gc2l6ZSkKKwkJCQlnb3RvIGJhZDsKKwkJfQorCX0KKwogb3V0Ogot
 CWlmIChzaGRycCAhPSBOVUxMKQotCQlmcmVlKHNoZHJwKTsKLQlpZiAoc3ltdGFicCAhPSBOVUxM
 KQotCQlmcmVlKHN5bXRhYnApOwotCWlmIChzdHJ0YWJwICE9IE5VTEwpCi0JCWZyZWUoc3RydGFi
 cCk7CisJaWYgKGxheW91dHAgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgeGUxNnRvaChl
 aGRyLmVfc2hudW0pICsgMTsgaSsrKSB7CisJCQlpZiAobGF5b3V0cFtpXS5idWZwICE9IE5VTEwp
 CisJCQkJZnJlZShsYXlvdXRwW2ldLmJ1ZnApOworCQl9CisJCWZyZWUobGF5b3V0cCk7CisJfQor
 CWlmIChuc3RydGFicCAhPSBOVUxMKQorCQlmcmVlKG5zdHJ0YWJwKTsKIAlyZXR1cm4gKHJ2KTsK
 IAogYmFkOgo=
 --f46d04088e1183a55d04d1088ebb--
Responsible-Changed-From-To: freebsd-bugs->pfg 
Responsible-Changed-By: pfg 
Responsible-Changed-When: Sat Feb 2 19:18:39 UTC 2013 
Responsible-Changed-Why:  
I'll grab this one. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=174011 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/174011: commit references a PR
Date: Sun,  3 Feb 2013 20:35:46 +0000 (UTC)

 Author: pfg
 Date: Sun Feb  3 20:35:37 2013
 New Revision: 246296
 URL: http://svnweb.freebsd.org/changeset/base/246296
 
 Log:
   crunchide(1): support non-custom elf object layout
   
   The crunchide utility presumes the last 3 chunks of an ELF object
   layout are section headers, symbol table, and then string table.
   However, this is  not specified in the ELF standards, and linkers
   may generate different layouts when doing partial linking (-r).
   
   This change is required to build FreeBSD with mclinker or the
   gold linker.
   
   PR:		bin/174011
   Submitted by:	Pete Chou
   Reviewed by:	Cristoph Mallon
   MFC after:	2 weeks
 
 Modified:
   head/usr.sbin/crunch/crunchide/exec_elf32.c
 
 Modified: head/usr.sbin/crunch/crunchide/exec_elf32.c
 ==============================================================================
 --- head/usr.sbin/crunch/crunchide/exec_elf32.c	Sun Feb  3 20:13:33 2013	(r246295)
 +++ head/usr.sbin/crunch/crunchide/exec_elf32.c	Sun Feb  3 20:35:37 2013	(r246296)
 @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
  #include <sys/stat.h>
  
  #include <errno.h>
 +#include <limits.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
 @@ -82,11 +83,9 @@ __FBSDID("$FreeBSD$");
  #define	xe32toh(x)	((data == ELFDATA2MSB) ? be32toh(x) : le32toh(x))
  #define	htoxe32(x)	((data == ELFDATA2MSB) ? htobe32(x) : htole32(x))
  
 -struct listelem {
 -	struct listelem *next;
 -	void *mem;
 -	off_t file;
 -	size_t size;
 +struct shlayout {
 +	Elf_Shdr *shdr;
 +	void *bufp;
  };
  
  static ssize_t
 @@ -235,17 +234,20 @@ int
  ELFNAMEEND(hide)(int fd, const char *fn)
  {
  	Elf_Ehdr ehdr;
 -	Elf_Shdr *shdrp = NULL, *symtabshdr, *strtabshdr;
 +	struct shlayout *layoutp = NULL;
 +	Elf_Shdr *shdrp = NULL, *symtabshdr, *strtabshdr, *shstrtabshdr;
 +	Elf_Shdr shdrshdr;
  	Elf_Sym *symtabp = NULL;
 -	char *strtabp = NULL;
 -	Elf_Size  nsyms, ewi;
 +	char *shstrtabp = NULL, *strtabp = NULL;
 +	Elf_Size nsyms, ewi;
 +	Elf_Off off;
  	ssize_t shdrsize;
 -	int rv, i, weird;
 -	size_t nstrtab_size, nstrtab_nextoff, fn_size;
 +	int rv, i, weird, l, m, r, strtabidx;
 +	size_t nstrtab_size, nstrtab_nextoff, fn_size, size;
  	char *nstrtabp = NULL;
  	unsigned char data;
 -	Elf_Off maxoff, stroff;
  	const char *weirdreason = NULL;
 +	void *buf;
  
  	rv = 0;
  	if (xreadatoff(fd, &ehdr, 0, sizeof ehdr, fn) != sizeof ehdr)
 @@ -260,62 +262,123 @@ ELFNAMEEND(hide)(int fd, const char *fn)
  	    shdrsize)
  		goto bad;
  
 -	symtabshdr = strtabshdr = NULL;
 +	symtabshdr = strtabshdr = shstrtabshdr = NULL;
  	weird = 0;
 -	maxoff = stroff = 0;
  	for (i = 0; i < xe16toh(ehdr.e_shnum); i++) {
 -		if (xewtoh(shdrp[i].sh_offset) > maxoff)
 -			maxoff = xewtoh(shdrp[i].sh_offset);
  		switch (xe32toh(shdrp[i].sh_type)) {
  		case SHT_SYMTAB:
 -			if (symtabshdr != NULL)
 +			if (symtabshdr != NULL) {
  				weird = 1;
 +				weirdreason = "multiple symbol tables";
 +			}
  			symtabshdr = &shdrp[i];
  			strtabshdr = &shdrp[xe32toh(shdrp[i].sh_link)];
 -
 -			/* Check whether the string table is the last section */
 -			stroff = xewtoh(shdrp[xe32toh(shdrp[i].sh_link)].sh_offset);
 -			if (!weird && xe32toh(shdrp[i].sh_link) != (xe16toh(ehdr.e_shnum) - 1)) {
 -				weird = 1;
 -				weirdreason = "string table not last section";
 -			}
 +			break;
 +		case SHT_STRTAB:
 +			if (i == xe16toh(ehdr.e_shstrndx))
 +				shstrtabshdr = &shdrp[i];
  			break;
  		}
  	}
 -	if (! weirdreason)
 -		weirdreason = "unsupported";
  	if (symtabshdr == NULL)
  		goto out;
 -	if (strtabshdr == NULL)
 +	if (strtabshdr == NULL) {
  		weird = 1;
 -	if (!weird && stroff != maxoff) {
 +		weirdreason = "string table does not exist";
 +	}
 +	if (shstrtabshdr == NULL) {
  		weird = 1;
 -		weirdreason = "string table section not last in file";
 -	}   
 +		weirdreason = "section header string table does not exist";
 +	}
 +	if (weirdreason == NULL)
 +		weirdreason = "unsupported";
  	if (weird) {
  		fprintf(stderr, "%s: weird executable (%s)\n", fn, weirdreason);
  		goto bad;
  	}
  
  	/*
 +	 * sort section layout table by offset
 +	 */
 +	layoutp = xmalloc(sizeof(struct shlayout) * (xe16toh(ehdr.e_shnum) + 1),
 +	    fn, "layout table");
 +	if (layoutp == NULL)
 +		goto bad;
 +
 +	/* add a pseudo entry to represent the section header table */
 +	shdrshdr.sh_offset = ehdr.e_shoff;
 +	shdrshdr.sh_size = htoxew(shdrsize);
 +	shdrshdr.sh_addralign = htoxew(ELFSIZE / 8);
 +	layoutp[xe16toh(ehdr.e_shnum)].shdr = &shdrshdr;
 +
 +	/* insert and sort normal section headers */
 +	for (i = xe16toh(ehdr.e_shnum) - 1; i >= 0; i--) {
 +		l = i + 1;
 +		r = xe16toh(ehdr.e_shnum);
 +		while (l <= r) {
 +			m = ( l + r) / 2;
 +			if (xewtoh(shdrp[i].sh_offset) >
 +			    xewtoh(layoutp[m].shdr->sh_offset))
 +				l = m + 1;
 +			else
 +				r = m - 1;
 +		}
 +
 +		if (r != i) {
 +			memmove(&layoutp[i], &layoutp[i + 1],
 +			    sizeof(struct shlayout) * (r - i));
 +		}
 +
 +		layoutp[r].shdr = &shdrp[i];
 +		layoutp[r].bufp = NULL;
 +	}
 +
 +	/*
  	 * load up everything we need
  	 */
  
 -	/* symbol table */
 -	if ((symtabp = xmalloc(xewtoh(symtabshdr->sh_size), fn, "symbol table"))
 -	    == NULL)
 -		goto bad;
 -	if ((size_t)xreadatoff(fd, symtabp, xewtoh(symtabshdr->sh_offset),
 -	    xewtoh(symtabshdr->sh_size), fn) != xewtoh(symtabshdr->sh_size))
 +	/* load section string table for debug use */
 +	if ((shstrtabp = xmalloc(xewtoh(shstrtabshdr->sh_size), fn,
 +	    "section string table")) == NULL)
 +		goto bad;
 +	if ((size_t)xreadatoff(fd, shstrtabp, xewtoh(shstrtabshdr->sh_offset),
 +	    xewtoh(shstrtabshdr->sh_size), fn) != xewtoh(shstrtabshdr->sh_size))
  		goto bad;
  
 -	/* string table */
 -	if ((strtabp = xmalloc(xewtoh(strtabshdr->sh_size), fn, "string table"))
 -	    == NULL)
 -		goto bad;
 -	if ((size_t)xreadatoff(fd, strtabp, xewtoh(strtabshdr->sh_offset),
 -	    xewtoh(strtabshdr->sh_size), fn) != xewtoh(strtabshdr->sh_size))
 -		goto bad;
 +	/* we need symtab, strtab, and everything behind strtab */
 +	strtabidx = INT_MAX;
 +	for (i = 0; i < xe16toh(ehdr.e_shnum) + 1; i++) {
 +		if (layoutp[i].shdr == &shdrshdr) {
 +			/* not load section header again */
 +			layoutp[i].bufp = shdrp;
 +			continue;
 +		}
 +		if (layoutp[i].shdr == shstrtabshdr) {
 +			/* not load section string table again */
 +			layoutp[i].bufp = shstrtabp;
 +			continue;
 +		}
 +
 +		if (layoutp[i].shdr == strtabshdr)
 +			strtabidx = i;
 +		if (layoutp[i].shdr == symtabshdr || i >= strtabidx) {
 +			off = xewtoh(layoutp[i].shdr->sh_offset);
 +			size = xewtoh(layoutp[i].shdr->sh_size);
 +			layoutp[i].bufp = xmalloc(size, fn,
 +			    shstrtabp + xewtoh(layoutp[i].shdr->sh_name));
 +			if (layoutp[i].bufp == NULL)
 +				goto bad;
 +			if ((size_t)xreadatoff(fd, layoutp[i].bufp, off, size, fn) !=
 +			    size)
 +				goto bad;
 +
 +			/* set symbol table and string table */
 +			if (layoutp[i].shdr == symtabshdr)
 +				symtabp = layoutp[i].bufp;
 +			else if (layoutp[i].shdr == strtabshdr)
 +				strtabp = layoutp[i].bufp;
 +		}
 +	}
  
  	nstrtab_size = 256;
  	nstrtabp = xmalloc(nstrtab_size, fn, "new string table");
 @@ -365,28 +428,62 @@ ELFNAMEEND(hide)(int fd, const char *fn)
  	strtabshdr->sh_size = htoxew(nstrtab_nextoff);
  
  	/*
 -	 * write new tables to the file
 +	 * update section header table in ascending order of offset
  	 */
 -	if (xwriteatoff(fd, shdrp, xewtoh(ehdr.e_shoff), shdrsize, fn) !=
 -	    shdrsize)
 -		goto bad;
 -	if ((size_t)xwriteatoff(fd, symtabp, xewtoh(symtabshdr->sh_offset),
 -	    xewtoh(symtabshdr->sh_size), fn) != xewtoh(symtabshdr->sh_size))
 -		goto bad;
 -	/* write new symbol table strings */
 -	if ((size_t)xwriteatoff(fd, nstrtabp, xewtoh(strtabshdr->sh_offset),
 -	    xewtoh(strtabshdr->sh_size), fn) != xewtoh(strtabshdr->sh_size))
 -		goto bad;
 +	for (i = strtabidx + 1; i < xe16toh(ehdr.e_shnum) + 1; i++) {
 +		Elf_Off off, align;
 +		off = xewtoh(layoutp[i - 1].shdr->sh_offset) +
 +		    xewtoh(layoutp[i - 1].shdr->sh_size);
 +		align = xewtoh(layoutp[i].shdr->sh_addralign);
 +		off = (off + (align - 1)) & ~(align - 1);
 +		layoutp[i].shdr->sh_offset = htoxew(off);
 +	}
 +
 +	/*
 +	 * write data to the file in descending order of offset
 +	 */
 +	for (i = xe16toh(ehdr.e_shnum); i >= 0; i--) {
 +		if (layoutp[i].shdr == strtabshdr) {
 +			/* new string table */
 +			buf = nstrtabp;
 +		} else
 +			buf = layoutp[i].bufp;
 +
 +		if (layoutp[i].shdr == &shdrshdr ||
 +		    layoutp[i].shdr == symtabshdr || i >= strtabidx) {
 +			if (buf == NULL)
 +				goto bad;
 +
 +			/*
 +			 * update the offset of section header table in elf
 +			 * header if needed.
 +			 */
 +			if (layoutp[i].shdr == &shdrshdr &&
 +			    ehdr.e_shoff != shdrshdr.sh_offset) {
 +				ehdr.e_shoff = shdrshdr.sh_offset;
 +				off = (ELFSIZE == 32) ? 32 : 44;
 +				size = sizeof(Elf_Off);
 +				if ((size_t)xwriteatoff(fd, &ehdr.e_shoff, off, size,
 +				    fn) != size)
 +					goto bad;
 +			}
 +
 +			off = xewtoh(layoutp[i].shdr->sh_offset);
 +			size = xewtoh(layoutp[i].shdr->sh_size);
 +			if ((size_t)xwriteatoff(fd, buf, off, size, fn) != size)
 +				goto bad;
 +		}
 +	}
  
  out:
 -	if (shdrp != NULL)
 -		free(shdrp);
 -	if (symtabp != NULL)
 -		free(symtabp);
 -	if (strtabp != NULL)
 -		free(strtabp);
 -	if (nstrtabp != NULL)
 -		free(nstrtabp);
 +	if (layoutp != NULL) {
 +		for (i = 0; i < xe16toh(ehdr.e_shnum) + 1; i++) {
 +			if (layoutp[i].bufp != NULL)
 +				free(layoutp[i].bufp);
 +		}
 +		free(layoutp);
 +	}
 +	free(nstrtabp);
  	return (rv);
  
  bad:
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: open->patched 
State-Changed-By: pfg 
State-Changed-When: Sun Feb 3 20:42:24 UTC 2013 
State-Changed-Why:  
Committed in -current. 
Special thanks to: 
Erik Cederstand for pushing the patches, 
Christoph Mallon for Review and cleanups, 
Eitan Adler for suggesting an improvement, 
and of course to Pete for submitting the patch. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=174011 
State-Changed-From-To: patched->closed 
State-Changed-By: pfg 
State-Changed-When: Mon Feb 18 21:18:14 UTC 2013 
State-Changed-Why:  
Committed and MFC/9. 
Thank you for your contribution! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=174011 
>Unformatted:
