Если вы используете только x86 с недавним процессором Intel:
perf list
на моем Skylake показывает, что есть аппаратный счетчик для br_inst_retired.near_return
.Это будет считать только ret
инструкции, а не другие ветви.Но см. Ошибку SKL091 для счетчиков команд ветвления.
perf stat -e instructions,br_inst_retired.near_return,... ./a.out
может быть тем, что вы ищете.Или, возможно, присоединение perf stat
к уже запущенной программе или, возможно, -I 1000
для печати накопленных подсчетов за определенные интервалы.
Но учтите, что если вы ищете ROP-гаджеты , вывнутри можно найти C3
код операции , который обычно декодируется как некоторая другая инструкция.Таким образом, ограничение себя только ret
инструкциями, которые фактически выполняются во время нормального выполнения целевой программы, является более ограничивающим, чем это необходимо.
Например, 4-байтовое немедленное может с пользой декодироваться как что-то + ret
, если выперейти к немедленному.