很多时候,我们利用交叉编译好的应用放在自己移植的文件系统上不能运行的状况,通常出现类似这样的错误:
-/bin/sh: xxx not found. 或者 xxx: error while loadding shared libraries: libc.so: cannot open.........no such file or dictory
这就是缺少了一些共享库或者动态链接库所导致,关于静态库、共享库、动态链接库的讲解请参照本上一篇文章的讲解。
一个程序要想在内存中运行,除了编译之外,还要经过连接和装入两个步骤。当然linux中动态链接也要经过这几个过程。Linux中使用这个ld-linux.so*(每个开发者的平台可能有所差异)来装载其他库,所以这个库必须放在linux的/lib目录下,对于其他,通常我们的共享库放在/lib这个路径下,而且也是系统默认的搜索路径。
Linux共享库的搜索路径先后顺序:
1、编译目标代码时指定的动态库搜索路径:在编译的时候指定-Wl,-rpath=路径
2、环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3、配置文件/etc/ld.so.conf中指定的动态库搜索路径
4、默认的动态库搜索路径/lib
5、默认的动态库搜索路径 /usr/lib
但是如何得知该应用所缺少的相关共享库信息呢??
我们知道linux中,gcc编译器编译出的object文件、可执行文件使用的是一种叫做ELF格式来表。这是一种特殊的二进制格式。ELF=Executable and Linkable Format,可执行连接格式,是unix实验室作为应用程序二进制接口而开发和发布的。elf文件由三个部分组成:elf header、program headers|section headers、sections|program segments。 linux中的readelf -a xxx 命令可以查看该elf文件的详细信息。file xxx 命令可以查看该文件的运行平台(arm 或者 intel 80386)
# readelf -d xxx|grep NEEDED 或者# ldd xxx 可以查看该应用程序所使用到的共享库信息。