Какие именно шаги предпринимаются компоновщиком при разрешении перемещений в объектном файле перед созданием окончательного изображения? Более конкретно, как линкер обрабатывает значение, которое уже хранится на сайте переселения? Всегда ли он добавляет его в окончательный VA/RVA или иногда игнорируется (например, некоторые типы переселения)?Как работают репозиции в файлах COFF (не изображения)
Я не мог найти четкое объяснение в MS PE/COFF Specfication, и после того, как прибегая к помощи и экспериментировать на некоторое время, все, что я мог бы узнать, был это:
- В спецификации MS CO, глава 5.6.2 " Базовые типы переадресации ", сказано, что« Перемещение базы применяет все 32 бита разницы к 32-битовому полю со смещением », что, я думаю, означает, что перемещение должно учитывать любой адрес, уже сохраненный с указанным смещением , Однако глава 5.6 (раздел .reloc) относится только к файлам изображений, а не к объектным файлам.
- Утилита dumpbin добавляет столбец с именем «Applied To» при печати таблицы перемещений, которая, как представляется, всегда (независимо от типа перемещения) содержит значение, которое хранится на сайте перемещения.
- В Relocation Directives chapter in the DJGPP COFF Specification четко указано, что значение, которое в настоящее время хранится в местоположении, должно быть добавлено к адресу символа, на который указывает запись таблицы перемещений.
Можете ли вы указать мне на любую (релевантную) документацию, которая объясняет, как репозиции обрабатываются компоновщиком?
Не подходит ли раздел для объектных файлов 4.2 «Перемещение COFF», а не раздел 5.6.2, который предназначен только для файлов изображений? – legalize
Это должно быть, но в разделе 4.2 не объясняется, что делать, если сайт переселения имеет значение, отличное от 0, хранящееся в нем, что на самом деле довольно распространено, и его можно легко увидеть с помощью dumpbin. – user2625389