Можно ли связать файл 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. В этом случае вам может потребоваться создать собственную версию из исходного кода.

Другие вопросы по тегам