[DTrace-devel] [PATCH v2 01/11] cmd: delete ctf_module_dump

Nick Alcock nick.alcock at oracle.com
Wed Oct 20 11:53:54 PDT 2021


This tool was useful back in the day because it knew how to read CTF
that was dumped into kernel modules, digging out the shared CTF
dict and built-in module info from the fake ctf.ko module and
passing it to ctf_dump.

But it is 2021.  We haven't linked CTF into in-tree kernel modules since
UEK4 in 2017 (4.1.12-113, libdtrace-ctf 0.7).  Every tool needed for
this is obsolete, including libdtrace-ctf's ctf_dump; and objdump does
just as good a job of dumping modules as this tool (or, actually, given
that it can't dump raw .ctfa files yet, just as bad a job; but this will
be fixed soon and is easily workable around with a single objcopy call
even now).  Also ctf_module_dump is getting in the way of
representational improvements to the kernel module tracking.

So drop ctf_module_dump.

Signed-off-by: Nick Alcock <nick.alcock at oracle.com>
Suggested-by: Eugene Loh <eugene.loh at oracle.com>
---
 cmd/Build             |  16 +--
 cmd/ctf_module_dump.c | 314 ------------------------------------------
 2 files changed, 1 insertion(+), 329 deletions(-)
 delete mode 100644 cmd/ctf_module_dump.c

diff --git a/cmd/Build b/cmd/Build
index bde7debeea89..bfeab8f103eb 100644
--- a/cmd/Build
+++ b/cmd/Build
@@ -3,7 +3,7 @@
 # Licensed under the Universal Permissive License v 1.0 as shown at
 # http://oss.oracle.com/licenses/upl.
 
-CMDS += dtrace ctf_module_dump bpf_dump
+CMDS += dtrace bpf_dump
 dtrace_CPPFLAGS = -Ilibdtrace -Ilibproc -D_LONGLONG_TYPE \
 	-DDTRACE_LIBDIR="\"$(LIBDIR)/dtrace\""
 dtrace_TARGET = dtrace
@@ -17,18 +17,6 @@ else
 dtrace_LIBS = -ldtrace -ldtrace-ctf -lport -lelf
 endif
 
-ctf_module_dump_CPPFLAGS = -Ilibdtrace -Ilibproc -D_LONGLONG_TYPE
-ctf_module_dump_TARGET = ctf_module_dump
-ctf_module_dump_DIR := $(current-dir)
-ctf_module_dump_SOURCES = ctf_module_dump.c
-ctf_module_dump_DEPS = libdtrace.so libport.a
-ctf_module_dump_SRCDEPS := $(objdir)/dt_git_version.h
-ifdef HAVE_LIBCTF
-ctf_module_dump_LIBS = -ldtrace -lctf -lelf
-else
-ctf_module_dump_LIBS = -ldtrace -ldtrace-ctf -lelf
-endif
-
 bpf_dump_CPPFLAGS =
 bpf_dump_TARGET = bpf_dump
 bpf_dump_DIR := $(current-dir)
@@ -57,7 +45,5 @@ install::
 	      $(INSTLIBDIR)/dtrace
 	$(call describe-install-target,$(INSTSBINDIR),dtrace)
 	install -m 755 $(objdir)/dtrace $(INSTSBINDIR)
-	$(call describe-install-target,$(INSTBINDIR),ctf_module_dump)
-	install -m 755 $(objdir)/ctf_module_dump $(INSTBINDIR)
 	$(call describe-install-target,$(INSTMANDIR),dtrace.1)
 	install -m 644 $(dtrace_DIR)/dtrace.1 $(INSTMANDIR)
