Основной вопрос - кто нибудь когда-нибудь видел работающий исполняемый файл размера больше 4 Гб?
У меня подозрение, что в винде существует тупое ограничение на размер EXE-файла, равное 4 Гб. Я создаю exe-файл размером 4400 Мб (ну это типа инсталлятор), но при запуске он выдает только "программа не является приложением Win32". Код, создающий экзешник, вроде как отлаженный, и создаваемые файлы меньшего размера рабочие (3 Гб exe-файл работает). В различной документации про ограничение на размер exe не нашел.
Чтобы было ясно - я не собираюсь запихнуть в адресное пространство четыре с половиной гига, собственно программа (image) занимает очень немного, то есть большая часть экзешника является оверлеем, который по идее не должен проецироваться в память загрузчиком.
Кроме ограничения, остается вариант, что для большого размера поля PE-заголовков надо заполнять как-то по особому. Может кто что-нибудь знает по этому поводу, в спецификации PE ничего хорошего не нашел.
Спасибо за внимание.
P.S. Пока писал, пришла мысль проверить с WinRar'ом, создал SFX-архив больше 4 Гб, тоже не работает, но WinRar даже не дает предупреждения, что работать не будет
28 августа 2009 в 22:03
А чо за неведомая ***ная **ня на 4 гига? Не проще ли как все цивилизованные люди делают – инсталятор на 500 килобайт, а файлы распаковываемые на 4-5 гигов?
28 августа 2009 в 22:04
Ну, иногда удобнее чтобы все было в одном файле, к примеру, когда скачивают файл с инета, одной ссылкой. Вопрос ведь не об этом. Понятно, что если не получится, сделаю как цивилизованные люди делают )
28 августа 2009 в 22:05
Ога, удобнее.. Я ***дь полтора часа ждал, пока е**ная контра сурс установится из такого вот огромного EXE, а если его антивирусник начнёт шерстить? Это ш пипец… К слово о контре – я со стима за 15 минут выкачиваю и она работает, а двухтонный экзешник полтора часа ставился, как я уже сказал.
Экзешник же прямиком в оперативку уходит, так? А если система 32х битная, то наверное поэтому больше 4х гигов и не получается, если пейджфайл отключен и прочее
28 августа 2009 в 22:05
Может на 64битной системе будет работать… особенно если памяти больше 4гб будет
Для скачивания все можно в архив помещать, zip винда давно поддерживать научилась.
28 августа 2009 в 23:00
> Ну, иногда удобнее чтобы все было в одном файле, к примеру, когда скачивают файл с инета, одной ссылкой
Все это сливать zip'om (без сжатия!) в один файл
А вот, что говорит по этому поводу Рихтер
==================
При вызове из потока функции CreateProcess система действует так:
1. Отыскивает ЕХЕ-файл, указанный при вызове CreateProcess. Если файл не найден, новый процесс не создастся, а функция возвращает FALSE.
2. Создает новый объект ядра «процесс»
3. Создает адресное пространство нового процесса
4. Резервирует регион адресного пространства — такой, чтобы в него поместил ся данный ЕХЕ-файл Желательное расположение этого региона указывается внут ри самого ЕХЕ-файла По умолчанию базовый адрес ЕХЕ-файла — 0×00400000 (в 64-разрядном приложении под управлением 64-разрядпой Windows 2000 этот адрес может быть другим). При создании исполняемого файла приложе ния базовый адрес может быть изменен через параметр компоновщика /BASE.
5. Отмечает, что физическая память, связанная с зарезервированным регионом, — ЕХЕ-файл на диске, а нс страничный файл.
Спроецировав ЕХЕ-файл на адресное пространство процесса, система обращает ся к разделу ЕХЕ-файла со списком DLL, содержащих необходимые программе функции. После этого система, вызывая LoadLibrary, поочередно загружает указанные (а при необходимости и дополнительные) DLL-модули. Всякий раз, когда для загрузки DLL вызывается LoadLibrary, система выполняет действия, аналогичные описанным выще в пп. 4 и 5:
==================
28 августа 2009 в 23:00
2 Евгений сферический в вакууме Тихонов:
Про удобство. Да я все понимаю ) Я не собираюсь выкладывать здоровый файл в инет, чтобы кто-то его качал. Есть достаточно конкретная задача, и я утверждаю, что в моих обстоятествах один exe огромного размера удобнее других вариантов.
Огромный exe может запускаться долго, если он с сертификатом. Тогда естественно перед запуском винда долго считает его хеш, чтобы проверить цифровую подпись. В моем случае подписей не будет )
В оперативку экзешник прямиком не уходит, если он правильно сделан. То есть в адресное пространство проецируются только те части файла, которые относятся к секциям, а остаток файла (оверлей) не загружается, его будет грузить сам экзешник из себя с помощью обычного ввода-вывода. Проблема в том, что до него управление не доходит совсем, система отказывается запускать файл.
28 августа 2009 в 23:00
2 Антон Щиров:
Я в курсе, что говорил Рихтер )
То что файл не грузится в память целиком, легко доказать тем, что 3 Гб экзешник запускается и работает, а пользовательская часть адресного пространства составляет, как известно 2 Гб. И работает все очень быстро.
И все же, видел кто-нибудь файл или нет?!
28 августа 2009 в 23:01
Может просто система тупит от таких размерах на этапах загрузки и не может понять, чего куда и сколько грузить. Если размер ровно 4гб или на байт меньше, то работает или нет?
28 августа 2009 в 23:02
Этого я не проверял… я 4 Гб как границу определил приближенно, только по тем цифрам, которые в первом посте ) Может завтра проверю.
А система – ну возможно тупит, это как бы и выясняю ) тогда все понятно. Единственно странно, что WinRar как бы не колеблясь создает неработающий файл, и ничего не предупреждает. Помнится, где-то читал, что в какой-то новой его версии убрано ограничение на размер SFX архивов 4 Гб. Что толку тогда с этого новшества.
Правда, может ограничение появилось только в висте (забыл сказать про нее), а раньше не было.
29 августа 2009 в 3:01
Результат dumpbin в студию.