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.

98 lines
2.8 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 */
#include <iostream>
#include <sys/time.h>
#include "pin.H"
using std::string;
using std::cout;
using std::endl;
string rtn_name;
KNOB<string> KnobFunctionNameToInstrument(KNOB_MODE_WRITEONCE, "pintool", "function_name", "gettimeofday",
"function name to instrument" );
int NewImplementation(const char * ptr1, const char *ptr2) {
cout << "New implementation!" << endl;
return 0;
}
void BeforeResolverFunction(void *img_name, ADDRINT rtn_addr)
{
cout << "Hello once (resolver)" << endl;
}
VOID ImageLoad( IMG img, VOID *v )
{
for (SEC sec = IMG_SecHead(img); SEC_Valid(sec); sec = SEC_Next(sec))
{
for (RTN rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn))
{
if (RTN_Name(rtn).compare(rtn_name) == 0 ||
RTN_Name(rtn).compare("__" + rtn_name) == 0) {
if (!SYM_IFuncResolver(RTN_Sym(rtn)))
continue;
cout << "Found " << RTN_Name(rtn).c_str() << " in " << IMG_Name(img);
RTN resolver = rtn;
RTN impl = RTN_IFuncImplementation(rtn);
cout << "... Replacing" << endl;
ASSERTX(RTN_Valid(resolver));
ASSERTX(RTN_Valid(impl));
RTN_Open(impl);
RTN_InsertCall(impl, IPOINT_BEFORE, AFUNPTR(NewImplementation), IARG_END);
RTN_Close(impl);
// Instrumenting the resolver function, should be called once
RTN_Open(resolver);
RTN_InsertCall(resolver, IPOINT_BEFORE, AFUNPTR(BeforeResolverFunction),
IARG_PTR, IMG_Name(img).c_str(),
IARG_ADDRINT, RTN_Address(rtn),
IARG_END);
RTN_Close(resolver);
}
}
}
}
int main (INT32 argc, CHAR *argv[])
{
// Initialize pin
//
if (PIN_Init(argc, argv)) return 0;
// Initialize symbol processing
//
PIN_InitSymbolsAlt(IFUNC_SYMBOLS);
//Initialize global variables
rtn_name = KnobFunctionNameToInstrument.Value();
cout << "rtn_name : " << rtn_name << endl;
// Register ImageLoad to be called when an image is loaded
//
IMG_AddInstrumentFunction( ImageLoad, 0 );
// Start the program, never returns
//
PIN_StartProgram();
return 0;
}