Если я правильно понимаю, проблема заключается в размещении двоичных изображений (обратите внимание, что Pin
инструкции анализа не изменяют поведение программы, видимое для пользователя, так агрессивно. Основные эффекты влияют на производительность и такие вещи, как кеширование). Например, ваше изображение glibc
размещается по адресу, который отличается от адреса при запуске программы в Pin
. Если это так, во-первых, вы должны добавить обратный вызов изображения , например:
...
VOID callbackFn(IMG img, VOID *v)
{...}
...
int main(int argc, char *argv[])
{
...
IMG_AddInstrumentFunction(callbackFn, 0);
...
}
...
Функция обратного вызова (т. Е. callbackFn()
) вызывается при каждом времени загрузки изображения. , В теле обратного вызова вы можете использовать IMG_LowAddress(img)
для получения адреса загрузки каждого изображения во время выполнения. Есть также такие функции, как IMG_Name(img)
и IMG_IsMainExecutable(img)
, которые могут быть полезны. Теперь вы знаете начальный адрес двоичного образа, который B
.
. Вы хотите найти адрес функции foo()
в образе во время выполнения. Предположим, что objdump
говорит, что он находится по адресу A
от начала двоичного изображения. Чтобы найти адрес времени выполнения foo()
, вам нужно только добавить A
к B
. Другими словами, foo()
находится в A + B
во время выполнения.
PS: Будьте осторожны с символьными c ссылками при разборе имен изображений. Вы можете использовать эту функцию , чтобы решить проблему.