Intel Pin: функция не анализируется в зависимости от инициализации символов - PullRequest
0 голосов
/ 24 января 2019

При обработке некоторого кода с помощью Intel Pin я получил странное поведение, которое я выделил в приведенном ниже коде.

По сути, в следе моего Pin Tool я заметил, что некоторые детали отсутствовали, и обнаружил, что вызов PIN_InitSymbolsAlt(SYMBOL_INFO_MODE(UINT32(IFUNC_SYMBOLS) | UINT32(DEBUG_OR_EXPORT_SYMBOLS))) вместо моего предыдущего PIN_InitSymbols менял намного больше, чем доступные символы или не & mdash; фактически некоторые процедуры, которые были проанализированы с нулевыми инструкциями ранее, теперь отображали положительное (и реалистичное) количество инструкций ...

В приведенном ниже коде (урезанная версия моей программы и Pin Tool) я взял memcpy в качестве примера.

Этот инструмент Pin просто подсчитывает количество инструкций для каждой процедуры:

#include "pin.H"

#include <cstdint>
#include <iostream>
#include <map>

std::map<std::string, uint64_t> routines;

VOID CountPtr(UINT64 *counter)
{
    ++(*counter);
}

VOID Routine(RTN rtn, VOID*)
{
    uint64_t& insn = routines[RTN_Name(rtn)];

    RTN_Open(rtn);
    for (INS ins = RTN_InsHead(rtn); INS_Valid(ins); ins = INS_Next(ins))
    {
        INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)CountPtr, IARG_PTR, &insn, IARG_END);
    }
    RTN_Close(rtn);
}

void Fini(INT32, void*)
{
    for (const auto& p : routines)
    {
        std::cout << p.first << " " << p.second << std::endl;
    }
}

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

    // !NOTE: memcpy does NOT get analyzed with only this call instead: PIN_InitSymbols();
    PIN_InitSymbolsAlt(SYMBOL_INFO_MODE(UINT32(IFUNC_SYMBOLS) | UINT32(DEBUG_OR_EXPORT_SYMBOLS)));

    RTN_AddInstrumentFunction(Routine, 0);
    PIN_AddFiniFunction(Fini, 0);

    PIN_StartProgram();
    return 0;
}

Мой тестовый бинарный файл просто вызывает memcpy & mdash; Опять же, чтобы упростить вещи:

// copy.cc
#include <cstring>
#include <cstdint>

void copy(uint8_t* __restrict dst, uint8_t* __restrict src, std::size_t sz)
{
    memcpy(dst, src, sz);
}

// test.cc
#include <cstdint>

unsigned char a[128];
unsigned char b[128];

void copy(uint8_t* __restrict, uint8_t* __restrict, std::size_t);

int main()
{
    copy(b, a, 128);
    return 0;
}

При вызове это показывает:

pin -t ./obj-intel64/mytool.so -- /tmp/test | grep memcpy
__memcpy_chk 0
__wmemcpy_chk 0
memcpy 29
memcpy@plt 1
wmemcpy 0

А теперь, если я заменю вызов PIN_InitSymbolsAlt на PIN_InitSymbols, я получу ...:

$ pin -t ./obj-intel64/mytool.so -- /tmp/test | grep memcpy
__wmemcpy_chk 0
memcpy 0
memcpy@plt 1
wmemcpy 0

Я считаю, что это немного странно, если честно. Эта функция недостаточно документирована, и я либо что-то упускаю, либо это не имеет ничего общего с символами ... Анализ подпрограммы memcpy просто по какой-то причине не дал никаких инструкций.

Есть идеи о том, что здесь произошло и почему? Спасибо!

...