Читаю туториалы по ассемблеру с WASM-a. Авто пишет: А разве RVA (относительный виртуальный адрес) и файловое смещение это не одно и то же? Если вам не трудно, можете подробнее про это пояснить на пальцах или же хорошей ссылочкой поделиться? Просто немножко непонятно, каким образом работает эта функция, как мэпирует файл PE-загрузчик и как это делаем мы в программе. Заранее спасибо.
RVA - адрес относительно начала образа загруженного в память исполняемого файла. Файловое смещение - смещение относительно начала файла на диске. Если entry point программы имеет, допустим, адрес 0x401000, то его RVA будет 0x1000, а файловое смещение будет зависеть от размера заголовка и секций и может быть, к примеру, 0x400.
Нет. Все дело в 1) разном выравнивании начала секций в файле (обычно 512 байт = размер сектора) и в загруженном в память образе (4К = размер страницы) 2) возможном наличии секций неинициализированных данных (типа .data? или .bss), которые в файле вообще не хранятся. Поэтому при загрузке образа в память секции "раздвигаются" по адресам, кратным 4К, и дополнительно могут вставляться обнуленные секции неинициализированных данных