Использование mingw-w64 с отдельным CRT
Эта статья основана на mingw-w64 версии 10, включенной в Debian Bookworm. Адаптировать эту инструкцию к другим версиям mingw-w64 должно быть несложно.
Зачем это нужно?
Компилирование стандартной библиотеки под другой процессор может помочь с совместимостью.
В моем случае, требуется поддержка процессоров начиная с i486, в то время, как Debian предоставляет crt собранную с i686 инструкциями (Pentium Pro и новее).
В этой ситуации нет необходимости пересобирать весь компилятор, достаточно замены crt (стандартной библиотеки).
Компилируем CRT
Скачайте исходный код вашей версии mingw-w64 и распакуйте куда-то.
Перед вызовом скрипта configure вам понадобится установить переменные окружения CFLAGS и CXXFLAGS.
export CFLAGS="-march=i486 -O2"
export CXXFLAGS="-march=i486 -O2"
export CPPFLAGS="-march=i486 -O2"
Важно отметить, что если вы не укажете -O2 здесь, то вы получите неоптимизированный код.
Также, вам потребуется указать правильный msvcrt, в моем случае это msvcrt-os, соответствующий msvcrt.dll, доступной в Visual C Redistributable 4.0 - 6.0.
Mingw-w64 рекоомендует использовать отдельную папку для сборки, что и следует сделать -- просто запустите configure из директории сборки.
path-to-mingw-w64/mingw-w64-crt/configure\
--host=i686-w64-mingw32\
--target=i486-w64-mingw32\
--with-default-msvcrt=msvcrt-os\
--prefix=crt_prefix
make
make install
Обратите внимание, что make install скопирует библиотеку в префикс, который вы укажете, поэтому, если вы не хотите сломать свою систему, вам лучше указать отдельную папку.
Using the compiled CRT
Для сборки чего-либо с новой crt вместо системной, укажите параметр -B в CFLAGS.
export CFLAGS="-Bcrt_prefix/lib"
Обратите внимание, что вам нужно указать директорию с файлами .a/.o, иначе компилятор их не найдет. Так же обратите внимание, что если вы укажете неправильную директорию, компилятор не выдаст какой-либо ошибки, а просто использует стандартную crt.