Linux下有很多不同的库, 要把它们通通都移值去我OS是一个超大的任务, 有任务首先要有计划,要用一个比较科学的方法去决定移值次序, 可以如下:
先移值最底层的库, 但怎决定那一个库是最底层呢? 我搞了个小软件可以查看各个库的依赖情况, 它的原理很简单, 就是查看在各个库中ELF文件格式的记录,在ELF记录中有一段是记录这个库和什么库作依赖。把/lib , /usr/lib, /usr/local/lib扫描一次就可以生成以下的一张“library dependency chart"
在图的左面你会看到Level 0, Level 1等等, 它代表第几层,在右面你会看到很多不同的库, 在同一层的库, 它们会对下层的库有依赖,箭头所指的就是依赖(Dependency)。
这种技术也有它的缺点, 就是在静态库里面根本没有记录依赖的资讯, 原因是"静态"是不作dynamic linking的。但linux上大部分的库也是动态的库,所有生成的依赖图也是很准的了。 我用我的这个小软件试了扫描很多不同的linux程式, 简单的有三四层, 复杂的我见过有16,17层左右, 很少超过20层.
如果有两个在相同层的库, 我们应该怎决定先移植那一个先呢? 我个人认为先取易舍难, 我们大可以扫描在库中的ELF格式的symbol数量(重复的不计),就可以知道它用了它所依赖的库的多少个函数,太约可以估计有移植这个库有多复杂.
Linux世界是树型结构
Linux世界是树型结构,最底层的总是ld-linux.so和libc,可以证明C语言顶起了世界,令人惊奇的是C++语言在底层的重要性比我想像中要低很多,最起码的就是standard c++ library在最底几层不见踪影。所以说Linux底层是C++不正确。
移植次序
1) 先搞定libc, 这个无可置办的,可以用newlib作为glibc的缔代品, glibc过于巨型
2) 所有对libc只有单一依赖的库, 意思是如果有一个库, 它只对libc有所依赖, 先移植它们, 它们是libc, libc, zlib, libm, libpthread. 能提它们移过来, 就可以跑起busybox, 证明如下: