You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.3 KiB
133 lines
3.3 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
/*! @file
|
|
*
|
|
* Launcher code common to unix platforms.
|
|
*
|
|
* To modify the launcher to launch a specific tool, use the auxiliary function
|
|
* build_user_argv. This function should return an array of the tool specific arguments
|
|
* and their count. These arguments will be added to the pin command line.
|
|
*
|
|
* An example of adding a tool name and its 64bit version is shown in the comment inside
|
|
* build_user_argv.
|
|
*
|
|
*/
|
|
|
|
#include "os_specific.h"
|
|
|
|
static char** build_user_argv(int* argc)
|
|
{
|
|
char** argv = NULL;
|
|
/* Usage Example:
|
|
====================================================
|
|
*argc = 4; // Number of user defined arguments
|
|
|
|
argv = (char**) malloc(sizeof(char*) * (*argc));
|
|
|
|
argv[0] = "-t";
|
|
argv[1] = appendPath("path_to_tool", "/", "toolname32");
|
|
argv[2] = "-t64";
|
|
argv[3] = appendPath("path_to_tool", "/", "toolname64");
|
|
*/
|
|
|
|
return argv;
|
|
}
|
|
|
|
/* For testing purposes only */
|
|
#if 0
|
|
static void check_environment()
|
|
{
|
|
char* s;
|
|
int i;
|
|
const char* array[] = {
|
|
"LD_LIBRARY_PATH",
|
|
"PIN_VM32_LD_LIBRARY_PATH",
|
|
"PIN_VM64_LD_LIBRARY_PATH",
|
|
"PIN_LD_RESTORE_REQUIRED",
|
|
"PIN_APP_LD_ASSUME_KERNEL",
|
|
"PIN_APP_LD_LIBRARY_PATH",
|
|
"PIN_APP_LD_PRELOAD",
|
|
0
|
|
};
|
|
for (i = 0; array[i] != NULL; i++)
|
|
{
|
|
s = getenv(array[i]);
|
|
printf("env[%s] = %s\n", array[i], s);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
* Prints the command line arguments.
|
|
* @param child_argv Command line arguments array. Must be null terminated.
|
|
*/
|
|
static void print_argv_chunks(char** child_argv)
|
|
{
|
|
char** p = child_argv;
|
|
unsigned int i = 0;
|
|
printf("\n");
|
|
while (*p)
|
|
{
|
|
printf("argv[%d] = [%s]\n", i, *p);
|
|
p++;
|
|
i++;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
static void update_environment_common(char* base_path)
|
|
{
|
|
#ifdef PIN_CRT
|
|
char buf[PATH_MAX];
|
|
if (NULL != realpath(base_path, buf))
|
|
{
|
|
strcat(buf, "/extras/crt/tzdata");
|
|
setenv("PIN_CRT_TZDATA", buf, 1);
|
|
}
|
|
#endif
|
|
update_environment(base_path);
|
|
}
|
|
|
|
/* Pin launcher which runs pinbin */
|
|
int main(int orig_argc, char** orig_argv)
|
|
{
|
|
char* path_to_cmd;
|
|
char **child_argv, **user_argv;
|
|
int user_argc = 0;
|
|
char* base_path;
|
|
char* driver_name;
|
|
|
|
if (orig_argv == NULL || orig_argv[0] == NULL)
|
|
abort();
|
|
driver_name = find_driver_name(orig_argv[0]);
|
|
if (driver_name == NULL)
|
|
abort();
|
|
base_path = find_base_path(driver_name);
|
|
if (base_path == NULL)
|
|
abort();
|
|
update_environment_common(base_path);
|
|
|
|
user_argv = build_user_argv(&user_argc);
|
|
child_argv = build_child_argv(base_path, orig_argc, orig_argv, user_argc,
|
|
user_argv);
|
|
if (driver_name) free(driver_name);
|
|
if (base_path) free(base_path);
|
|
path_to_cmd = child_argv[0];
|
|
|
|
/* For testing purposes */
|
|
#if 0
|
|
check_environment();
|
|
print_argv_chunks(child_argv);
|
|
#endif
|
|
|
|
return execv(path_to_cmd, child_argv);
|
|
}
|