当前位置:首页 > 芯闻号 > 充电吧
[导读] 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.so和libc,可以证明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]


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