summaryrefslogtreecommitdiff
path: root/usr/src/cmd/dtrace/dtrace.c
diff options
context:
space:
mode:
authorahl <none@none>2005-07-20 01:15:45 -0700
committerahl <none@none>2005-07-20 01:15:45 -0700
commit0b38a8bdfd75ac6144f9d462bb38d0c1b3f0ca50 (patch)
treeb1914d8b26048f30b052b54b9625a9f6f8d153ca /usr/src/cmd/dtrace/dtrace.c
parentb52a2671b74561fd8e88284bba4b0b834687951e (diff)
downloadillumos-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.c30
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: