Pin
Classes | Typedefs | Enumerations | Functions | Variables
image.cpp File Reference
#include "level_base.H"
#include "level_core.H"
#include "level_imgio.H"
#include "level_vmclient.H"
#include "level_pinclient.H"
#include <map>
#include <limits.h>
#include <iostream>
#include <list>

Classes

class  LEVEL_PINCLIENT::RTN_KEY
 
class  LEVEL_PINCLIENT::IMG_IDENTIFIER
 
struct  LEVEL_PINCLIENT::OUTSIDE_TARGET_MEM_RANGE
 
struct  LEVEL_PINCLIENT::OUTSIDE_TARGET
 
class  LEVEL_PINCLIENT::RTN_OUTSIDE_RANGES
 
class  LEVEL_PINCLIENT::SymbolAddressRange
 
struct  LEVEL_PINCLIENT::SymbolDebugInfo
 
class  LEVEL_PINCLIENT::IMAGE_LOAD_OP
 
class  LEVEL_PINCLIENT::IMAGE_LOAD_OP2
 

Typedefs

typedef VOID(* LEVEL_PINCLIENT::IMAGECALLBACK) (IMG, VOID *)
 

Enumerations

enum  LEVEL_PINCLIENT::UNDECORATION {
  LEVEL_PINCLIENT::UNDECORATION_COMPLETE,
  LEVEL_PINCLIENT::UNDECORATION_NAME_ONLY
}
 
enum  LEVEL_PINCLIENT::SYMBOL_INFO_MODE {
  LEVEL_PINCLIENT::NO_SYMBOLS = 0,
  LEVEL_PINCLIENT::EXPORT_SYMBOLS = (1<<0),
  LEVEL_PINCLIENT::DEBUG_SYMBOLS = (1<<1),
  LEVEL_PINCLIENT::IFUNC_SYMBOLS = (1<<2),
  LEVEL_PINCLIENT::DEBUG_OR_EXPORT_SYMBOLS = (DEBUG_SYMBOLS | EXPORT_SYMBOLS)
}
 

Functions

LOCALVAR KNOB_COMMENT LEVEL_PINCLIENT::KnobSymFamily ("pintool:sym", "Symbols controls")
 
LOCALVAR KNOB< BOOL > LEVEL_PINCLIENT::KnobUnrestrictedRtnSize (KNOB_MODE_WRITEONCE, "pintool:sym", "unrestricted_rtn_size", "0", "Use the unrestricted RTN size. " "When set the RTN size defined by the distance between RTN start to the beginning of next RTN.")
 
LOCALVAR KNOB< BOOL > LEVEL_PINCLIENT::KnobShortName (KNOB_MODE_WRITEONCE, "pintool:sym", "short_name", "0", "Use the shortest name for the RTN. " "Names with version substrings are preferred over the same name without the substring.")
 
LOCALVAR KNOB< BOOL > LEVEL_PINCLIENT::KnobIgnoreDebugInfo (KNOB_MODE_WRITEONCE, "pintool:sym", "ignore_debug_info", "0", "Ignore debug info for the image. Symbols are taken from the symbol tables.")
 
LOCALVAR KNOB< std::string > LEVEL_PINCLIENT::KnobReduceRtnSizeMode (KNOB_MODE_WRITEONCE, "pintool:sym", "reduce_rtn_size_mode", "auto", "Mode for RTN size reduction: delete trailing instructions after RET if there is no " "jump to the rtn part after the RET. " "Possible modes are: auto/never/always")
 
KNOB< BOOL > LEVEL_PINCLIENT::KnobJitApi (KNOB_MODE_WRITEONCE, "pintool:sym", "support_jit_api","0", "Enables the Jitted Functions Support")
 
IMG LEVEL_PINCLIENT::IMG_Next (IMG img)
 
IMG LEVEL_PINCLIENT::IMG_Prev (IMG img)
 
IMG LEVEL_PINCLIENT::IMG_Invalid ()
 
BOOL LEVEL_PINCLIENT::IMG_Valid (IMG img)
 
SEC LEVEL_PINCLIENT::IMG_SecHead (IMG img)
 
SEC LEVEL_PINCLIENT::IMG_SecTail (IMG img)
 
SYM LEVEL_PINCLIENT::IMG_RegsymHead (IMG img)
 
PIN_DEPRECATED_API ADDRINT LEVEL_PINCLIENT::IMG_Entry (IMG img)
 
ADDRINT LEVEL_PINCLIENT::IMG_EntryAddress (IMG img)
 
BOOL LEVEL_PINCLIENT::IMG_HasProperty (IMG img, IMG_PROPERTY property)
 
