【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
对于交叉工具链来说,uclibc一般都是包括在工具链里面的。通过uclibc,大家可以像开发x86用户程序一样,开发其他cpu上的应用程序。uclibc相比较glibc而言,包含的文件较少,功能也有删减,且每一个目录代表一个动态库,阅读起来基本不会遇到什么问题。
1、uclibc的代码怎么看?
建议直接在github上找一个uclibc来看,比如https://github.com/klee/klee-uclibc
2、uclibc看什么?
建议前期看ld.so和libc.so的源代码,后期可以看其他动态库的代码
3、ld.so和libc.so作用是什么?
ld.so主要负责动态库加载、.got.plt填充,libc.so主要负责内存分配、signal、字符处理等函数
4、ld.so、libc.so是用户程序吗?
和hello_world一样,所有资源依赖于syscall
5、ld.so、libc.so和syscall有什么关系?
ld.so和libc.so可能用到syscall,也可能用不到
比如malloc中的内存分配肯定用到syscall,但是strlen没有用到
此外,一个动态库api可能涉及到几个syscall,这都是有可能的
6、ld.so、libc.so和kernel是怎么交互的
首先execve执行函数,交给ld.so之后,继续完成剩下的工作,接着跳到libc.so里面的main函数
如果在用户app里面发现其他动态库函数,则ld负责.got.plt加载工作
7、一个完整程序需要哪些工具的配合?
首先链接器负责.got.plt、.plt创建
接着操作系统负责fork、execve、open、read、write操作、主要是将文件读到内存,同时将参数传给加载器
最后加载器完成可执行文件的执行工作
8、static链接时,是不是就用不到uclibc了?
不是,static链接时,ld.so、libc.so等动态库里面的函数就全部留在执行文件里面了,这一点可以通过反汇编可以看的出来
9、uclibc为什么要和kernel共享一些数据结构?
kernel需要在用户syscall的时候得处理一些数据,这些数据格式必须保持一致
10、了解uclibc的好处是什么?
克服对嵌入式的畏惧,调试软件更加得心应手