动态库的搜索路径先后顺序:
1、编译目标代码时指定的动态库搜索路径:在编译的时候,可以指定-Wl,-rpath=你的路径
2、环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3、配置文件/etc/ld.so.conf中指定的动态库搜索路径(我移植的根文件系统,ld.so.conf在/etc目录下的,而且指定搜索路径位/lib)
4、默认的动态库搜索路径/lib
5、默认的动态库搜索路径 /usr/lib
明白这些了,若我们运行的应用程序找不到库那么可以有很多种解决途径~!
1、编译的时候加上-Wl,-rpath=。。。。
2、使用export LD_LIBRARY_PATH=....
3、将路径追加到/etc/ld.so.conf中
4、将so拷贝到/lib目录下
5、将so拷贝到/usr/lib目录下
我们知道动态库的搜索顺序后,下面就需要获得适合自己目标板cpu体系的库,或获得库源码用交叉工具链编译自己的库
这里我从crosstools 4.3.2 中获得库 然后cp到开发板根文件系统的/lib 目录下
在交叉工具链下 /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib 目录下
用 readelf -A 命令 看 某库文件体系结构信息如下
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "4T"
Tag_CPU_arch: v4T
Tag_ARM_ISA_use: Yes
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
上述体系符正是s3c2440的架构,故我们应当把这个库文件cp到/lib 下
而在工具链下存放有三个库
usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/ (armv4)
usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib/ (armv5)
usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/thumb2/lib (armv5)
上面库所属的cpu体系,可以通过readelf -A 命令 查看该目录下的任意一个库文件 例如:readelf -A libc.so.6
用readelf -d 命令可以查看,可执行文件所依赖的动态库,如果某个文件依赖libc.so.6 我们也许不能仅仅把其链接和库文件cp到/lib下
readelf -d libc.so.6 来看
Dynamic section at offset 0x11ff18 contains 25 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [ld-linux.so.3]
0x0000000e (SONAME) Library soname: [libc.so.6]
0x0000000c (INIT) 0x14e18
0x0000001a (FINI_ARRAY) 0x1266f4
0x0000001c (FINI_ARRAYSZ) 4 (bytes)
0x00000004 (HASH) 0x11ad30
0x6ffffef5 (GNU_HASH) 0x194
0x00000005 (STRTAB) 0xbd6c
0x00000006 (SYMTAB) 0x3a1c
0x0000000a (STRSZ) 21853 (bytes)
还依赖ld-linux.so.3 库。因此我们要把库文件及其所依赖的库文件统统cp到/lib下才可以。cp完成后可以运行一下动态编译的application 是不是不再报错了!
查资料可以发现在/etc/ld.so.conf 文件可以设置动态库的路径。
按下述步骤更新配置后应用程序就按此路径搜索库:
1。rm -f /etc/ld.so.cache
2。vim /etc/ld.so.config,在其中加入你新的libs的目录 (在其加入动态库的路径)
3。用“ldconfig -f etc/ld.so.conf -C etc/ld.so.cache"生成一个新的ld.so.cache
但是我用上述方法生成ld.so.cache 后会提示 -/bin/sh: XXX: not found
无法找到动态库。具体原因现在还没有找到。
另外交叉链 arm-none-linux-gnueabi-gcc 默认编译armV5体系
arm-none-linux-gnueabi-gcc -march=armv4t -o hello -static hello.c 加上-march=armv4t 才可在2440上运行,否则提示Illegal instruction。
为了方便以后编译程序模块,要想个法子才行,友善的做法很好,就是建立带参数的脚本代替gcc,脚本是另外一个名字,叫arm-linux-gcc!脚本内容如下
#!/bin/bash
exec arm-none-linux-gnueabi-gcc -march=armv4t $*
g++也类似。其他工具ar阿ld阿统统建立符号链接。最后加入搜索路径方便使用。