summaryrefslogtreecommitdiff
path: root/usr/src/tools/ctf
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/tools/ctf')
-rw-r--r--usr/src/tools/ctf/Makefile3
-rw-r--r--usr/src/tools/ctf/common/ctf_headers.h13
-rw-r--r--usr/src/tools/ctf/common/utils.h3
-rw-r--r--usr/src/tools/ctf/ctfstrip/Makefile45
-rw-r--r--usr/src/tools/ctf/ctfstrip/ctfstrip.c155
-rw-r--r--usr/src/tools/ctf/cvt/ctftools.h13
6 files changed, 224 insertions, 8 deletions
diff --git a/usr/src/tools/ctf/Makefile b/usr/src/tools/ctf/Makefile
index 3128f64e1f..0746c4943f 100644
--- a/usr/src/tools/ctf/Makefile
+++ b/usr/src/tools/ctf/Makefile
@@ -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)
diff --git a/usr/src/tools/ctf/common/ctf_headers.h b/usr/src/tools/ctf/common/ctf_headers.h
index b00b8fd9a6..268ae79077 100644
--- a/usr/src/tools/ctf/common/ctf_headers.h
+++ b/usr/src/tools/ctf/common/ctf_headers.h
@@ -27,8 +27,6 @@
#ifndef _CTF_HEADERS_H
#define _CTF_HEADERS_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* Because the ON tools are executed on the system where they are built,
* the tools need to include the headers installed on the build system,
@@ -69,4 +67,15 @@
#include <uts/common/sys/ctf_api.h>
#include <lib/libctf/common/libctf.h>
+/*
+ * XXX: This is hack to deal with GCC 4.x removing __builtin_stdarg_start
+ *
+ * We need to build on systems that don't have the fixed va_impl.h on the
+ * system, to achieve that, we stub it out here and in all similar places to
+ * give us a leg up.
+ */
+#if __GNUC__ >= 4
+#define __builtin_stdarg_start(list, name) __builtin_va_start(list, name)
+#endif
+
#endif /* _CTF_HEADERS_H */
diff --git a/usr/src/tools/ctf/common/utils.h b/usr/src/tools/ctf/common/utils.h
index 9b07361a53..4ae2dd0917 100644
--- a/usr/src/tools/ctf/common/utils.h
+++ b/usr/src/tools/ctf/common/utils.h
@@ -27,9 +27,8 @@
#ifndef _UTILS_H
#define _UTILS_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <stdarg.h>
+#include <ctf_headers.h>
#ifdef __cplusplus
extern "C" {
diff --git a/usr/src/tools/ctf/ctfstrip/Makefile b/usr/src/tools/ctf/ctfstrip/Makefile
new file mode 100644
index 0000000000..d28a9e925e
--- /dev/null
+++ b/usr/src/tools/ctf/ctfstrip/Makefile
@@ -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
diff --git a/usr/src/tools/ctf/ctfstrip/ctfstrip.c b/usr/src/tools/ctf/ctfstrip/ctfstrip.c
new file mode 100644
index 0000000000..a14e8d5957
--- /dev/null
+++ b/usr/src/tools/ctf/ctfstrip/ctfstrip.c
@@ -0,0 +1,155 @@
+/*
+ * 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);
+}
diff --git a/usr/src/tools/ctf/cvt/ctftools.h b/usr/src/tools/ctf/cvt/ctftools.h
index 991f3bc921..f586236ccf 100644
--- a/usr/src/tools/ctf/cvt/ctftools.h
+++ b/usr/src/tools/ctf/cvt/ctftools.h
@@ -26,8 +26,6 @@
#ifndef _CTFTOOLS_H
#define _CTFTOOLS_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* Functions and data structures used in the manipulation of stabs and CTF data
*/
@@ -43,6 +41,17 @@
extern "C" {
#endif
+/*
+ * XXX: This is hack to deal with GCC 4.x removing __builtin_stdarg_start
+ *
+ * We need to build on systems that don't have the fixed va_impl.h on the
+ * system, to achieve that, we stub it out here and in all similar places to
+ * give us a leg up.
+ */
+#if __GNUC__ >= 4
+#define __builtin_stdarg_start(list, name) __builtin_va_start(list, name)
+#endif
+
#include "list.h"
#include "hash.h"