2N/A * The contents of this file are subject to the terms of the 2N/A * Common Development and Distribution License (the "License"). 2N/A * You may not use this file except in compliance with the License. 2N/A * See the License for the specific language governing permissions 2N/A * and limitations under the License. 2N/A * When distributing Covered Code, include this CDDL HEADER in each 2N/A * If applicable, add the following below this CDDL HEADER, with the 2N/A * fields enclosed by brackets "[]" replaced with your own identifying 2N/A * information: Portions Copyright [yyyy] [name of copyright owner] 2N/A * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. 2N/A * Compose the lmid and object name into the canonical representation. We 2N/A * omit the lmid for the default link map for convenience. 2N/A return (
1);
/* errno is set for us */ 2N/A "offset 0x%llx outside of function '%s'",
2N/A "offset 0x%llx is not aligned on an instruction",
2N/A "failed to create offset probes in '%s': %s",
func,
2N/A * Due to 4524008, _init and _fini may have a bloated st_size. 2N/A * While this bug has been fixed for a while, old binaries 2N/A * may exist that still exhibit this problem. As a result, we 2N/A * don't match _init and _fini though we allow users to 2N/A * specify them explicitly. 2N/A * If pp->dpp_func contains any globbing meta-characters, we need 2N/A * to iterate over the symbol table and compare each function name 2N/A * against the pattern. 2N/A * If we fail to lookup the symbol, try interpreting the 2N/A * function as the special "-" function that indicates that the 2N/A * probe name should be interpreted as a absolute virtual 2N/A * address. If that fails and we were matching a specific 2N/A * function in a specific module, report the error, otherwise 2N/A * just fail silently in the hopes that some other object will 2N/A * contain the desired symbol. 2N/A "failed to lookup '%s' in module '%s'",
2N/A * Only match defined functions of non-zero size. 2N/A * We don't instrument PLTs -- they're dynamically rewritten, 2N/A * and, so, inherently dicey to instrument. 2N/A * If we didn't match anything in the PR_SYMTAB, try 2N/A * Pick apart the link map from the library name. 2N/A * We can only trace dynamically-linked executables (since we've 2N/A "process %s is not a dynamically-linked executable",
2N/A "only the a.out module is valid with the " 2N/A "only individual addresses may be specified " 2N/A "with the '-' function"));
2N/A * If pp.dpp_mod contains any globbing meta-characters, we need 2N/A * to iterate over each module and compare its name against the 2N/A * pattern. An empty module name is treated as '*'. 2N/A * If we can't find a matching module, don't sweat it -- either 2N/A * we'll fail the enabling because the probes don't exist or 2N/A * we'll wait for that module to come along. 2N/A const char *
syms[] = {
"___SUNW_dof",
"__SUNW_dof" };
2N/A * The symbol ___SUNW_dof is for lazy-loaded DOF sections, and 2N/A * __SUNW_dof is for actively-loaded DOF sections. We try to force 2N/A * in both types of DOF section since the process may not yet have 2N/A * run the code to instantiate these providers. 2N/A for (i = 0; i <
2; i++) {
2N/A return (-
1);
/* errno is set for us */ 2N/A "failed to instantiate probes for pid %d: %s",
2N/A * Put the module name in its canonical form. 2N/A "pid provider is not installed on this system");
2N/A "pid provider is not available: %s",
2N/A "failed to grab process %d", (
int)
pid);
2N/A * Alert other retained enablings which may match 2N/A * against the newly created probes. 2N/A * If it's not strictly a pid provider, we might match a USDT provider. 2N/A "failed to grab process %d", (
int)
pid);
2N/A * If it's not strictly a pid provider, we might match 2N/A * Give DTrace a shot to the ribs to get it to check 2N/A * out the newly created probes.