Эта штука не компиляторозависимая, а библиотекозависимая. Для GNU ARM Embeded tools используется newlib, это библиотека с возможностью TLS (Thread Local Storage) -- каждый поток имеет свой набор структур, необходимых для работы библиотечных функций "С" (например, read/write приводят к установке errno, и в разных задачах этот errno должен быть разным).
Достаточно реализовать системные вызовы, которые должны быть предоставлены пользователем этой библиотеки, и всё заработает.
https://sourceware.org/newlib/ раздел Docs/Red Hat newlib C Library Documentation/2 System Calls/2.1 Definitions for OS interface
GNU ARM Embedded tools предоставляет свои реализации этих системных вызовов в виде библиотек, это значит, что на этапе линковки можно без проблем подменить некоторые предоставленные реализации своими функциями с теми же самыми именами и сигнатурами.
Конкретно (например, putc): открываешь share/doc/gcc-arm-none-eabi/html/libc/putc.html и читаешь пару абзацев. Supporting OS subroutines required: close, fstat, isatty, lseek, read, sbrk, write.
Другие реализации стандартной библиотеки языка С (Rogue Wave в armcc, или ещё какая-то в IAR) имеют другие привязки с операционной системе (или их заглушки, если операционка не используется).