Инструмент закрепления, адрес stati c ins (INS_Address (ins)) отличается от адреса инструментированной инструкции (IARG_INST_PTR) - PullRequest
1 голос
/ 27 мая 2020

Я хочу напечатать каждое имя rtn, и инструкции принадлежат этому rtn. Мой код выглядит так: '' '

for (SEC sec = IMG_SecHead(img); SEC_Valid(sec); sec = SEC_Next(sec))
{ 
    //OutFile << "SEC name: " << SEC_Name(sec) << endl;
    for (RTN rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn))
    {
        if(RTN_NumIns(rtn) >= 1){
            OutFile << RTN_Name(rtn) << ";" << std::dec << RTN_NumIns(rtn) << endl;

            RTN_Open(rtn);

            for (INS ins = RTN_InsHead(rtn); INS_Valid(ins); ins = INS_Next(ins))
            {
                OutFile << hex << INS_Address(ins) << ";" << INS_Disassemble(ins) << ";" \
                ...;
            }
            // to preserve space, release data associated with RTN after we have processed it
            RTN_Close(rtn);
        }     
    }
}

' '', затем я использую INS_AddInstrumentFunction для печати трассировки мемов. '' '

VOID RecordMemRead(VOID * ip, VOID * addr)
{
    fprintf(trace,"%p: R %p\n", ip, addr);
}
VOID RecordMemWrite(VOID * ip, VOID * addr)
{
    fprintf(trace,"%p: W %p\n", ip, addr);
}

VOID Instruction(INS ins, VOID *v)
{
    UINT32 memOperands = INS_MemoryOperandCount(ins);

    for (UINT32 memOp = 0; memOp < memOperands; memOp++)
    {
        if (INS_MemoryOperandIsRead(ins, memOp))
        {
            INS_InsertPredicatedCall(
                ins, IPOINT_BEFORE, (AFUNPTR)RecordMemRead,
                IARG_INST_PTR,
                IARG_MEMORYOP_EA, memOp,
                IARG_END);
        }
        if (INS_MemoryOperandIsWritten(ins, memOp))
        {
            INS_InsertPredicatedCall(
                ins, IPOINT_BEFORE, (AFUNPTR)RecordMemWrite,
                IARG_INST_PTR,
                IARG_MEMORYOP_EA, memOp,
                IARG_END);
        }
    }
}

' '' наконец-то у меня другой адрес входа, почему это произошло? Я застрял здесь слишком долго.

1 Ответ

0 голосов
/ 06 июня 2020

INS_Address (ins) адрес печати, по которому инструкция загружается во время начальной загрузки изображения. IARG_INST_PTR дает адрес инструкции, когда она выполняет . Перемещение изображения происходит во время выполнения. Следовательно, адреса могут быть разными.

см. значение точки команд динамического c связывание и статическое c связывание . Ваш вопрос похож. просто сформулировано иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...