При обработке некоторого кода с помощью 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
просто по какой-то причине не дал никаких инструкций.
Есть идеи о том, что здесь произошло и почему? Спасибо!