Intel Pin: Как сгенерировать объектный код? - PullRequest
0 голосов
/ 05 февраля 2019

Я экспериментирую с инструментом intel-pin.У меня есть простая Hello-world.c (она печатает только «Hello world») программа (скажем, a.out).Если я хочу сгенерировать сборку из двоичного файла, я бы сделал objdump -D a.out.

Я хочу применить некоторые инструкции в этом.

Возможно ли получить objdump с помощью инструмента pin, перед (Это легко сделать с помощью objdump) и после контрольно-измерительных приборов?

Я создал инструмент, который печатает все инструкции.

#include <stdio.h>
#include "pin.H"
#include <cstdint>

FILE * trace;

KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool", "o", "pinatrace.out","A pin tool");

VOID Count(INS ins, void *v) {


        fprintf(trace,"\n%s",(INS_Disassemble(ins)).c_str());

}

VOID Fini(INT32 code, VOID *v)
{
        printf("count = %ld\n",(long)icount);
        fprintf(trace, "#eof\n");
        fclose(trace);
}

/* ===================================================================== */
/* Print Help Message                                                    */
/* ===================================================================== */

INT32 Usage()
{
    PIN_ERROR( "This Pintool prints a trace of memory addresses\n"
              + KNOB_BASE::StringKnobSummary() + "\n");
    return -1;
}

/* ===================================================================== */
/* Main                                                                  */
/* ===================================================================== */

int main(int argc, char *argv[])
{
    if (PIN_Init(argc, argv)) return Usage();

    trace = fopen("pinatrace.out", "w");


    INS_AddInstrumentFunction(Count, 0);
    PIN_AddFiniFunction(Fini, 0);
    // Never returns
    PIN_StartProgram();

    return 0;
}

Он печатает инструкции по сборке, но я не уверен, еслионо включает инструментированные инструкции.

Это правильный способ сделать это?Не могли бы вы помочь мне?

1 Ответ

0 голосов
/ 07 февраля 2019

Можно ли получить objdump с помощью инструмента «Пин», до (это легко сделать с помощью objdump) и после контрольно-измерительных приборов?

Вам понадобится способ узнать механизм ПИНчто вы хотите сделать с результатами objdump.Возможно, вы захотите связать их обоих через скрипт, например.Хотя это полностью зависит от того, что вы хотите сделать.

Это правильный способ сделать это?

Зависит от того, что вы хотите сделать точно, но я думаю,это не так.

Существует четкое различие между измерительными приборами и анализом в ПИН-коде.Как только вы это поймете, все остальное (относительно) легко.

Концептуально, инструменты PIN-кода состоят из двух компонентов:

  • Механизм, который решает, куда и какой код вставлять: Instrumentation .
  • Код для выполнения в точках вставки: анализ .

При этом, еще один важный момент:

  • Контрольно-измерительные приборы запускаются только один раз : когда команда (или BBL, или TRACE) обнаружена впервые.
  • Анализ выполняется каждый раз выполняется инструкция (или BBL, TRACE).

Поэтому, когда у вас есть:

// set up the **instrumentation**
INS_AddInstrumentFunction(Func_Instrumentation, 0);

Вы настраиваете инструментарий (которыйтогда вызывается только один раз).Если вам нужно, чтобы обратный вызов вызывался каждый раз при выполнении инструкции (или BBL, TRACE), вам необходимо настроить процедуру анализа, например:

// this is the **analysis** routine.
// This function is called before every instruction is executed
VOID docount() { icount++; }

// The is the **instrumentation routine**, called by INS_AddInstrumentFunction().
// Pin calls this function each time a **new** instruction is encountered
// Note that is won't be called for the same instruction after the first time.
VOID Func_Instrumentation(INS ins, VOID *v)
{
    // Insert a call to docount before every instruction, no arguments are passed
    INS_InsertCall(
        ins,              // a representation of the instruction
        IPOINT_BEFORE,    // where to insert, relative to the instruction
        (AFUNPTR)docount, // the analysis routine
        IARG_END);        // no args to pass to the analysis routine
}

Тщательно проверьте имеющийся образец подсчета команд:

...