Я пытаюсь связать объектные файлы, сгенерированные MinGW g cc, с ld.exe, поставляемым с MinGW, для создания окончательного 32-битного исполняемого файла на Windows 10 64-бит. Код более чем достаточно прост. У меня есть файл maindefined. c с основной функцией:
void main(int argc, char **argv) {}
Для mainCRTStartup я использую пользовательский код запуска C nocrt0, который я нашел на GitHub, который утверждает полностью совместим с MinGW: https://github.com/matveyt/nocrt0, который анализирует аргументы командной строки и вызывает main (), предоставляя эти аргументы.
Я поместил этот код запуска nocrt0 c. c (поскольку я пытаюсь разработать простое консольное приложение) для файла с именем maincaller. c
Я создаю объектный файл для этих двух C источников через MinGW g cc командная строка
gcc -g -O -c maincaller.c -m32
gcc -g -O -c maindefined.c -m32
Я просмотрел код запуска nocrt0 и обнаружил, что он использует API GetCommandLine()
, экспортированный kernel32.dll для Извлеките аргументы командной строки перед их синтаксическим анализом и предоставьте их main, поэтому во время соединения с ld я поставил 32-битную версию kernel32.dll на моем P C во входных данных
ld --verbose -o output.exe maincaller.o maindefined.o "c:\windows\syswow64\kernel32.dll"
Это исключает нерешенную внешнюю ошибку как ожидаемую. d, но конечный файл output.exe представляет собой файл нулевого размера, абсолютно без ввода. Ld verbose также не выводит никаких полезных ошибок. Что может быть не так? Хотелось бы помочь с этим