changeset 13815:61cf2631639d

2224 closed-bins should be stripped of CTF Reviewed by: Andrew Stormont <Andrew.Stormont@nexenta.com> Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com> Approved by: Robert Mustacchi <rm@joyent.com>
author Jason King <jason.brian.king@gmail.com>
date Fri, 14 Sep 2012 12:26:23 -0400
parents 829c00a55a37
children 38db9df20f58
files usr/src/Makefile usr/src/Makefile.master usr/src/pkg/manifests/developer-build-onbld.mf usr/src/tools/ctf/Makefile usr/src/tools/ctf/ctfstrip/Makefile usr/src/tools/ctf/ctfstrip/ctfstrip.c
diffstat 6 files changed, 208 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/Makefile	Wed Aug 22 13:03:31 2012 +0000
+++ b/usr/src/Makefile	Fri Sep 14 12:26:23 2012 -0400
@@ -125,7 +125,7 @@
 
 clean clobber: $(SUBDIRS) head pkg
 
-closedbins: FRC $(ROOTDIRS)
+closedbins: bldtools $(ROOTDIRS) FRC
 	@CLOSED_ROOT="$$ON_CLOSED_BINS/root_$(MACH)$${RELEASE_BUILD+-nd}"; \
 	if [ "$$CLOSED_IS_PRESENT" = no ]; then \
 		if [ ! -d "$$CLOSED_ROOT" ]; then \
@@ -139,6 +139,9 @@
 		(cd $$CLOSED_ROOT; \
 		    $(TAR) cfX - $(CODEMGR_WS)/exception_lists/closed-bins .) | \
 		    (cd $(ROOT); $(TAR) xBpf -); \