const std::string & LEVEL_PINCLIENT::IMG_Name (IMG img)
 
ADDRINT LEVEL_PINCLIENT::IMG_Gp (IMG img)
 
ADDRINT LEVEL_PINCLIENT::IMG_LoadOffset (IMG img)
 
ADDRINT LEVEL_PINCLIENT::IMG_LowAddress (IMG img)
 
ADDRINT LEVEL_PINCLIENT::IMG_HighAddress (IMG img)
 
ADDRINT LEVEL_PINCLIENT::IMG_StartAddress (IMG img)
 
USIZE LEVEL_PINCLIENT::IMG_SizeMapped (IMG img)
 
IMG_TYPE LEVEL_PINCLIENT::IMG_Type (IMG img)
 
BOOL LEVEL_PINCLIENT::IMG_IsMainExecutable (IMG x)
 
BOOL LEVEL_PINCLIENT::IMG_hasLinesData (IMG x)
 
BOOL LEVEL_PINCLIENT::IMG_IsInterpreter (IMG x)
 
BOOL LEVEL_PINCLIENT::IMG_IsStaticExecutable (IMG x)
 
BOOL LEVEL_PINCLIENT::IMG_IsVDSO (IMG img)
 
UINT32 LEVEL_PINCLIENT::IMG_NumRegions (IMG img)
 
ADDRINT LEVEL_PINCLIENT::IMG_RegionHighAddress (IMG img, UINT32 n)
 
ADDRINT LEVEL_PINCLIENT::IMG_RegionLowAddress (IMG img, UINT32 n)
 
IMG LEVEL_PINCLIENT::SEC_Img (SEC sec)
 
SEC LEVEL_PINCLIENT::SEC_Next (SEC sec)
 
SEC LEVEL_PINCLIENT::SEC_Prev (SEC sec)
 
SEC LEVEL_PINCLIENT::SEC_Invalid ()
 
BOOL LEVEL_PINCLIENT::SEC_Valid (SEC x)
 
RTN LEVEL_PINCLIENT::SEC_RtnHead (SEC sec)
 
RTN LEVEL_PINCLIENT::SEC_RtnTail (SEC sec)
 
const std::string & LEVEL_PINCLIENT::SEC_Name (SEC sec)
 
SEC_TYPE LEVEL_PINCLIENT::SEC_Type (SEC sec)
 
BOOL LEVEL_PINCLIENT::SEC_Mapped (SEC sec)
 
const VOID * LEVEL_PINCLIENT::SEC_Data (SEC sec)
 
SEC LEVEL_PINCLIENT::RTN_Sec (RTN x)
 
RTN LEVEL_PINCLIENT::RTN_Next (RTN x)
 
RTN LEVEL_PINCLIENT::RTN_Prev (RTN x)
 
RTN LEVEL_PINCLIENT::RTN_Invalid ()
 
BOOL LEVEL_PINCLIENT::RTN_Valid (RTN x)
 
LOCALINLINE RTN_OUTSIDE_RANGES & LEVEL_PINCLIENT::RtnOutsideRangesManager ()
 
LOCALFUN VOID LEVEL_PINCLIENT::DisassembleRegion (RTN rtn, BBL bbl, const VOID *current, const VOID *end, ADDRINT rtnStart, ADDRINT rtnEnd, ADDRINT rtnLimit, ADDRINT virtual_offset)
 
LOCALFUN INS LEVEL_PINCLIENT::DisassembleFirstIns (const VOID *current, const VOID *end, ADDRINT limit, ADDRINT virtual_offset)
 
LOCALFUN VOID LEVEL_PINCLIENT::FetchRtnIns (RTN rtn)
 
LOCALFUN INS LEVEL_PINCLIENT::FetchRtnInsFirstOnly (RTN rtn)
 
const std::string & LEVEL_PINCLIENT::RTN_Name (RTN x)
 
BOOL LEVEL_PINCLIENT::RTN_IsArtificial (RTN x)
 
SYM LEVEL_PINCLIENT::RTN_Sym (RTN x)
 
UINT LEVEL_PINCLIENT::RTN_DynamicMethodId (RTN x)
 
AFUNPTR LEVEL_PINCLIENT::RTN_Funptr (RTN x)
 
LOCALFUN VOID LEVEL_PINCLIENT::RTN_Destroy (RTN rtn)
 
UINT32 LEVEL_PINCLIENT::RTN_Id (RTN x)
 
INS LEVEL_PINCLIENT::BBL_InsHead (BBL x)
 
INS LEVEL_PINCLIENT::BBL_InsTail (BBL x)
 
BBL LEVEL_PINCLIENT::BBL_Next (BBL x)
 
