Как сделать 32-битную программу из 64-битной версии?

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

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


Посмотреть подробнее: почему браузер безопасность в приоритете?

26
задан Ooker
29.04.2023 5:31 Количество просмотров материала 3698
Распечатать страницу

4 ответа

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

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

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

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

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

кроме того 32-битные процессоры работали довольно хорошо в течение длительного времени.

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

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

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

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

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

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

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

12
отвечен LPChip 2023-04-30 13:19

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

есть способы перевести с нейтрального код/внутреннее представление для конкретной архитектуры бинарных как современные компиляторы/мандраж работы. Существуют также эмулятор, которые запускают программы для другой архитектуры на текущей. Бохи и qemu являются двумя из самых известных. Смотри:

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

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

Если ваш компьютер достаточно новый, чтобы поддерживать x86_64 и VT-x, то вы можете run 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 не включить патч на некоторых старых ПК если явно не сказано пользователем.

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

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

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

читайте далее:

9
отвечен phuclv 2023-04-30 15:36

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

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

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

5
отвечен Bob 2023-04-30 17:53

перекомпилировать программу в 32-битный целевой

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

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

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

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

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

1
отвечен Ángel 2023-04-30 20:10

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх