Версия
Min GW 5.1.4 с компилятором gcc 3.4.5 и урезанными библиотеками.
Библиотеки
В lib/ лежит довольно много библиотек, при этом «ненужные» (lib{imagehlp,iphlpapi,ksproxy,mswsock,netapi32,penwin32,scrnsave,snmpapi,url,vfw32,videoprt,win{inet,mm,spool},ws2_32,wsock32,wst,wstapi32}.a переименованы. Заголовочные файлы доступны для всех библиотек.
Безопасность
Скрипт компиляции mingw.bat линкует каждый компилируемый файл с mingw/restr.o.
С помощью objdump выяснено, что restr.o скомпилирован из checker/temp.cpp, т. е. представляет собой переопределение некоторых функций (accept, bind, send, ...) на fprintf(stderr, Security Violation); exit 1;
Компилятор gcc версии 4.6.1 с минимально необходимыми библиотеками.
Установка
По инструкции с
сайта нужно распаковать следующие пакеты, но реально минимально достаточно лишь выделенных:
- binutils
- mingw-runtime (dev and dll)
- w32api
- Runtime libraries для GCC:
- mpc (dev and dll)
- mpfr (dev and dll)
- gmp (dev and dll)
- pthreads (dev and dll)
- gomp
- ssp
- intl
- iconv (dev and dll)
- gcc-core (bin and dll)
- gcc-g++ (bin and dll)
Из w32api нужны только файлы lib/lib{advapi,kernel,shell,user}32.a
Библиотеки
Так как распакованы только нужные пакеты, то в lib/ нет библиотек для работы с сетью, процессами и окнами.
В частности, большинство «ненужных» библиотек находилось в пакете w32api.
По умолчанию для запуска бинарников, произведённых gcc нужны libgcc_s_dw2–1.dll и libstdc+±6.dll. Первый нужно линковать статически (-static-libgcc), а второй:
- либо линковать статически (-static-libstdc++) (+ 1.3 Mi B к размеру бинарника (т. е. будут файлы в 28 раз больше))
- либо сделать run.bat, устанавливающий
$PATH %PATH%, содержащий libstdc++ перед запуском
- либо добавлять libstdc++ в системный PATH при установке тестирующего клиента
Безопасность
Дополнительно, каждый компилируемый файл линкуется с restrict.o, переопределяющим accept, bind, send, и т. д.
Будущее
- DONE
Надо провести тесты (хорошо бы перетестировку решений отправленных под mingw-5.1.4) с новым компилятором.
- DONE
Убедиться, что все «хорошие» решения компилируются, а «нехорошие» не линкуются из-за отстутствия библиотек
- DONE
В новом компиляторе значительно меньше библиотек, выяснить, не убрано ли лишнее
- Выяснить, почему размеры некоторых бинарников и библиотек больше соответствующих в mingw-5.1.4
- DONE
Выяснить, зачем в mingw-5.1.4 используется restr.o и добавить аналогичный функционал