随想录(uclibc的学习)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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的好处是什么?

克服对嵌入式的畏惧,调试软件更加得心应手


ps:

gcc交叉工具链一般要编译两遍,就是一次不支持动态库。待用第一次编译得到的gcc编译uclibc之后,再编译一次支持动态库的gcc。



你可能感兴趣的:(随想录)