|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 28, 2004 15:08:11 Если я не ошибаюсь, релокация работает примерно так: Пусть IMAGE_BASE по умолчанию = 400000h. push $ тогда будет push 401000h. Так как 401000h - адрес абсолютный, то для того, что бы релокация была возможной, создаётся ссылка в таблице релоков на операнд команды push. Тепеь, если нужно загрузить PE по адресу 600000h, загрузчик посмотрит таблицу релоков и добавит к операнду push число 200000h, соответственно получится правильный операнд - 601000h. Т.е релоки нужны именно при "положительном" адресе. Если же адрес "отрицательный", то для "правильной релокации" нужно не прибавлять к нему смещение, а отнимать. В случае с push 1-$ и загрузке PE по адресу 600000h, "правильное" значение операндов должно бы быть FF9FF001. Но в загрузчике просто не предесмотрен такой случай т.к. с точки зрения PE формата отрицательных адресов просто быть не может. То, что EXE файлы загружаются по фиксированому адресу и могут не содержать релоков (если запуск не происходит в каком-нибудь Win32S) - это частный случай, поэтому то и можно обойти ограничение, использовав RVA. В реальной программе в общем-то сложно представить ситуацию, где может понадобиться вычитание адреса метки на момент компиляции. (хотя у меня такое было :-) Это не ограничение FASM - если не указывать format pe, то push 1-$ компилируется без проблем. |
|
|
Дата: Сен 28, 2004 15:45:26 загрузчик посмотрит таблицу релоков и добавит к операнду push число 200000h, Ого , я об релоках особо не читал и даже не подумал , что такое может быть . (хотя у меня такое было :-) И у меня уже не первый раз , вот недавно хотел сассемблировать : 00401002 | E8 13D0FA78 | CALL 793AE01A ; \ExitProcess А как ? Только полностью ручками , и дистанцию до 793AE01A считать . db 0E8h dd 78FAD013h если не указывать format pe, то push 1-$ компилируется без проблем. Это я не попробывал , спасибо :) |
|
|
Дата: Сен 28, 2004 18:31:03 bogrus > я об релоках особо не читал и даже не подумал , что такое может быть . Гы, я совсем не читал, но почему-то думаю что это именно так :-) > А как ? Только полностью ручками , и дистанцию до 793AE01A считать . А разве нельзя плюсом тут обойтись, непойму, почему обязательно минус должен быть? Вот, кстати, как делать на FASM PE файл без директивы 'format pe' |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.045 |