J'utilise l'outil PIN Intel pour effectuer une analyse des instructions d'assemblage d'un programme C. J'ai un simple programme C qui imprime "Hello World", que j'ai compilé et généré un exécutable. J'ai la trace d'instructions d'assemblage généré à partir gdb comme this-Suivi des instructions natives dans Intel PIN
Dump of assembler code for function main:
0x0000000000400526 <+0>: push %rbp
0x0000000000400527 <+1>: mov %rsp,%rbp
=> 0x000000000040052a <+4>: mov $0x4005c4,%edi
0x000000000040052f <+9>: mov $0x0,%eax
0x0000000000400534 <+14>: callq 0x400400 <[email protected]>
0x0000000000400539 <+19>: mov $0x0,%eax
0x000000000040053e <+24>: pop %rbp
0x000000000040053f <+25>: retq
End of assembler dump.
J'ai couru un pintool où j'ai donné l'exécutable comme entrée, et je fais une trace d'instruction et d'imprimer le nombre d'instructions. Je souhaite tracer les instructions qui sont de mon programme C et probablement obtenir les opcodes de la machine et faire une sorte d'analyse. J'utilise un outil C++ PIN pour compter le nombre de INSTRUCTIONS-
#include "pin.H"
#include <iostream>
#include <stdio.h>
UINT64 icount = 0;
using namespace std;
//====================================================================
// Analysis Routines
//====================================================================
void docount(THREADID tid) {
icount++;
}
//====================================================================
// Instrumentation Routines
//====================================================================
VOID Instruction(INS ins, void *v) {
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_THREAD_ID, IARG_END);
}
VOID Fini(INT32 code, VOID *v) {
printf("count = %ld\n",(long)icount);
}
INT32 Usage() {
PIN_ERROR("This Pintool failed\n"
+ KNOB_BASE::StringKnobSummary() + "\n");
return -1;
}
int main(int argc, char *argv[]) {
if (PIN_Init(argc, argv)) return Usage();
PIN_InitSymbols();
PIN_AddInternalExceptionHandler(ExceptionHandler,NULL);
INS_AddInstrumentFunction(Instruction, 0);
PIN_AddFiniFunction(Fini, 0);
PIN_StartProgram();
return 0;
}
Quand je lance mon bonjour programme mondial avec cet outil, je reçois icount = 81563. Je comprends que PIN ajoute ses propres instructions pour l'analyse, mais Je ne comprends pas comment il ajoute autant d'instructions, alors que je n'ai pas plus de 10 instructions dans mon programme C. Il existe également un moyen d'identifier les instructions d'assemblage qui proviennent de mon code et celles générées par le code PIN. Il semble que je ne trouve aucun moyen de faire la différence entre les instructions générées par PIN et celles qui proviennent de mon programme. S'il vous plaît aidez!
Je ne suis pas familier avec le code PIN, mais je suppose qu'il compte aussi les instructions dans la bibliothèque C. – Jester
Essayez de créer un exécutable statique qui effectue un appel système 'exit' directement. (par exemple, retirer la boucle de mon [mov élimination microbenchmark] (https://stackoverflow.com/questions/44169342/can-x86s-mov-really-be-free-why-cant-i-reproduce-this-at- all/44193770 # 44193770)). –
@PeterCordes Quel que soit le contenu de mon programme C, icount est toujours supérieur à 80k. Je ne sais pas s'il existe un moyen de différencier les instructions machine de celles générées par le code PIN. –