我建议您应该开始两个单独的问题.
GNU工具链没有任何OS依赖性,但GNU库却有. GCC的大多数裸机交叉构建使用Newlib C库,该库提供了一组syscall存根,您必须自己映射到目标.这些存根包括实现流I / O和堆管理所必需的低级调用.根据您的需要,它们可以非常简单也可以非常复杂.如果唯一的I / O支持是到UART的stdin / stdout / stderr,那么这很简单.您不必实现所有内容,但是如果您不实现I / O存根,则将无法使用例如printf().要使malloc()工作,必须实现sbrk()/ sbrk_r()syscall.
GNU C库将与Newlib作为其基础库一起正常使用.如果使用C,则C运行时启动程序(通常为crt0.s)必须包括静态初始化程序循环,以调用代码可能包含的任何静态对象的构造函数.当然,运行时启动还必须初始化处理器,时钟,SDRAM控制器,计时器,MMU等.那是您的责任,而不是编译器的责任.
我没有MIPS目标的经验,但是所有处理器的原理都是相同的,有一篇非常有用的文章叫做“Building Bare Metal ARM with GNU”,您可能会发现它很有用,很多文章都将是有用的-特别是移植有关实现Newlib存根的部分.
关于另一个问题,如果您的编译器名为mipsel-linux-cpp,则它不是“裸机”构建,而是Linux构建.同样,该可执行文件并不是真正的“编译,汇编和链接”,而是单独调用预处理器,编译器,汇编器和链接器的驱动程序.必须正确配置它才能调用跨工具而不是宿主工具.我通常分别调用链接器,以执行关于链接哪个标准库(-nostdlib)的决定,并且还因为当应用程序由多个执行单元组成时,这样做更有意义.除了这里我不能提供太多帮助,因为我一直使用明显比我耐心得多的人构建的GNU-ARM工具,而且该工具托管在Windows上,在这种情况下,调用宿主工具链的可能性较小(一个为什么我也避免了那些依赖Cygwin的工具链)