Как преобразовать 32-битный скомпилированный двоичный файл в 64-битный

Фон:
Мы приобрели программный продукт, который встраивается в 32-разрядное приложение Windows в Visual Studio. Мы хотим портировать это приложение на 64-битную версию.

Критически важным компонентом этого кода является статическая библиотека «черного ящика» (файл .a), изначально созданная с помощью gFortran третьей стороной. Первоначальный разработчик с тех пор скончался, и исходный код на Фортране, который мы смогли получить, был неполным, а не версия, из которой была построена эта библиотека (и содержит критические ошибки, отсутствующие в скомпилированной библиотеке). Они не использовали VCS.

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

Что я пробовал:

  • Использование декомпилятора Snowman для перекомпиляции исходного кода на C ++ в 64-битной версии. Это оказалось невозможным, потому что сгенерированный код использует низкоуровневые встроенные функции, которые кажутся специфичными для gcc. Скорее всего, это не сработает, потому что такие встроенные функции будут компилироваться в код, который не является функционально эквивалентным в 64-битной среде. Скорее всего, мне нужен лучший декомпилятор.
  • Очевидно, сборка x86 является действительной сборкой x86_64, поэтому я кратко рассмотрел, почему я не мог просто запустить сборку через 64-разрядный ассемблер. Оказывается, ABI отличается в 64-битном, поэтому соглашение о вызовах не будет соответствовать. МОЖЕТ, я мог бы вручную преобразовать вызовы функций в надлежащее соглашение и оставить все то же самое, но это может быть неразрешимой проблемой. Мнения?

7

Решение

Вы можете хранить 32-битную двоичную библиотеку, но загружать ее в 32-битный хост-процесс и использовать какой-либо IPC (разделяемая память, именованные каналы, локальное петлевое сетевое соединение и т. Д.) Для передачи данных в / из 64-битной системы. немного процесса.

Еще одним преимуществом этого подхода является то, что в случае сбоя кода на Фортране он приведет к остановке только дочернего хост-процесса, а не вашего основного приложения, и ваша программа может немедленно запустить его снова; и если это однопоточная программа на Фортране, то вы могли бы раскрутить несколько экземпляров для многоядерного параллелизма.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]