Можно ли связать файл OMF, созданный инструментами Windows, с сборкой GCC в linux?
Я портирую приложение Windows VC++ на Linux, которое связано с модулем ассемблера, который в настоящее время производится MASM. После изменения его предположений Windows ABI на Linux ABI я хотел бы снова собрать модуль на MASM в OMF (в Windows), а затем непосредственно ввести этот объектный файл в сборку GCC (в Linux). Это значительно упростит техническое обслуживание и обеспечит идентичную сборку под обеими операционными системами. Альтернативой является перенос кода ассемблера на YASM/NASM и его сложности. Код на ассемблере - полностью листовые подпрограммы (без вызовов), без макросов, данных Unicode и скудных целых / реальных данных; он включает в себя 32-битную и 64-битную версии ассемблера. Если исключить проблемы с порядком байтов, действительно ли имеет значение, чья цепочка инструментов генерирует представление OMF для этого модуля?
1 ответ
Я протестировал его с помощью простого тестового примера, и он работал нормально, когда связывался с помощью компоновщика GNU под Linux. Так что вам, вероятно, не нужно делать ничего особенного.
Вот файл сборки, с которым я тестировал:
_TEXT SEGMENT USE32
PUBLIC foo
foo:
mov eax, 1234
ret
_TEXT ENDS
END
А вот и программа на С:
#include <stdio.h>
extern int foo();
int
main() {
printf("%d\n", foo());
return 0;
}
Я собрал первый файл в Windows с помощью MASM, скопировал полученный файл.OBJ на компьютер с Linux (Debian x86_64) и скомпилировал / связал его с помощью следующей команды:
gcc -m32 main.c foo.obj
Запуск сгенерированного исполняемого файла (a.out) дал ожидаемый результат: 1234
, Я также протестировал эквивалентный 64-битный корпус, и он также работал.
Если вы не зависите от порядка секций (сегментов), специфичных для PECOFF, или от других функций, специфичных для PECOFF, похоже, у вас не должно быть никаких проблем, по крайней мере, далеко идет формат объектного файла. Обратите внимание, что возможно, что версия компоновщика GNU, установленного на вашем Linux-компьютере, не была собрана с поддержкой PECOFF. В этом случае вам может потребоваться создать собственную версию из исходного кода.