本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,并注明原作者及原链接。内容可任意使用,但对因使用该内容引起的后果不做任何保证。
作者:fireaxe_hq@hotmail.com
博客:fireaxe.blog.chinaunix.net
环境:
Environment:Ubuntu 12.04
tool-chain:DENX的ELDK-PPC-5.4
文件系统:busybox-1.21.1
问题:
ELDK从2008升级为5.4后,竟然不再支持静态链接,所以需要用动态链接的方式编译busybox。
(关于不支持静态链接问题,我没有找到,但不能确定ELDK5.4是否真的不支持。google了一下,说是对于静态链接的争论很大,主要是说它不利于重用与升级,似乎GNU正在考虑去掉静态链接)
过程:
1. 配置busybox
> make menuconfig
在”Busybox Settings ---> Build Options --->“ 关闭“Build BusyBox as a static binary。
打开”Build shared libbusybox“。
关闭”Produce a binary for each applet“与”Produce additional busybox binary“。
保存退出
2. 编译并安装busybox
> make
> make install
生成的文件就放在_install目录中了
3. 找出busybox的依赖关系 (即找到busybox依赖的动态库)
这里介绍有四种方式:
1) readelf
> powerpc-linux-readelf -d busybox | grep NEEDED
0x00000001 (NEEDED) Shared library: [libcrypt.so.1]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]
2) objdump
>powerpc-linux-objdump -x busybox | grep NEEDED
NEEDED libcrypt.so.1
NEEDED libm.so.6
NEEDED libc.so.6
3)直接找字符串
> strings busybox | grep ^lib
libcrypt.so.1
libm.so.6
libc.so.6
4) ldd (ELDK的tool-chain没有提供ldd,下面是在宿主机上测试的结果,用于说明为什么需要ld.so)
ldd busybox
linux-gate.so.1 => (0xb776d000)
libcrypt.so.1 => /lib/i386-linux-gnu/libcrypt.so.1 (0xb7729000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb76fd000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7552000)
/lib/ld-linux.so.2 (0xb776e000)
前三种方法大致相同,都能找出所需的动态库,最后一个ldd特别一点。
ldd中以/lib/"开头的几个文件时所需的库文件,但它比前三种方法多找出了一个库:ld-linux.so.2。这个是默认需要的,所以前三种方法并没有列出,但我们拷贝的时候是一个也不能少的。
综上所述,一共需要拷贝四类文件,为什么说是四类呢,因为有些文件只是一个快捷方式(连接),所以必须连着实际的库文件一起拷贝:
libcrypt
libm
libc
ld-linux
4. 拷贝文件
这些库文件可以从toolchain的sysroot目录中获得,如果不知道路径,可以问问编译器:
> powerpc-linux-gcc -print-sysroot
/opt/eldk-5.4/powerpc/sysroots/powerpc-linux
库文件在这个目录的lib目录里。拷贝时一定要拷全!!
最后,别忘了方法四种提到的ld.so。它是动态加载器(dynamic loader),也在lib目录中,名字前缀为ld。
其他的步骤就与静态链接时没有区别了
references:
本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,并注明原作者及原链接。内容可任意使用,但对因使用该内容引起的后果不做任何保证。
作者:fireaxe_hq@hotmail.com
博客:fireaxe.blog.chinaunix.net
阅读(612) | 评论(0) | 转发(0) |