BBL LEVEL_PINCLIENT::BBL_Prev (BBL x)
 
BOOL LEVEL_PINCLIENT::BBL_Valid (BBL x)
 
BBL_TYPE LEVEL_PINCLIENT::BBL_Type (BBL x)
 
RTN LEVEL_PINCLIENT::INS_Rtn (INS x)
 
INS LEVEL_PINCLIENT::INS_Next (INS x)
 
INS LEVEL_PINCLIENT::INS_Prev (INS x)
 
INS LEVEL_PINCLIENT::INS_Invalid ()
 
BOOL LEVEL_PINCLIENT::INS_Valid (INS x)
 
ADDRINT LEVEL_PINCLIENT::INS_Address (INS ins)
 
USIZE LEVEL_PINCLIENT::INS_Size (INS ins)
 
PIN_DEPRECATED_API ADDRINT LEVEL_PINCLIENT::INS_DirectBranchOrCallTargetAddress (INS ins)
 
ADDRINT LEVEL_PINCLIENT::INS_DirectControlFlowTargetAddress (INS ins)
 
ADDRINT LEVEL_PINCLIENT::INS_NextAddress (INS ins)
 
SYM LEVEL_PINCLIENT::SYM_Next (SYM x)
 
SYM LEVEL_PINCLIENT::SYM_Prev (SYM x)
 
const std::string & LEVEL_PINCLIENT::SYM_Name (SYM x)
 
SYM LEVEL_PINCLIENT::SYM_Invalid ()
 
BOOL LEVEL_PINCLIENT::SYM_Valid (SYM x)
 
BOOL LEVEL_PINCLIENT::SYM_Dynamic (SYM x)
 
BOOL LEVEL_PINCLIENT::SYM_GeneratedByPin (SYM x)
 
BOOL LEVEL_PINCLIENT::SYM_IFuncImplementation (SYM x)
 
BOOL LEVEL_PINCLIENT::SYM_IFuncResolver (SYM x)
 
ADDRINT LEVEL_PINCLIENT::SYM_Value (SYM x)
 
UINT32 LEVEL_PINCLIENT::SYM_Index (SYM x)
 
ADDRINT LEVEL_PINCLIENT::SYM_Address (SYM x)
 
UINT32 LEVEL_PINCLIENT::IMG_Id (IMG x)
 
IMG LEVEL_PINCLIENT::IMG_FindImgById (UINT32 id)
 
IMG LEVEL_PINCLIENT::IMG_FindByAddress (ADDRINT address)
 
PIN_CALLBACK LEVEL_PINCLIENT::RTN_AddInstrumentFunction (RTN_INSTRUMENT_CALLBACK fun, VOID *val)
 
LOCALFUN BOOL LEVEL_PINCLIENT::operator< (const RTN_KEY &p1, const RTN_KEY &p2)
 
PIN_CALLBACK LEVEL_PINCLIENT::IMG_AddInstrumentFunction (IMAGECALLBACK fun, VOID *v)
 
PIN_CALLBACK LEVEL_PINCLIENT::IMG_AddUnloadFunction (IMAGECALLBACK fun, VOID *v)
 
LOCALFUN VOID LEVEL_PINCLIENT::IMG_Destroy (IMG img)
 
USIZE LEVEL_PINCLIENT::RTN_Range (RTN rtn)
 
USIZE LEVEL_PINCLIENT::RTN_Size (RTN rtn)
 
RTN LEVEL_PINCLIENT::RTN_IFuncResolver (RTN rtn)
 
RTN LEVEL_PINCLIENT::RTN_IFuncImplementation (RTN rtn)
 
LOCALFUN VOID LEVEL_PINCLIENT::InitRtnToSym (RTN rtn, SYM sym)
 
LOCALFUN VOID LEVEL_PINCLIENT::UseShortName (RTN rtn, SYM sym)
 
LOCALFUN UINT LEVEL_PINCLIENT::RegionFromSegName (IMG img, const std::string &segname)
 
LOCALFUN VOID LEVEL_PINCLIENT::BestFit (RTN rtn, SYM sym)
 
LOCALFUN INT LEVEL_PINCLIENT::SymPosition (SYM sym, const MemRange &range)
 
LOCALFUN RTN LEVEL_PINCLIENT::FinalizeRtn (RTN rtn, USIZE size)
 
LOCALFUN VOID LEVEL_PINCLIENT::AddRtnsToMap (IMG img)
 
LOCALFUN VOID LEVEL_PINCLIENT::FixSymbolsFromDebugInfo (IMG img)
 
