arm-none-linux-gnueabi-readelf看库依赖

来源:互联网 发布:安卓软件监控 编辑:程序博客网 时间:2024/06/06 01:31


1、问题描述:

运行一个程序,会出现-/bin/sh: xxx :not fount

打开/sbin下会发现这个xxx可执行文件是存在的,这可能是文件系统中(/lib)中缺少某些库导致的。

 

2、解决方法-以hello.c示例

以hello.c为例,编译出了hello可执行文件,放到了/sbin中,并且在/etc/init.c/rcS中添加:

/sbin/hello &

运行时出现了:

-/bin/sh: hello: notfound

 

解决方法:

一、在PC上,查看hello所依赖的库:

#arm-linux-readelf –ahello  【用arm-linux-readelf -a 文件名     也可以的】

找到:

Program Headers:

  Type           Offset   VirtAddr  PhysAddr   FileSiz MemSiz  Flg Align

  PHDR           0x000034 0x00008034 0x000080340x000c0 0x000c0 R E 0x4

  INTERP         0x0000f4 0x000080f4 0x000080f4 0x000130x00013 R   0x1

      [Requesting programinterpreter: /lib/ld-linux.so.2]

  LOAD           0x000000 0x00008000 0x000080000x005d8 0x005d8 R E 0x8000

  LOAD           0x0005d8 0x000105d8 0x000105d80x0011c 0x00120 RW  0x8000

  DYNAMIC        0x0005e8 0x000105e8 0x000105e8 0x000c80x000c8 RW  0x4

  NOTE           0x000108 0x00008108 0x000081080x00020 0x00020 R   0x4

说明hello依赖与ld-linux.so.2

 

二、拷贝库到文件系统Lib目录,创建链接文件

在编译器的lib目录中找到ld-linux.so.2:

root@xiangpingli: # pwd

/opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/arm-linux/lib

root@xiangpingli: # ls  ld-linux.so.2

ld-linux.so.2

root@xiangpingli: # ls -l  ld-linux.so.2【用cp -d来保存复制之后的属性】

lrwxrwxrwx 1 500 500 11 2009-04-08 17:41ld-linux.so.2 -> ld-2.3.6.so

可以看出这是个连接文件,是指向ld-2.3.6.so的连接

 

我的做法:

将ld-linux.so.2和ld-2.3.6.so都拷贝到了我的文件系统目录的/lib下,然后再做连接:

ln-s ld-2.3.6.so ld-linux.so.2

来建立ld-linux.so.2的符号连接。

 

提示ld-linux-so.2文件已经存在

所以,应先删除ld-linux.so.2,或者说仅拷贝ld-2.3.6.so,然后建立连接:

ln-s ld-2.3.6.so ld-linux.so.2

建立ld-linux-so.2就可以了 

 

三、拷贝依赖的其他动态库

运行时还会出现如下错误:

/sbin/hello:error while loading shared libraries: libc.so.6: cannot open shared objectfile: No such file or directory

解决方法:从同一目录下拷贝过去就可以了。

 

这是再运行hello,就会成功了:

================================

hello world

================================

0 0
原创粉丝点击