Я работаю над многопроцессорным архитектурным симулятором, который использует Intel Pin для инструментов исполняемых двоичных файлов C ++ и сообщает о интересных событиях (например, некоторых вызовах функций, создании / завершении потоков и т. Д.). По сути, я создаю кэш-инструкцию для всех команд, когда их изображения загружаются, и анализирую их выполнение. Поэтому важно, чтобы адреса команд во время загрузки изображения были такими же (или, по крайней мере, обновлялись синхронно с) адресами команд во время выполнения.
Intel Pin API (например, IMG_AddInstrumentFunction) позволяет мне получать информацию о загруженных изображениях (исполняемых файлах и общих библиотеках), таких как точки входа, низкий / высокий адрес и т. Д.
Однако я заметил, что инструментальная программа выполняет инструкции по адресам, которые не принадлежат ни одному из загруженных изображений. При проверке я подозреваю, что динамический загрузчик (image /lib64/ld-linux-x86-64.so.2 на 64-битный Centos 6.3) перемещает основной исполняемый файл в память, вызывая подпрограмму _dl_relocate_object.
Я понимаю необходимость перемещаемого кода и тому подобного. Мне просто нужны указатели на хорошую документацию (или просто краткое описание / советы) о том, как / когда эти перемещения могут происходить (во время загрузки и во время выполнения), чтобы я мог учесть их в моем архитектурном симуляторе. Другими словами, механизм используется для достижения этого (библиотечные функции, которые мне нужны для инструмента, условия или, возможно, рандомизация, если есть, переключатели компилятора g ++, которые можно использовать для подавления перемещения и т. д.).
П.С .: Я ориентируюсь только на архитектуры x86 / x86_64
Перемещение зависит от процессора, поэтому ARM, x86-64 и x86 имеют разное перемещение (потому что их набор команд различен).
Перемещение также зависит от операционной системы, но некоторые связанные ОС пытаются иметь такое же перемещение, например, Solaris и Linux для x86-64
Они подробно описаны в ABI (двоичный интерфейс приложения) спецификация «Приложение V к двоичному интерфейсу приложения System64 для архитектуры AMD64». Оригинальный ABI x86-64 был на http://www.x86-64.org/documentation.html
но этот сайт не отвечает с нескольких недель. Старая копия включена эта ссылка и более новый Вот
Существует также X32 ABI
Смотрите также этот вопрос.
Других решений пока нет …