readelf和ldd分析elf文件

很多时候,我们利用交叉编译好的应用放在自己移植的文件系统上不能运行的状况,通常出现类似这样的错误:

-/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 可以查看该应用程序所使用到的共享库信息。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值