5

Многие программы поддерживают только 64-битные машины, потому что рынок 32-битных сейчас невелик. Однако для тех, кто застрял на 32-битных машинах, это означает, что более новые версии не могут быть установлены, и это может привести к проблемам безопасности. Одним из примеров является Firefox/Waterfox.

В общем, есть ли способ сделать 32-битную программу из 64-битной установки (.exe, .msi)?


Смотрите больше: Почему безопасность браузера должна быть приоритетом?

4 ответа4

12

Нет, это невозможно. Причина довольно обширная, может быть, даже слишком широкая для SuperUser, учитывая, что вам нужно будет объяснить основы того, как создавались x86 и x64, и как это влияет на программирование в целом.

Но, чтобы кратко объяснить, это сводится к следующему:

В прошлом у нас были 16-битные процессоры. Затем Intel выпустила первый 32-битный процессор, также известный как x86. Это 8086, 80286 (286 для краткости) и т.д ... В основном это была модификация 16-битных процессоров с добавлением дополнительных наборов команд. С каждым новым выпуском их серии процессоров Intel добавляла все больше наборов инструкций к семейству процессоров, что в итоге приводило к тому, что набор инструкций содержал много-много инструкций. Intel не могла просто удалить старые наборы инструкций, потому что это означало бы, что обратной совместимости не было, и Intel хотела продолжать поддерживать старые процессоры.

Поскольку процессор 32-разрядный, существует верхний предел, а именно максимальное 32-разрядное число. Это означает, что объем памяти только до 3,5 ГБ.

Раньше компьютеры были не такими мощными, поэтому если Intel с самого начала стремилась к 64-битным вычислениям, это означало бы, что на вычисление одинаковых чисел ушло бы гораздо больше времени, поэтому производительность снизилась бы просто потому, что числа для вычисления были больше.

К тому же 32-битные процессоры работали довольно долго.

В какой-то момент AMD вышла на рынок и представила 64-битный процессор. AMD создала свои собственные наборы инструкций, позволяющие работать с 64-битными кодами, в то же время сохраняя наборы команд Intel для 32-битных тактов, чтобы обеспечить обратную совместимость с 32-битными.

Учитывая, что это фактически разные наборы инструкций, программист, который создает 32-битные программы, будет вызывать другие процедуры, чем когда они создают 64-битные программы.

Теперь, когда я объясню, почему это трудно сделать, давайте продолжим объяснять проблему с точки зрения программирования.

Когда вы кодируете программу, вы сначала пишете свой код. Если ваш код обратно совместим для 32-битных программ, вы просто не можете использовать 64-битные числа и не можете одновременно адресовать более 3,5 гигабайт памяти. По сути, вы не можете пересекать какие-либо ограничения, с которыми сталкиваются 32-битные программы, иначе ваша программа будет аварийно завершена.

Поскольку теперь у вас есть код, только вы можете запустить вашу программу. Чтобы сделать так, чтобы другие люди могли запускать вашу программу, вы должны скомпилировать код в исполняемый файл. Это означает, что легко читаемый код преобразуется в инструкции, понятные процессору. Во время компиляции вы указываете, должна ли ваша программа работать на x86 или x64, и компилятор будет генерировать код, используя наборы команд на основе этой архитектуры процессора.

Как видите, вы не можете просто изменить исполняемый файл и заставить его работать на другом исполняемом файле. Сначала вам нужно декомпилировать программу в код, а затем перекомпилировать ее, используя различные инструкции.

Тем не менее, учитывая, что программа, скомпилированная для x86, будет изначально работать на x64, можно с уверенностью предположить, что программист создает программу x64, потому что он собирается нарушить ограничения архитектуры x86. Таким образом, даже если вы захотите превратить версию для x64 в версию для x86, вполне вероятно, что программа будет нестабильной, поскольку вы преодолеете ограничения, которые может делать 32-разрядная программа.

9

Теоретически это можно сделать!

Существуют способы перевода из нейтрального байт-кода/внутреннего представления в двоичный файл конкретной архитектуры, например, как работают современные компиляторы /JITters. Есть также эмуляторы, которые запускают программы для другой архитектуры на текущей. Bochs и QEMU являются двумя из самых известных. Увидеть:

Несмотря на это, я еще не видел никого, кто бы писал такой конвертер для одного двоичного файла, потому что в основном вам также нужно будет эмулировать все системные и библиотечные вызовы, что в любом случае было бы лучше для запуска всего эмулятора. Qemu также имеет возможность эмулировать только пользовательское пространство, так что на самом деле можно запускать программу вместе с необходимыми библиотеками без полноценной ОС

Однако, если ваш компьютер только 32-разрядный, это означает, что ему уже более 10 лет. Практически любые процессоры Intel от Pentium 4 Prescott в 2004 году (кроме некоторых ранних процессоров Atom) и все процессоры AMD от Athlon 64 в 2003 году и выше поддерживают 64-разрядную архитектуру. Пришло время обновить.

