操作系统开发 - 移值Linux的库来我OS我的计划

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.solibc,可以证明C语言顶起了世界,令人惊奇的是C++语言在底层的重要性比我想像中要低很多,最起码的就是standard c++ library在最底几层不见踪影。所以说Linux底层是C++不正确。

移植次序

1) 先搞定libc 这个无可置办的,可以用newlib作为glibc的缔代品, glibc过于巨型

2) 所有对libc只有单一依赖的库, 意思是如果有一个库, 它只对libc有所依赖, 先移植它们, 它们是libc, libc, zlib, libm, libpthread. 能提它们移过来, 就可以跑起busybox 证明如下:

/root/download/busybox-1.20.2/_install/bin>readelf -a busybox |grep -i needed
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值