Во-первых, выкл, вам нужны эти функции stdio?
Можете ли вы заменить эти функции stdio. Например, вам действительно нужен printf (один из наиболее болезненных), или вы можете заменить их чем-то другим, например, функциями string_display () и hex_display (), которые довольно легко реализовать и библиотекой и не зависит от системы.
Эти функции файлового ввода-вывода? Кажется, я помню, что один из популярных jpeg-декодеров с открытым исходным кодом хотел сделать для вас файловый ввод-вывод. Насколько сложно действительно реализовать fopen () (просто вернуть с любым допустимым), фред, который просто отслеживает указатель в некоторых константных данных, которые вы включили в двоичный файл, и делает копию mem и fwrite, то же самое deal отслеживает указатель в массиве и делает копию mem.
У меня есть встроенные jpeg-декодеры, mp3 и т. Д., Которые выполняют системные вызовы, используя newlib (), что немного облегчает задачу, но в наши дни очень сложно создать кросс-компилятор, а также заменять системные вызовы на различные функции или путем моделирования этих функций.
Если вы используете бесплатный LiteSource Code Lite (теперь он называется codebench или что-то еще, так как это уже менторская графика, а не CodeSource) и заменяете системные вызовы на имитированные, вам больше не придется связываться с компиляторами.
У меня есть несколько очень простых MIPS-кодов, но также и некоторые инструкции по созданию вида кросс-компилятора GNU, о котором я говорю (отлично работает, если вы не используете системные вызовы, вызовы библиотеки C, вызовы библиотеки gcc, потому что вы реализовали все сам).
https://github.com/dwelch67/pic32_samples
Это не так уж далеко от того, что я собираю, до полного кросс-компилятора. Gcc / gnu не настолько стабилен, что вы можете просто кросс-компилировать любую версию из любой версии и заставить ее работать, также кросс-компиляторы для любой цели из любой версии на любом хосте, использующем любую версию, не стабильны. Время от времени версия binutils + gcc + newlib для цели просто работает. например, в этот период времени / истории это работало как на linux, так и на mingw на windows.
http://www.dwelch.com/ipod/gccarm.txt
но если вы не используете виртуальную машину (vmware и т. Д.) И не устанавливаете на нее старый linux с достаточно старой системой сборки, вы не сможете собрать вышеописанное.
Не так давно и, возможно, до сих пор это работало на современной системе. Это для руки, но, возможно, это также будет работать для MIPS.
http://www.cowlark.com/2009-07-04-building-gcc/
Не думаю, что у меня есть какой-либо код, размещенный с библиотеками mp3 и zlib и jpeg, которые используются без системных вызовов или с симулированными системными вызовами в месте, где я могу их опубликовать. mallocs легко реализовать для таких вещей, как zlib, если вы хотите использовать zlib в качестве теста производительности или чего-то другого, одноразовое сжатие или распаковку или и то, и другое, не вещь общего назначения, а контролируемая среда тестирования с входящими и исходящими данными. То же самое относится и к другим контролируемым средам: jpeg-кодирование или декодирование, mp3-кодирование или декодирование (они с потерями, поэтому вы не можете сравнить входные данные с выходными, чтобы убедиться, что система дала правильный результат, контрольную сумму или crc легко сравнить с известной хорошей системой). /результат).
Если вы исследуете файлы в newlib, которые я обнуляю, и заменяете позже, вы можете увидеть, во что newlib сводит вызовы stdio, тогда вы реализуете каждую из этих функций. У меня есть пара старых сайтов, на которых есть по крайней мере примеры dhrystone, которые просто хотели получить printf http://www.dwelch.com/ipod/ http://www.dwelch.com/gba/dhry.htm, где вы можете увидеть, что я сделал с функциями newlib, в основном просто стерилизовать их, возвращая передаваемое значение и выяснить, что делает newlib, когда он хочет вывести на стандартный вывод.
Или пример замены некоторых вызовов stdio альтернативными функциями, что приводит к чему-то, что все еще работает. не сказать, что это красиво, но вы можете играть в игру.
https://github.com/dwelch67/stm32f4d/blob/master/adventure/
По сути, я читаю, что вы определили проблему, но идете только одним путем, решая ее на стороне компилятора.Когда вы могли бы решить это, создав абстракционный слой или прокладку, или полностью удалив код, вызывающий нарушение, или заменив его менее оскорбительным кодом.Если вы посмотрите на исходный код приключений выше и аналогичную империю игр эпохи и т. Д., Даже на небольшие компиляторы c и другой код, который был перенесен несколько раз, вы увидите, что они сделали именно это, они решили проблему, сделавязык, несистемные вызовы в основной части кода, а затем последней милей было реализовать эти вызовы в одном или нескольких системных местах.Даже если вы хотите получить кросс-компилятор gcc + newlib или gcc + glibc, вам все равно придется заменить стандартный stdio на уровень операционной системы своим собственным.(это также сторона компилятора, большой громоздкий уровень абстракции, glibc, newlib и т. д., который вам все еще нужно реализовать для бэкэнда).