linux下mips裸机编译,裸机交叉编译器输入

这篇博客讨论了如何在没有操作系统的情况下使用GNU工具链,特别是GCC,来构建裸机应用程序。重点在于Newlib库在提供系统调用存根中的作用,以及如何为特定目标如UART实现I/O和内存管理。同时,提到了C运行时启动程序(crt0.s)的重要性,以及处理器初始化的必要性。对于那些希望深入理解底层系统构建的读者,文中还推荐了一篇关于ARM裸机构建的文章。
摘要由CSDN通过智能技术生成

我建议您应该开始两个单独的问题.

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的工具链)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值