Jun 03, 2019 09:31
СЯО (Сегодня я осознал) что что-то не консистентно в моём понимании мироустройства.
Смотрите:
1. ядро может выкидывать страницы кода из памяти, потому что может подгрузить его в любой момент обратно. Удаление файла (насколько я понимаю) не проблема, потому что файл открыт. Предполагается, что содержимое text не меняется, потому что это бинарь, а без спецфигни (типа компрессии исполняемых файлов) ему меняться не положено.
2. У нас есть ELF-файл, который состоит из текста и relocation table, которая описывает какие адреса в тексте надо заменить (чтобы бинарь можно было грузить по произвольному адресу). Т.е. у нас кто-то (ld? ядро?) читает текст, читает relocation table, бежит по тексту и меняет адреса для call/jmp в соответствии с relocation table.
Каким образом «неизменяемый текст» из п.1 соотносится с «пишет в текст» из пункта 2? Если страницу текста выкинули из памяти, то когда приходит время её подгрузить, то что происходит? Повторная обработка согласно relocation table?
Это я ещё отношения с LD (динамически линкуемыми библиотеками) не затронул.
linux