LOCALFUN IMG LEVEL_PINCLIENT::ImgLoad (const std::string &filename, const CHAR *trueFilename, ADDRINT load_offset, UINT32 flags, BOOL *unmapAfterProcessing, void *arg)
 
IMG LEVEL_PINCLIENT::IMG_Open (const std::string &filename)
 
VOID LEVEL_PINCLIENT::IMG_Close (IMG img)
 
LOCALFUN VOID LEVEL_PINCLIENT::ImageLoadProbes (IMG img)
 
std::string LEVEL_PINCLIENT::RTN_FindNameByAddress (ADDRINT address)
 
RTN LEVEL_PINCLIENT::RTN_FindByAddress (ADDRINT address)
 
RTN LEVEL_PINCLIENT::RTN_FindByName (IMG img, const CHAR *name)
 
VOID LEVEL_PINCLIENT::RTN_Open (RTN rtn)
 
VOID LEVEL_PINCLIENT::RTN_Close (RTN rtn)
 
INS LEVEL_PINCLIENT::RTN_InsHead (RTN rtn)
 
INS LEVEL_PINCLIENT::RTN_InsHeadOnly (RTN rtn)
 
INS LEVEL_PINCLIENT::RTN_InsTail (RTN rtn)
 
UINT32 LEVEL_PINCLIENT::RTN_NumIns (RTN rtn)
 
VOID LEVEL_PINCLIENT::RTN_InsertCall (RTN rtn, IPOINT action, AFUNPTR funptr,...)
 
ADDRINT LEVEL_PINCLIENT::RTN_Address (RTN rtn)
 
RTN LEVEL_PINCLIENT::RTN_CreateAt (ADDRINT address, std::string name)
 
LOCALINLINE ADDRINT LEVEL_PINCLIENT::AlignToPageDown (ADDRINT addr)
 
LOCALINLINE ADDRINT LEVEL_PINCLIENT::AlignToPageUp (ADDRINT addr)
 
LOCALFUN VOID LEVEL_PINCLIENT::UpdateDynamicImgRegions (IMG img, ADDRINT rtn_low_addr, ADDRINT rtn_high_addr)
 
BOOL LEVEL_PINCLIENT::RTN_IsDynamic (RTN rtn)
 
ADDRINT LEVEL_PINCLIENT::SEC_Address (SEC sec)
 
BOOL LEVEL_PINCLIENT::SEC_IsReadable (SEC sec)
 
BOOL LEVEL_PINCLIENT::SEC_IsWriteable (SEC sec)
 
BOOL LEVEL_PINCLIENT::SEC_IsExecutable (SEC sec)
 
USIZE LEVEL_PINCLIENT::SEC_Size (SEC sec)
 
BOOL LEVEL_PINCLIENT::BBL_Original (BBL bbl)
 
ADDRINT LEVEL_PINCLIENT::BBL_Address (BBL bbl)
 
USIZE LEVEL_PINCLIENT::BBL_Size (BBL bbl)
 
IMG LEVEL_PINCLIENT::APP_ImgHead ()
 
IMG LEVEL_PINCLIENT::APP_ImgTail ()
 
std::string LEVEL_PINCLIENT::PIN_UndecorateSymbolName (const std::string &symbolName, UNDECORATION style)
 

Variables

LOCALTYPE typedef std::pair< RTN_KEY, RTN > LEVEL_PINCLIENT::RTN_PAIR
 
LOCALTYPE typedef std::map< RTN_KEY, RTN > LEVEL_PINCLIENT::RTN_MAP
 
LOCALTYPE typedef std::list< MemRange > LEVEL_PINCLIENT::RTN_OUTSIDE_RANGES_LIST
 
LOCALTYPE typedef std::map< ADDRINT, OUTSIDE_TARGET_MEM_RANGE, std::less< ADDRINT > > LEVEL_PINCLIENT::RTN_OUTSIDE_RANGES_MAP
 
LOCALTYPE typedef std::map< ADDRINT, OUTSIDE_TARGET, std::less< ADDRINT > > LEVEL_PINCLIENT::RTN_OUTSIDE_TARGETS_MAP
 
LOCALTYPE typedef std::map< ADDRINT, BBL, std::less< ADDRINT > > LEVEL_PINCLIENT::RTN_OUTSIDE_PREV_BBLS_MAP
 
LOCALTYPE typedef std::vector< INS > LEVEL_PINCLIENT::RTN_UJMP_VECTOR
 
LOCALTYPE typedef COMPLEX_CALLBACKVAL< IMAGECALLBACK > LEVEL_PINCLIENT::IMAGECALLBACKVAL
 
LOCALTYPE typedef IMAGECALLBACKVAL::FUNS LEVEL_PINCLIENT::IMAGECALLBACKFUNS
 
