Chinaunix首页 | 论坛 | 博客
  • 博客访问: 268900
  • 博文数量: 86
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 398
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-27 15:56
文章存档

2017年(3)

2015年(21)

2014年(62)

我的朋友

分类: LINUX

2015-03-10 22:43:57

原文地址:Busybox之动态链接 作者:fireaxe

本文乃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

阅读(1385) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~