Как оно вообще происходит? Хорошо, пусть существует поле с предпочтительным адресом загрузки и все адреса базируются на этот адрес, а когда фактический адрес загрузки отличается от предпочтительного, адреса просто складываются с разностью. Эйси. А как система ищет перебазируемые адреса? Пусть предпочтительный адрес загрузки 0x40000000, данные начинаются с 0x40002000, по этому адресу валяется 4=х байтное целое и где то в коде есть инструкция , или | Код | MOV EAX, 0x40002000 MOV SI, EAX MOV EAX, [SI] |
, а файл загружен по адресу 0x60000000, тогда вместо 0x40002000 должно стоять 0x60002000. 0x40002000+(0x60000000-0x40002000)=0x60002000. Вроде адрес вычислен правильный. Только где его искать в коде исполняемой секции? И как быть если адрес 0x40002000 случайно совпал с константой 0x40002000? Ведь когда 0x40002000 - не адрес, а обычное данное, загружаемое в регистр для каких то математических расчётов, то исправлять его на 0x60002000 уже не надо. А в адресной арифметике
| Код | MOV EAX, 0x40002000 ADD EAX, EBX MOV SI, EAX MOV EAX, [SI] |
надо. |