SII писал(а):
Слишком жёстко что-то фиксировать -- ИМХО, нехорошо. В частности, любой нормальный загрузочный модуль должен быть перемещаемым (ну или позиционно-независимым). В Винде, собственно, так и есть, просто у большинства ЕХЕшников таблица перемещений удалена, из-за чего они становятся неперемещаемыми (тем не менее, технически использование перемещаемых ЕХЕшников там поддерживается).
А кто сказал, что не поддерживается. Но, как вы сами сказали, информация для релокации выбрасывается из большинства исполняемых модулей, являющихся основными модулями приложений. В таком виде мы и получаем большинство программ. Насчет "любого нормально модуля", который что-то там должен, не согласен - это мое ИМХО. "Норма" - это то, что принимается и используется большинством, т.е. это не только мое "скромное мнение".
Цитата:
Так что надо просто делать поддержку перемещаемых модулей, а в документации чётко оговорить: базовый адрес загрузки приложения предсказать невозможно, поэтому полагаться на него нельзя. Если после этого какой-то придурок сделает неперемещаемое приложение -- это его проблемы; такое приложение должно быть выброшено на свалку, и всё (желательно вместе с автором).
Где наше скромное место, мы и так знаем :) У меня приложение может быть и перемещаемым, и нет. В последнем случае, если его (фиксированная) база удовлетворяет определенным требованиям, у него тоже очень мало шансов оказаться на свалке. Мне кажется, что данные для релокации, - это в подавляющем большинстве случаев избыточная информация для прикладного исполняемого модуля.
Цитата:
Что же касается траты времени на перемещение, то эта не шибко большая проблема. Во-первых, приложение можно строить в предположении, что оно будет грузиться с какого-то достаточно большого адреса, и ОС, если только имеется такая возможность, должна грузить такое приложение именно с этого адреса; все накладные расходы в такой ситуации сводятся к проверке возможности выделения необходимого объёма виртуальной памяти с данного адреса -- а это мизер по сравнению со всем остальным. Но и в том случае, когда перемещение потребуется, расходы на прибавление базового адреса загрузки и выполнение других действий, связанных с перемещением, будут ощутимо меньше, чем время физической загрузки приложения с внешнего носителя, т.е. скорость запуска приложения будет по-прежнему определяться в первую очередь временем, потребным на его поиск и загрузку.
Это все понятно, но если этого вообще можно избежать, то почему бы это не сделать. Думаю, я достаточно обосновал свою точку зрения. А что вы выберете, дело ваше.