+		( cd $(ROOT); $(CTFSTRIP) $$(cd $$CLOSED_ROOT; $(FIND) \
+		    ./kernel ./usr/kernel ./platform/*/kernel -type f -a -perm -u+x | \
+		    $(EGREP) -vf $(CODEMGR_WS)/exception_lists/closed-bins) ); \
 	fi
 
 #
--- a/usr/src/Makefile.master	Wed Aug 22 13:03:31 2012 +0000
+++ b/usr/src/Makefile.master	Fri Sep 14 12:26:23 2012 -0400
@@ -193,6 +193,7 @@
 CTFCONVERT=	$(ONBLD_TOOLS)/bin/$(MACH)/ctfconvert
 CTFMERGE=	$(ONBLD_TOOLS)/bin/$(MACH)/ctfmerge
 CTFSTABS=	$(ONBLD_TOOLS)/bin/$(MACH)/ctfstabs
+CTFSTRIP=	$(ONBLD_TOOLS)/bin/$(MACH)/ctfstrip
 NDRGEN=		$(ONBLD_TOOLS)/bin/$(MACH)/ndrgen
 GENOFFSETS=	$(ONBLD_TOOLS)/bin/genoffsets
 CTFCVTPTBL=	$(ONBLD_TOOLS)/bin/ctfcvtptbl
--- a/usr/src/pkg/manifests/developer-build-onbld.mf	Wed Aug 22 13:03:31 2012 +0000
+++ b/usr/src/pkg/manifests/developer-build-onbld.mf	Fri Sep 14 12:26:23 2012 -0400
@@ -67,6 +67,7 @@
 file path=opt/onbld/bin/$(ARCH)/ctfdump mode=0555
 file path=opt/onbld/bin/$(ARCH)/ctfmerge mode=0555
 file path=opt/onbld/bin/$(ARCH)/ctfstabs mode=0555
+file path=opt/onbld/bin/$(ARCH)/ctfstrip mode=0555
 file path=opt/onbld/bin/$(ARCH)/cw mode=0555
 $(i386_ONLY)file path=opt/onbld/bin/$(ARCH)/elfextract mode=0555
 file path=opt/onbld/bin/$(ARCH)/findunref mode=0555
--- a/usr/src/tools/ctf/Makefile	Wed Aug 22 13:03:31 2012 +0000
+++ b/usr/src/tools/ctf/Makefile	Fri Sep 14 12:26:23 2012 -0400
@@ -23,11 +23,10 @@
 # Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
-#ident	"%Z%%M%	%I%	%E% SMI"
 
 include ../Makefile.tools
 
-SUBDIRS = cvt dump stabs scripts
+SUBDIRS = cvt dump stabs scripts ctfstrip
 
 .PARALLEL: $(SUBDIRS)
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/tools/ctf/ctfstrip/Makefile	Fri Sep 14 12:26:23 2012 -0400
@@ -0,0 +1,45 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source.  A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+.KEEP_STATE:
+
+PROG = ctfstrip
+SRCS = \
+	ctfstrip.c
+
+CFLAGS += $(CCVERBOSE)
+include $(SRC)/tools/Makefile.tools
+
+OBJS = $(SRCS:%.c=%.o)
+LINTFILES = $(SRCS:%.c=%.ln)
+
+LINTFLAGS = -mnux -L$(ROOT)/usr/lib
+
+.NO_PARALLEL:
+.PARALLEL: $(OBJS) $(LINTFILES)
+
+all: $(PROG)
+
+$(PROG): $(OBJS)
+	$(LINK.c) $(OBJS) -o $@ $(LDLIBS)
+	$(POST_PROCESS)
+
+$(ROOTONBLDMACHPROG): $(PROG)
+
+install: $(ROOTONBLDMACHPROG)
+
+clean:
+	$(RM) $(OBJS) $(LINTFILES)
+
+lint: $(LINTFILES)
+	$(LINT) $(LINTFLAGS) $(LINTFILES) $(LDLIBS)
+
+include $(SRC)/tools/Makefile.targ
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/tools/ctf/ctfstrip/ctfstrip.c	Fri Sep 14 12:26:23 2012 -0400
@@ -0,0 +1,156 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source.  A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2011 Jason King.  All rights reserved.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <err.h>
+#include <spawn.h>
+
+#define	MCS	"/usr/bin/mcs"
+
+#define	ELFLEN 4
+static const char elf_signature[] = "\177ELF";
+static posix_spawnattr_t attr;
+static const char *cmd[] = { MCS, "-d", "-n", ".SUNW_ctf", NULL, NULL };
+
+extern char **environ;
+
+static boolean_t check_file(const char *, mode_t *);
+static boolean_t fix_file(const char *, mode_t);
+static void usage(const char *);
+
+int
+main(int argc, const char **argv)
+{
+	const char **p;
+	int rc = 0;
+	mode_t mode;
+
+	if (argc < 2)
+		usage(argv[0]);
+
+	rc = posix_spawnattr_init(&attr);
+	if (rc != 0) {
+		errx(EXIT_FAILURE, "Spawn attribute initialization failed: %s",
+		    strerror(rc));
+	}
+
+	for (p = argv + 1; *p != NULL; p++) {
+		if (!check_file(*p, &mode))
+			continue;
+		if (!fix_file(*p, mode))
+			rc = 1;
+	}
+
+	return (rc);
+}
+
+static boolean_t
+check_file(const char *filename, mode_t *mode)
+{
+	char elfbuf[4];
+	struct stat sb;
+	int fd;
+
+	fd = open(filename, O_RDONLY);
+	if (fd == -1) {
+		warn("Unable to open %s", filename);
+		return (B_FALSE);
+	}
+
+	if (fstat(fd, &sb) == -1) {
+		warn("stat(2) failed on %s", filename);
+		(void) close(fd);
+		return (B_FALSE);
+	}
+
+	if (!S_ISREG(sb.st_mode)) {
+		warnx("%s is not a regular file", filename);
+		(void) close(fd);
+		return (B_FALSE);
+	}
+
+	if (sb.st_size < ELFLEN) {
+		warnx("%s is not an ELF file", filename);
+		(void) close(fd);
+		return (B_FALSE);
+	}
+
+	if (read(fd, elfbuf, ELFLEN) != ELFLEN) {
+		warn("Error reading %s", filename);
+		(void) close(fd);
+		return (B_FALSE);
+	}
+
+	if (strncmp(elfbuf, elf_signature, ELFLEN) != 0) {
+		warnx("%s is not an ELF file", filename);
+		(void) close(fd);
+		return (B_FALSE);
+	}
+
+	*mode = sb.st_mode & S_IAMB;
+	(void) close(fd);
+	return (B_TRUE);
+}
+
+static boolean_t
+fix_file(const char *filename, mode_t mode)
+{
+	pid_t pid;
+	int i, rc;
+	int stat = 0;
+
+	if ((mode & S_IWUSR) == 0) {
+		if (chmod(filename, mode | S_IWUSR) == -1) {
+			warn("failed to make %s writable", filename);
+			return (B_FALSE);
+		}
+	}
+
+	cmd[4] = filename;
+	if ((rc = posix_spawn(&pid, MCS, NULL, &attr,
+	    (char *const *)cmd, environ)) != 0) {
+		warnx("could not exec mcs: %s", strerror(rc));
+		return (B_FALSE);
+	}
+
+	waitpid(pid, &stat, 0);
+	if (!WIFEXITED(stat) || WEXITSTATUS(stat) != 0) {
+		warnx("Removing CTF information from %s failed", filename);
+		return (B_FALSE);
+	}
+
+	if ((mode & S_IWUSR) == 0) {
+		if (chmod(filename, mode) == -1) {
+			warn("could not reset permissions of %s", filename);
+			return (B_FALSE);
+		}
+	}
+
+	return (B_TRUE);
+}
+
+static void
+usage(const char *name)
+{
+	(void) fprintf(stderr, "Usage: %s file...\n", name);
+	exit(EXIT_FAILURE);
+}