diff options
author | ahl <none@none> | 2005-07-20 01:15:45 -0700 |
---|---|---|
committer | ahl <none@none> | 2005-07-20 01:15:45 -0700 |
commit | 0b38a8bdfd75ac6144f9d462bb38d0c1b3f0ca50 (patch) | |
tree | b1914d8b26048f30b052b54b9625a9f6f8d153ca /usr/src/cmd/dtrace/dtrace.c | |
parent | b52a2671b74561fd8e88284bba4b0b834687951e (diff) | |
download | illumos-joyent-0b38a8bdfd75ac6144f9d462bb38d0c1b3f0ca50.tar.gz |
4970475 There should be a stackdepth equivalent for userland
5084954 value of dip can be incorrect in autovec
6181505 dtrace sysinfo:::modload probe does not fire when using 'modload'
6265417 schedctl-yield isn't listed in sdt_subr.c
6272558 gcc and dtrace don't get along
6276101 dtrace -G behaves strangely with multiple scripts
6284880 intrstat can leak dynamic variable state
6295662 plockstat needs more characters for stack addresses
6296903 invalid memory accesses clear other DTrace error bits
Diffstat (limited to 'usr/src/cmd/dtrace/dtrace.c')
-rw-r--r-- | usr/src/cmd/dtrace/dtrace.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/usr/src/cmd/dtrace/dtrace.c b/usr/src/cmd/dtrace/dtrace.c index 7c9afbedea..a88aa26273 100644 --- a/usr/src/cmd/dtrace/dtrace.c +++ b/usr/src/cmd/dtrace/dtrace.c @@ -51,6 +51,7 @@ typedef struct dtrace_cmd { const char *dc_name; /* name for error messages */ const char *dc_desc; /* desc for error messages */ dtrace_prog_t *dc_prog; /* program compiled from arg */ + char dc_ofile[PATH_MAX]; /* derived output file name */ } dtrace_cmd_t; #define DMODE_VERS 0 /* display version information and exit (-V) */ @@ -616,25 +617,24 @@ anon_prog(const dtrace_cmd_t *dcp, dof_hdr_t *dof, int n) * file name. Otherwise we use "d.out" as the default output file name. */ static void -link_prog(const dtrace_cmd_t *dcp) +link_prog(dtrace_cmd_t *dcp) { - char file[PATH_MAX], *p; + char *p; - if (g_ofile != NULL) { - (void) snprintf(file, sizeof (file), g_cmdc > 1 ? - "%s.%d" : "%s", g_ofile, (int)(dcp - g_cmdv)); + if (g_cmdc == 1 && g_ofile != NULL) { + (void) strlcpy(dcp->dc_ofile, g_ofile, sizeof (dcp->dc_ofile)); } else if ((p = strrchr(dcp->dc_arg, '.')) != NULL && strcmp(p, ".d") == 0) { p[0] = '\0'; /* strip .d suffix */ - (void) snprintf(file, sizeof (file), + (void) snprintf(dcp->dc_ofile, sizeof (dcp->dc_ofile), "%s.o", basename(dcp->dc_arg)); } else { - (void) snprintf(file, sizeof (file), g_cmdc > 1 ? - "%s.%d" : "%s", "d.out", (int)(dcp - g_cmdv)); + (void) snprintf(dcp->dc_ofile, sizeof (dcp->dc_ofile), + g_cmdc > 1 ? "%s.%d" : "%s", "d.out", (int)(dcp - g_cmdv)); } if (dtrace_program_link(g_dtp, dcp->dc_prog, DTRACE_D_PROBES, - file, g_objc - 1, g_objv + 1) != 0) + dcp->dc_ofile, g_objc - 1, g_objv + 1) != 0) dfatal("failed to link %s %s", dcp->dc_desc, dcp->dc_name); } @@ -1393,6 +1393,18 @@ main(int argc, char *argv[]) case DMODE_LINK: for (i = 0; i < g_cmdc; i++) link_prog(&g_cmdv[i]); + + if (g_cmdc > 1 && g_ofile != NULL) { + char **objv = alloca(g_cmdc * sizeof (char *)); + + for (i = 0; i < g_cmdc; i++) + objv[i] = g_cmdv[i].dc_ofile; + + if (dtrace_program_link(g_dtp, NULL, DTRACE_D_PROBES, + g_ofile, g_cmdc, objv) != 0) + dfatal("failed to link %s", g_ofile); + } + return (g_status); case DMODE_LIST: |