Chinaunix首页 | 论坛 | 博客
  • 博客访问: 769654
  • 博文数量: 247
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 501
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-12 21:53
个人简介

系统未建立

文章分类

全部博文(247)

文章存档

2021年(1)

2020年(3)

2019年(5)

2018年(3)

2017年(44)

2016年(75)

2015年(52)

2014年(63)

2013年(1)

我的朋友

分类: LINUX

2017-01-18 19:34:46

转载于:http://hi.baidu.com/li_dayao/blog/item/ad6cddcb9d25641bbf09e66b.html 

 在arm-linux环境下运行可执行程序mocp,在加载动态库libdecoder.so时,却总是报错:File not found。在代码中添加很多printf,找到是在dlopen时报错。最初以为,是函数dlopen找不到lib_decoder.so文件。那么就认为有以下几种可能:

1,动态库给的搜索路径不对;

2,编译生成动态库的编译工具和程序的运行环境不同;

3,交叉编译环境不能识别dlopen(当然这个可能性是瞎猜的)。


  于是写了个测试程序并交叉编译,自己创建一个动态库libabc.so,并用dlopen加载它。

1,更改动态库的存放路径,结果是在任何路径下都可以找到;

2,用这个正确的测试程序加载libdecoder.so,结果是不管什么路径,就是找不到;

3,在mocp运行时加载libabd.so,能找到;

结论:只要给了dlopen函数一个路径,它就能到这个路径下去寻找指定的库;都是用arm-linux-uclibc-编译的,编译环境相同。那么就是libdecoder.so这个库本身的问题。


  于是将命令从Makefile中抽出来,在shell中单独运行命令生成这个库,结果还是找不到。然后把命令简化,去掉各种选项,比如链接选项,仅仅用

arm-linux-uclibc-gcc -fpic -shared snow.c rain.c -o libdecoder.so

生成库后,测试发现能找到了。添加一个链接选项-ldl,又找不到了。


  这才想到,libdecoder.so还要加载一个动态库libdl.sofile not found是不是指的是这个库找不到啊?查找运行环境下的/lib发现,果然没有libdl.so文件。把这个库拷进来,mocpdlopen的时候就通过了。Done


  其实,如果我在运行程序之前就检查好这个程序究竟需要那些动态库,也就不至于花了这么大力气查找这个问题。


  用objdump命令()就可以查看目标文件包含的信息,其中就有程序需要链接的动态库。


ldd    *.so

readelf    -d    *.so

nm *.so | grep NEEDED

objdump -x libxxxxx.so | grep NEEDED

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