newlib简介笔记(解决undefined reference to _sbrk() _write() _lseek() _read()的连接错误)

说明:newlib 的说明,网上找不到清楚的介绍,但是百度给出了答案https://baike.baidu.com/item/newlib/1886687?fr=aladdin

简单的废话介绍:

Newlib是一个面向嵌入式系统的C运行库。最初是由Cygnus Solutions收集组装的一个源代码集合,取名为newlib,现在由Red Hat维护,最新的版本是3.3.0。

对于与GNU兼容的嵌入式C运行库,Newlib并不是唯一的选择,但是从成熟度来讲,newlib是最优秀的。newlib具有独特的体系结构,使得它能够非常好地满足深度嵌入式系统的要求。newlib可移植性强,具有可重入特性、功能完备等特点,已广泛应用于各种嵌入式系统中。 

重点的移植方式:

Newlib的所有库函数都建立在20个桩函数的基础上[2],这20个桩函数完成一些newlib无法实现的功能:

1) 级I/O和文件系统访问(open、close、read、write、lseek、stat、fstat、fcntl、link、unlink、rename);

2) 扩大内存堆的需求(sbrk);

3) 获得当前系统的日期和时间(gettimeofday、times);

4) 各种类型的任务管理函数(execve、fork、getpid、kill、wait、_exit);

这20个桩函数在语义、语法上与POSIX标准下对应的20个同名系统调用是完全兼容的。成功移植newlib的关键是在目标系统环境下,找到能够与这些桩函数衔接的功能函数并实现这些桩函数。

最后移植的方案:我找到了一些网友的参考建议:

https://blog.csdn.net/weiqi7777/article/details/88042968

目前准备测试移植使用。如果真如下面所诉,那就值得一试。

在newlib库的顶层,有libgloss目录。

newlib官网上,介绍了libgloss和main newlib的关系。可以这样认为,libgloss是底层的驱动实现,而main newlib是有硬件平台无关的通用功能实现。

在libgloss下,以各个硬件平台为文件夹,进行组织的。这里我们关心aarch64。在aarch64目录中,有syscalls.c文件,里面,就实现了newlib需要的各个桩函数。

https://blog.csdn.net/whatday/article/details/87069246

 

你可能感兴趣的:(c标准库,newlib,嵌入式)