Если ваш компьютер достаточно новый, чтобы поддерживать x86_64 и VT-x, вы можете запустить 64-битную виртуальную машину внутри хоста, однако это не рекомендуется, и производительность будет даже хуже, чем при работе 64-битной ОС с 32-битной ВМ внутри. 64-разрядная ОС не требует вдвое большей памяти, чем 32-разрядная, как думали многие, поэтому даже при наличии всего 2 ГБ ОЗУ 64-разрядная ОС обычно все еще быстрее благодаря удвоенному количеству регистров и многим другие вещи. Между 1 и 2 Гб оперативной памяти, это спорно, но я бы на 64-битную


Тем не менее, что касается мер безопасности, 32-разрядные ОС часто запаздывают с исправлениями безопасности. Например, исправления Meltdown и Spectre устанавливаются для 32-битной Linux более чем через полгода после исправления 64-битной Linux. Исправления Meltdown предоставляются для 64-битной Windows 10, сборка 1507 и выше, но 32-битные пользователи защищены только после сборки 1511. И даже если они исправлены, такие древние машины обычно сталкиваются с гораздо большим влиянием на производительность, потому что у них нет новых инструкций и функций, чтобы компенсировать замедление. По этой причине MS не включает патч на некоторых старых ПК, если это явно не указано пользователем.

Иногда их вообще не исправляют, потому что у них недостаточно базы пользователей, а значит, нет стимула тратить огромные усилия. Эту проблему также невозможно исправить без аппаратной поддержки, если это аппаратная ошибка. Например, недавние атаки по побочным каналам, такие как Spectre или L1TF, также требуют обновленного микрокода, поэтому, если производитель процессора и / или системной платы не выпустит обновление прошивки, вам не повезло! Эти ошибки влияют на ЦП в последние два десятилетия, но невозможно предоставить исправления для очень старых систем. Windows 7 также отказалась от поддержки Pentium 3, потому что ее слишком сложно патчить без поддержки SSE2, или потому что слишком мало людей используют ее на этих процессорах.

32-битная Windows также более уязвима, потому что:

Если вы запускаете 64-битную ОС в эмуляторе, это будет даже медленнее. И даже если вы примете скорость сканирования и используете эмулятор, вредоносные программы на хосте все равно могут атаковать виртуальную машину в такой уязвимой системе. Опять же, время для обновления, если вы действительно заботитесь о безопасности, или вам придется бесконечно жить с менее защищенной системой

Дальнейшее чтение:

5

Это технически возможно; процесс называется бинарным переводом.

Это чаще всего встречается на практике с эмуляторами для разнородных платформ (например, ARM на x86, x86 на ARM) или для виртуализации, когда аппаратное ускорение недоступно.

Самая большая проблема, с которой вы столкнетесь, заключается в том, что вы не можете просто запустить большинство программ в вакууме. Они зависят от ABI операционной системы, которая обычно варьируется в зависимости от архитектуры. Это означает, что вам в конечном итоге потребуется добавить слой перевода для всех взаимодействий с ОС (вызовы API и т.д.), После чего вы могли бы также эмулировать всю ОС ... что описано в ответе phuclv.

1

Перекомпилируйте программу для 32-битной цели

Ваш вопрос был сформулирован как наличие 64-разрядного двоичного файла и желание запустить его как 32-разрядный, что довольно сложно, и в конечном итоге вам придется использовать эмулятор или другие сложные проблемы.

Однако, если у вас есть оригинальный код на языке высокого уровня (как в случае с Firefox), вы, вероятно, можете скомпилировать его в 32-битный код.

Здесь я с уважением не согласен с последним абзацем ответа LPChip о том, что программист создает программу для x64, потому что он собирается нарушить ограничения архитектуры x86. Они могли бы делать это, потому что это цель по умолчанию, чтобы соответствовать нативной архитектуре, или просто извлечь выгоду из возможности использовать больше памяти, если у пользователя было достаточно ОЗУ.

Некоторые функции, такие как 64-битные счетчики, сделанные из 32-битных, будут немного медленнее, чем использование собственного регистра. Если программа использует функции, специфичные для 64-битных систем (например, встроенная 64-битная сборка), она не будет работать. Основное внимание будет уделяться поддержке компилятора на любом используемом языке высокого уровня (и коде, который должен быть хорошо написан, поэтому он вполне переносим для начала).

Если мы сконцентрируемся на создании Firefox / Waterfox, для новичка это не простое начинание (в настоящее время браузеры похожи на собственную ОС), тем более что Firefox Quantum дополнительно требует компилятор ржавчины. Тем не менее, дистрибутивы Linux по-прежнему компилируют 32-битные версии Firefox, показывая, что он может работать под 32-битными версиями.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .