交叉编译缺动态链接库的解决方法
龙芯中科嵌入式
June11,2012
Contents
1察看elf文件依赖的动态链库2 2解决办法3
2.1静态编译 (3)
2.2从工具链里面拷贝需要的动态链接库 (3)
2.3单独的动态链接库 (3)
3编译busybox4
1
1察看elf文件依赖的动态链库
利用ldd和readelf都能察看elf文件依赖的动态链接库,但ldd不能跨平台使用,因此我们这里介绍的是用readelf察看用户程序依赖的动态链接库的办法。
可以看到程序依赖libgcc_s.so.1和libc.so.6两个动态链接库。
可以看出还依赖/lib64/ld.so.1。
可以看到依赖的函数glibc至少什么版本。
2解决办法
解决不到动态链接看的办法有静态编译或拷贝对应动态链接库。
2.1静态编译
gcc加-static参数
2.2从工具链里面拷贝需要的动态链接库
附件中的ldd-pack1利用readelf得到程序需要的动态链接库,然后到用户提供的指定的几个目录里面搜索动态链接库和动态链接库又依赖的动态链接库,最后将这些动态链接库打包到/tmp/ 1.tar里面。这样只需要到ramdisk目录里面解压/tmp/1.tar则需要的动态链接库就安装好了。
ldd-pack1用法如下:
其中elffile就是需要查依赖动态链接库的程序,是指定的搜索目录。
如果要到工具链目录里面搜索,如/opt/gcc-4.3-ls232/中,写法如下
cd/opt/gcc-4.3-ls232/sysroot/的目的是打包出的1.tar的目录是lib和usr/lib,正好可以直接解压到ramdisk里面。
2.3单独的动态链接库
如果只有某个程序少动态链接库,且库的版本和系统的有冲突,如libc的版本不同等。这个时候直接覆盖系统库代价太大。比较合适的办法是给这个程序单独提供一套动态链接库,然后指定应用程序使用单独提供的这套动态链接库。上节里面的ldd-pack1程序在打包的时候会产一个runme 文件,如elffile是/bin/bash的时候,runme内容如下:
上面脚本的目的就是当动态库不是系统目录的时候,通过这个脚本来调用elf文件使用单独提供的动态链接库。也就是说/tmp/1.tar不要在ramdisk目录根解压,而是建立一个子目录解压
3编译busyboxbusybox安装
龙芯给客户提供的ramdisk文件本身是由busybox编译出来的,如果里面的动态库版本不匹配,客户可以自己编译,方法如下:
1.下载busybox
2.配置busybox
3.编译安usbox

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。