LOCALTYPE typedef COMPLEX_CALLBACKVAL< RTN_INSTRUMENT_CALLBACK > LEVEL_PINCLIENT::RTN_INSTRUMENT_CALLBACKVAL
 
LOCALTYPE typedef RTN_INSTRUMENT_CALLBACKVAL::FUNS LEVEL_PINCLIENT::RTN_INSTRUMENT_CALLBACKFUNS
 
LOCALVAR RTN_MAP LEVEL_PINCLIENT::rtn_map
 
LOCALVAR const char * LEVEL_PINCLIENT::WHOLE_TEXT_SECTION =".text"
 
LOCALVAR const char * LEVEL_PINCLIENT::UNNAMED_IMAGE_ENTRY_POINT ="unnamedImageEntryPoint"
 
LOCALVAR IMAGECALLBACKFUNS LEVEL_PINCLIENT::imageLoadList
 
LOCALVAR IMAGECALLBACKFUNS LEVEL_PINCLIENT::imageUnloadList
 
LOCALVAR APP LEVEL_PINCLIENT::app
 
LOCALVAR RTN LEVEL_PINCLIENT::OpenRtn
 
LOCALVAR IMG LEVEL_PINCLIENT::OpenImg
 
LOCALVAR RTN_INSTRUMENT_CALLBACKFUNS LEVEL_PINCLIENT::rtnList
 
LOCALVAR std::list< IMAGE_LOAD_OP > LEVEL_PINCLIENT::savedImageLoadOps
 
LOCALVAR std::list< IMAGE_LOAD_OP2 > LEVEL_PINCLIENT::savedImageLoadOps2
 

Detailed Description

Static model for instrumenting IMG's once they are loaded into memory.

Function Documentation

◆ BBL_Type()

BBL_TYPE LEVEL_PINCLIENT::BBL_Type ( BBL  x)
Returns
The type of the basic block

◆ DisassembleRegion()

LOCALFUN VOID LEVEL_PINCLIENT::DisassembleRegion ( RTN  rtn,
BBL  bbl,
const VOID *  current,
const VOID *  end,
ADDRINT  rtnStart,
ADDRINT  rtnEnd,
ADDRINT  rtnLimit,
ADDRINT  virtual_offset 
)

RtnOutsideRangesManager().HaveRet()

◆ FixSymbolsFromDebugInfo()

LOCALFUN VOID LEVEL_PINCLIENT::FixSymbolsFromDebugInfo ( IMG  img)

This function compares the symbols previously read from the symbol tables with with the symbols read from the debug information. In case of conflict, the function will fix the symbol based on the information from the debug info. Conflicts may appear for example in the case of functions with multiple entry points. Each entry point will have its own label in the symbol table. This function will merge symbols that belong to the same function into a single symbol.

Parameters
[in]imgThe image

◆ ImgLoad()

LOCALFUN IMG LEVEL_PINCLIENT::ImgLoad ( const std::string &  filename,
const CHAR *  trueFilename,
ADDRINT  load_offset,
UINT32  flags,
BOOL *  unmapAfterProcessing,
void *  arg 
)

Create an image (IMG) for an already loaded image or load a new image into memory and create an IMG for it. When IMAGE_LOAD_RUNTIME is being used in flags it implies the image is an already loaded image otherwise it implies that we are mapping a new image.

On Unix (Linux & macOS) we map the image again even for an already loaded image because it's more convenient to us. When the loader or the kernel maps a file into memory it may split it in memory into several parts which makes it harder to parse. When we map the file using regular mapping system call it will map it in one chunk which makes it easier to parse. In these cases unmapAfterProcessing will be set to TRUE so that the duplicated image will be removed.

param[in] filename Image filename param[in] trueFilename Image filename - TODO - clarify difference compared to userFilename or unite!. param[in] load_offset Image load address for images which are already loaded param[in] flags Bitwise flags of IMAGE_LOAD_FLAGS param[out] unmapAfterProcessing If not NULL, True if image should be unmapped after IMG object had been created param[in] arg opaque pointer (OS specific), NULL if not used

◆ KnobJitApi()

KNOB<BOOL> LEVEL_PINCLIENT::KnobJitApi ( KNOB_MODE_WRITEONCE  ,
"pintool:sym"  ,
"support_jit_api"  ,
"0"  ,
"Enables the Jitted Functions Support"   
)

This knob enables the Jitted Functions Support.

◆ RTN_Destroy()

LOCALFUN VOID LEVEL_PINCLIENT::RTN_Destroy ( RTN  rtn)

an rtn No RTN can be open when destroying an RTN