在目标板上移植动态库(-/bin/sh: XXX: not found 问题的解决)
来源:互联网 发布:怎样多申请几个淘宝号 编辑:程序博客网 时间:2024/05/28 06:06
转自:http://blog.csdn.net/liukun321/article/details/6915651
动态库的搜索路径先后顺序:
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阿统统建立符号链接。最后加入搜索路径方便使用。
- 在目标板上移植动态库(-/bin/sh: XXX: not found 问题的解决)
- 在目标板上移植动态库(-/bin/sh: XXX: not found 问题的解决)
- 在目标板上移植动态库(-/bin/sh: XXX: not found 问题的解决)(by liukun321咕唧咕唧)
- 交叉编译的app放到目标板上运行提示-/bin/sh: XXX: not found
- 关于在开发板上运行程序显示“-bin/sh:/XXX not found”的解决方法
- -/bin/sh: XXX: not found
- -/bin/sh: XXX: not found
- 解决应用程序执行时出现“-/bin/sh: ./xxx: not found”
- 在mini2440开发板上出现-sh./hello not found错误的解决
- 编译错误: /bin/sh: 1: pushd: not found的问题
- 编译错误: /bin/sh: 1: pushd: not found的问题
- 编译错误: /bin/sh: 1: pushd: not found的问题
- /bin/sh: 1: lzop: not found问题
- bin.sh not found
- bin/sh: hello :not found 的解决方法
- -/bin/sh: 命令:not found的解决办法
- -/bin/sh: 命令:not found的解决办法
- arm开发板运行应用程序出现:-/bin/sh:xxx:not found 解决办法
- Coldfire study note12月7日
- c++ 工程基础之STL系列 (三) set
- 短信网关接入程序源代码(SGIP协议)
- Java Spring Tutorial -- 注入Bean
- Codeforces Round #217 (diy.2) B. Berland Bingo
- 在目标板上移植动态库(-/bin/sh: XXX: not found 问题的解决)
- AndroidAnnotations——ClickEvents单击事件
- sqlplus连接报错ora-20
- 永远不要在Linux执行的10个最危险的命令
- 关于数据库中的sysobjects的解释
- ExecuteNonQuery: Connection 属性尚未初始化
- Adroid4.4之PowerManagerService分析
- SharePoint 2010 母版页定制小思路介绍
- Hibernate3.x openSession()与getCurrentSession()得到的连接的区别