diff --git a/cmd/ctf_module_dump.c b/cmd/ctf_module_dump.c
deleted file mode 100644
index b31110432e05..000000000000
--- a/cmd/ctf_module_dump.c
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Oracle Linux DTrace.
- * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
- * Licensed under the Universal Permissive License v 1.0 as shown at
- * http://oss.oracle.com/licenses/upl.
- */
-
-#include <sys/utsname.h>
-#include <errno.h>
-#include <libelf.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <port.h>
-#include <unistd.h>
-
-#include <dt_kernel_module.h>
-
-#define BUCKETS 211
-
-extern int optind;
-
-static const char *default_module_root = "/lib/modules/";
-static dtrace_hdl_t dt;
-static dtrace_hdl_t *dtp = &dt;
-
-
-/*
- * Override the dt_dprintf() in libdtrace with one that doesn't pull in half the
- * library, and emits errors as errors.
- */
-_dt_printflike_(1,2)
-void
-dt_dprintf(const char *format, ...)
-{
-	va_list alist;
-
-	va_start(alist, format);
-	vfprintf(stderr, format, alist);
-	va_end(alist);
-}
-
-static void
-usage(int argc, char *argv[])
-{
-	printf("Syntax: %s [-r kernel-version] [-m module-root] ctf...\n\n", argv[0]);
-}
-
-/*
- * Load the section with the given name from the given ELF file and write it out
- * to a new temporary file.
- */
-static FILE *
-load_sect(const char *elf, const char *name)
-{
-	const char *s;
-	Elf *efp;
-	int fd;
-	FILE *outfp;
-	size_t shstrs;
-	GElf_Shdr sh;
-	Elf_Data *dp;
-	Elf_Scn *sp;
-
-	if ((fd = open(elf, O_RDONLY)) < 0) {
-		fprintf(stderr, "Failed to open %s: %s\n",
-		    elf, strerror(errno));
-		return NULL;
-	}
-
-	/*
-	 * Use ELF_C_READ_MMAP purely because DTrace does.
-	 */
-	if ((efp = elf_begin(fd, ELF_C_READ_MMAP, NULL)) == NULL) {
-		fprintf(stderr, "Unexpected error from elf_begin(): %s\n",
-			elf_errmsg(elf_errno()));
-		return NULL;
-	}
-
-	if (elf_getshdrstrndx(efp, &shstrs) == -1) {
-		fprintf(stderr, "Unexpected error from elf_getshdrstrndx(): "
-		    "%s\n", elf_errmsg(elf_errno()));
-		exit(1);
-	}
-
-	for (sp = NULL; (sp = elf_nextscn(efp, sp)) != NULL; ) {
-		if (gelf_getshdr(sp, &sh) == NULL || sh.sh_type == SHT_NULL ||
-		    (s = elf_strptr(efp, shstrs, sh.sh_name)) == NULL)
-			continue; /* skip any malformed sections */
-
-		if (strcmp(s, name) == 0)
-			break; /* section matches specification */
-	}
-
-	/*
-	 * If the section isn't found, return NULL.
-	 */
-	if (sp == NULL || (dp = elf_getdata(sp, NULL)) == NULL) {
-		fprintf(stderr, "%s: section %s not found.\n", elf, name);
-		elf_end(efp);
-		return NULL;
-	}
-
-	if ((outfp = tmpfile()) == NULL) {
-		fprintf(stderr, "Cannot open temporary file: %s\n",
-		    strerror(errno));
-		exit(1);
-	}
-	if (fwrite(dp->d_buf, dp->d_size, 1, outfp) < 1) {
-		fprintf(stderr, "Cannot write to temporary file: %s\n",
-		    strerror(errno));
-		exit(1);
-	}
-
-	elf_end(efp);
-	rewind(outfp);
-	return outfp;
-}
-
-/*
- * Find and return the compressed CTF content of a module in a new temporary
- * file; if NULL, find the parent module.
- */
-static FILE *
-find_module_ctf(const char *name)
-{
-	dt_kern_path_t *dkpp = NULL;
-	int shared_module = 0;
-	char *secname;
-	FILE *fp;
-
-	/*
-	 * Non-parent module?  Dig it out.
-	 */
-	if (name != NULL)
-		dkpp = dtrace__internal_kern_path_lookup_by_name(dtp, name);
-
-	if (!dkpp) {
-		shared_module = 1;
-		dkpp = dtrace__internal_kern_path_lookup_by_name(dtp, "ctf");
-	}
-
-	if (!dkpp) {
-		fprintf(stderr, "Cannot find kernel module %s.\n",
-		    name?name:"ctf");
-		return NULL;
-	}
-
-	if (!shared_module)
-		secname = strdup(".ctf");
-	else if (shared_module && name == NULL)
-		secname = strdup(".ctf.shared_ctf");
-	else {
-		secname = malloc(strlen(".ctf.") + strlen(name) + 1);
-		strcpy(secname, ".ctf.");
-		strcat(secname, name);
-	}
-
-	if (secname == NULL) {
-		fprintf(stderr, "Out of memory\n");
-		exit(1);
-	}
-
-	fp = load_sect(dkpp->dkp_path, secname);
-	free(secname);
-	return fp;
-}
-
-/*
- * Dump the CTF in the given module.
- */
-static void
-ctf_module_dump(const char *name)
-{
-	FILE *parent_fp = find_module_ctf(NULL);
-	FILE *child_fp = NULL;
-
-	int parent_fd, child_fd;
-
-	if (!parent_fp)
-		return;
-
-	parent_fd = fileno(parent_fp);
-
-        printf("\nModule: %s\n", name);
-	fflush(stdout);
-
-	if (strcmp(name, "ctf") != 0) {
-		child_fp = find_module_ctf(name);
-
-		if (!child_fp) {
-			fclose(parent_fp);
-			return;
-		}
-
-		child_fd = fileno(child_fp);
-	}
-
-	/*
-	 * Now we have everything open in temporary files, fork off ctf_dump and
-	 * point it at those temporary files.
-	 */
-	switch (fork()) {
-	case 0:
-	{
-		char pfname[PATH_MAX];
-		char cfname[PATH_MAX];
-
-		sprintf(pfname, "/proc/self/fd/%i", parent_fd);
-
-		if (!child_fp) {
-			execlp("ctf_dump", "ctf_dump", "-q", pfname, NULL);
-		} else {
-			sprintf(cfname, "/proc/self/fd/%i", child_fd);
-			execlp("ctf_dump", "ctf_dump", "-nq", "-p", pfname,
-			    cfname, NULL);
-		}
-		fprintf(stderr, "Cannot execute ctf_dump: %s\n",
-		    strerror(errno));
-		_exit(1);
-	}
-	case -1: perror ("fork()");
-		break;
-	default:
-		wait(NULL);
-	}
-
-	fclose(parent_fp);
-
-	if (child_fp)
-		fclose(child_fp);
-
-	return;
-}
-
-int
-main(int argc, char *argv[])
-{
-	char *module_root = NULL;
-	char modpath[PATH_MAX];
-	char *revno = NULL;
-	struct utsname uts;
-	int opt;
-	dt_kern_path_t *dkpp;
-
-	elf_version(EV_CURRENT);
-
-	if (elf_errno()) {
-		fprintf(stderr, "Version synchronization fault: %s\n",
-			elf_errmsg(elf_errno()));
-		exit(1);
-	}
-
-	while ((opt = getopt(argc, argv, "hm:r:")) != -1) {
-		switch (opt) {
-		case 'h':
-			usage(argc, argv);
-			exit(1);
-		case 'r':
-			revno = strdup(optarg);
-			break;
-		case 'm':
-			module_root = strdup(optarg);
-			break;
-		}
-	}
-
-	if (argc == 0 || argc == optind) {
-		usage(argc, argv);
-		exit(1);
-	}
-
-	/*
-	 * Without a module root, construct one from the default module root
-	 * and the kernel version number or -r argument.
-	 */
-	if (!module_root) {
-		strcpy(modpath, default_module_root);
-
-		if (!revno) {
-			uname(&uts);
-			strcat(modpath, uts.release);
-		} else
-			strcat(modpath, revno);
-	} else
-		strcat(modpath, module_root);
-
-	/*
-	 * Construct a skeletal dtrace_hdl, enough to make the module path
-	 * searching code happy.
-	 */
-	dtp->dt_kernpathbuckets = BUCKETS;
-	dtp->dt_kernpaths = calloc(dtp->dt_kernpathbuckets, sizeof(dt_kern_path_t *));
-	dtp->dt_module_path = strdup(modpath);
-
-	if (dtp->dt_kernpaths == NULL ||
-	    dtp->dt_module_path == NULL) {
-		fprintf(stderr, "Out of memory\n");
-		exit(1);
-	}
-
-	while (optind < argc)
-		ctf_module_dump(argv[optind++]);
-
-	while ((dkpp = dt_list_next(&dtp->dt_kernpathlist)) != NULL)
-		dtrace__internal_kern_path_destroy(dtp, dkpp);
-
-	free(dtp->dt_kernpaths);
-	free(revno);
-	free(module_root);
-
-	return 0;
-}
-- 
2.33.1.257.g9e0974a4e8




More information about the DTrace-devel mailing list