嵌入式开发中的helloworld之动态链接库遇到的问题

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

找到:

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

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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值