Можно ли "пересобрать" исполняемый файл под другую архитектуру?

Не дает уснуть вопрос — а нельзя ли как нибудь исхитриться и пересобрать испоняемый файл одной архитектуры, допустим, х64 в другуюю, допустим, х86 или армв7, чтобы запустить на айпаде.


Почему мне кажется это может быть возможно:

1.Из исполняемого файла можно получить ассемблер х86

2. ???

3. Получаем ассемблер армв6

4. собираем в бинарник армв6


По поводу шага2 —

gcc знает как собрать код под обе архитектуры

Не возможно ли часом какая-либо утилита преобразующая код на одном ассемблере в код на другом

Я понимаю, что архитектуры разные, разные регистры, но ведь есть между ними отображение, возможно сложное изза взаимного влияния команд друг на друга но все же


Или это невозможно?

ps если это вдруг уже реализовано, то дайте пожалуйста ссылку

pps очень интересно где почитать и понять в чем я не прав если это так


спасибо

Если у вас есть возможность написать на эту тему статью — было бы совсем великолепно
  • Вопрос задан
  • 2926 просмотров
Пригласить эксперта
Ответы на вопрос 9
tampere
@tampere
возможно. эта утилита — виртуальная машина. соответственно, достаточно собрать на другой архитектуре эмулятор данного процессора (например) bochs. правда, никто не обещает высокую производительность.
Ответ написан
Ну, если программа не использует никакие системные вызовы (ввод/вывод, например), то можно попробовать. Hello world уже не пересоберется. :)
Ответ написан
xappymah
@xappymah
Вообще говоря такое невозможно (подразумевается невозможность ввиду бесконечно огромной трудоемкости). Если быть более точным, то ваш вариант перекомпиляции сводится к полному анализу дизассемблированного кода и, получив точный алгоритм работы, переписыванию его на ассемблере под другую архитектуру (под другую комбинацию ОС-процессор).
По опыту скажу, что даже на высокоуровневых языках переписывание кода под другую архитектуру может оказаться затруднительным. А делать это на уровне ассемблерного кода — даже врагу не пожелаешь.

Если захотите, то могу подробнее описать возможные подводные камни, проблемы и прочее.
Ответ написан
@Chii
Можно, но не нужно. называется эта штука Recompilation, но смысл в ней есть только с точки зрения оптимизации эмуляции. В любом случае получается не полноценный бинарник, а эмуляция, пусть и перекомпилированная и более оптимальная, чем эмуляция процессора.

Мораль: хотите, чтобы на вашей лопате запускался нужный софт? Пользуйтесь свободным софтом, у него таких проблем быть не может.
Ответ написан
javax
@javax
Software Architect, Java Developer since 1996
Теоретически можно, но очень сложно.
У процессоров разные архитектуры (наборы команд, количество регистров).
У операционных систем разные системные вызовы (т.е. что надо сделать чтобы вывести символ на консоль, например).

Теоретически можно попытаться декомпилировать программу в язык (относительно) высокого уровня, а потом скомпилировать опять. Например Яву — декомпилируют. Произвольную программу — очень сложно
Ответ написан
@rPman
Примерно этим занимаются некоторые виртуальные машины, на ходу анализируя код и генерируя код для текущей архитектуры — по аналогии с JIT (или это так и называется).
Ответ написан
@gribozavr
Если ОС — Linux, то qemu может эмулировать нужный процессор и транслировать системные вызовы. apt-get install qemu-user.
Ответ написан
opium
@opium
Просто люблю качественно работать
Теоретически нельзя так как ассемблер написан на инструкциях процессора и у разных процессоров разные инструкции.
Это все равно что сказать есть прога на си++, а давайте её на паскале запускать. Циклы то везде одинаковые почти.
Ответ написан
@65520
Вы неправильно ставите вопрос. Сама по себе пересборка под другую архитектуру вообще ничего не даст.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Сбер Москва
от 200 000 до 250 000 ₽
ЮГПА Ростов-на-Дону
от 100 000 до 130 000 ₽
Polkan-Job Москва
от 250 000 до 250 000 ₽
24 сент. 2021, в 19:24
1300 руб./в час
24 сент. 2021, в 18:40
3000 руб./за проект