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

2306
Ooker

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

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


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

5
Если вы могли бы сделать это легко, то и поставщики программного обеспечения могли бы сделать это за вас. gronostaj 6 лет назад 3
It's also worth noting that if you're talking about an x86 system, it _really_ is worth upgrading even aside from the security implications. An otherwise identical x86 system running 32-bit versus 64-bit will (almost) always perform better running 64-bit. Austin Hemmelgarn 6 лет назад 2
@AustinHemmelgarn Я думал, что x86 - это еще один способ сказать 32-бит? Ooker 6 лет назад 0
Правильные имена - x86 и x86-64. x86-64 - это расширенный набор x86, поэтому можно сказать, что процессоры x86-64 также являются x86. Процессор x86-64 можно использовать как процессор x86, но он не выиграет от других улучшений x86-64. gronostaj 6 лет назад 0
@gronostaj Вы имели в виду, что x86-64 является ** подмножеством ** x86? Ooker 6 лет назад 0
Нет, x86-64 - это _superset_ из x86. Он содержит все функции x86 + больше. x86 является подмножеством x86-64. gronostaj 6 лет назад 1
@Ooker It depends on the context. Realistically speaking though, when someone just says 'x86' without any specific qualifiers, they mean the architecture as a whole, not just the 32-bit version. Austin Hemmelgarn 6 лет назад 1
@gronostaj Вероятно, стоит отметить, что ваше утверждение относится только к аппаратному обеспечению и не относится к прямому сравнению между длинным и старым режимами на 64-битных процессорах x86 (как минимум, некоторые регистры сегментов непригодны для использования в длинном режиме). ). Austin Hemmelgarn 6 лет назад 0
@gronostaj Я понимаю, что вы имеете в виду. Я думал об определении суперсета. A ⊂ B ⇔ все элементы A принадлежат B. Поэтому, когда вы говорите, что «процессоры x86-64 также x86», можно только понять, что первый является подмножеством второго. Ooker 6 лет назад 0
О, теперь я понял. Вы думаете о наборах процессоров, определенных наборами функций, а я думаю о наборах функций. gronostaj 6 лет назад 0
64-разрядная версия на самом деле не делает системы быстрее. Это сделало более реальную память адресуемой. Выполнение работы с производительностью, когда происходило 32> 64, фактически замедляло работу. Тем не менее, я согласен с другими ... обновить. Так много преимуществ Hogstrom 6 лет назад 0

4 ответа на вопрос

12
LPChip

Нет, это невозможно. Причина довольно обширная, может быть, даже слишком широкая для 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-разрядная программа.

Хорошая рецензия. Технически это не совсем правильно, но в качестве упрощенного объяснения это подойдет. Tonny 6 лет назад 6
Благодарю. Да, это трудно сделать технически правильным, если вы должны ограничить себя. Это лучшее, что я мог сделать, чтобы он подходил для SuperUser. LPChip 6 лет назад 2
9
phuclv

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

Существуют способы перевода из нейтрального байт-кода / внутреннего представления в двоичный файл конкретной архитектуры, например, как работают современные компиляторы / 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-битную ОС в эмуляторе, это будет даже медленнее. И даже если вы примете скорость сканирования и используете эмулятор, вредоносные программы на хосте все равно могут атаковать виртуальную машину в такой уязвимой системе. Опять же, время для обновления, если вы действительно заботитесь о безопасности, или вам придется бесконечно жить с менее защищенной системой

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

"such ancient machines will face a lot more performance impact because they don't have the new instructions and features to offset the slowdown." - **This isn't entirely true.** There is absolutely no reason, I could not run a 32-bit operating system with an i7 8086K, and Windows 10. Just because the system is running a 32-bit operating system does not mean it's ancient. Ramhound 6 лет назад 2
в этих системах лучше использовать 64-битную ОС. Если 32-разрядная ОС действительно необходима, просто запустите ее на виртуальной машине. Я уже говорил, что это относится к ** 32-битным системам ** phuclv 6 лет назад 0
+1 за указание на эмуляцию (с бинарным переводом) может это сделать. Bob 6 лет назад 0
Подробнее: [Почему безопасность браузера должна быть приоритетом?] (Https://security.stackexchange.com/q/194345/94500) Ooker 6 лет назад 0
@Ramhound несколько понимает проблему. Дело не только в том, что вы можете выбрать установку 32-битной ОС на новую систему, в нижней части рынка ПК (например, Atom с 2 ГБ ОЗУ), с которой некоторые системы все еще продавались в течение последних 2 или 3 лет с 32-битной Windows, даже если бы у них был 64-битный процессор. Вероятно, это отчасти связано с тем, что эти системы имеют очень маленькие твердотельные накопители, а win32 занимает меньше места, чем win64, и отчасти потому, что самый дешевый уровень лицензирования Windows для Windows у крупных OEM-производителей (это не то же самое, что установка «OEM», которую вы можете купить как потребитель ) был (есть ???) 32bit только. Dan Neely 6 лет назад 1
5
Bob

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

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

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

1
Ángel

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

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

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

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

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

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

Хотя мне обычно нравится этот ответ, к сожалению, он часто не так прост, как перекомпиляция: хотя хорошая практика предполагает, что разработчики должны использовать независимые от платформы типы (например, `int32_t` или` int64_t` вместо `long` или` long long`), к сожалению, это не всегда следует Если существуют предположения относительно размера слова, компиляция для другой архитектуры не будет работать. Аналогично, если есть какие-либо специфичные для x86_64 оптимизации. Имейте в виду, что x86_64 предоставляет гораздо больше регистров общего назначения, чем x86; отличается не только размер указателя. Bob 6 лет назад 0