Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1685530
  • 博文数量: 511
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 2560
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-06 14:19
文章分类

全部博文(511)

文章存档

2016年(11)

2015年(61)

2014年(257)

2013年(63)

2012年(119)

分类: Android平台

2015-07-17 17:05:52

在目标板上移植动态库(-/bin/sh: XXX: not found 问题的解决)

动态库的搜索路径先后顺序:

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++
也类似。其他工具arld阿统统建立符号链接。最后加入搜索路径方便使用。


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