加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

-/bin/sh:  not found 的问题解决

(2013-01-23 17:02:06)
分类: config_debug

执行某一条可执行命令x,结果出现-/bin/sh: x not found提示,一般表示其缺少足够的共享库来运行这条命令。解决方法有两条:

 

1、编译这条命令时添加使用-static选项,这条选项会将所需要的库都一起静态编译到这条命令中,这样的好处在于无论在任何环境下,只要架构相同就都可以运行这条命令,缺点则有3:

(1)由于包含库,文件也就会变得比较大,最关键是很多不需要的东西也被编入其中

(2)没有办法合理使用共享库,共享库的作用就是让各命令都能使用,同时如果库升级只需要更新相应的库连接就可以,对于大型应用来说显然这样的方式更优,这也是最主要的缺点

(3)对于一些买来的加密的库,是无法用静态编入程序的

 

2、既然提到上述缺点,那么好的解决方法就是添加相应的库了

可以使用readelf命令:readelf -d x | grep NEED,

例如:unicore32-linux-readelf -d hx170dec_versatile | grep NEED
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x6ffffffe (VERNEED)                    0x200115c
 0x6fffffff (VERNEEDNUM)

显示出需要的库为libpthread.so.0,libc.so.6,将这两个库拷贝入/lib下即可

同样需要注意两点:

(1)依赖库所需要的库是不会显示出来的,在运行时还会提示缺少某库,需要再次加入,这也是该方法唯一的缺点

(2)拷贝共享库时一般会有一个软连接,然后连接指向实际库,例如libc.so是一个软连接,实际指向libc.so.6,这样便于库的更新,更改软连接即可。拷贝时注意直接使用cp会把链接的实际内容拷贝过来,需要加上-l选项。

 

事实上直接用vim打开文件,搜索.so一样可以找到需要的库,不过其他很多乱码,稍显不专业罢了

 

.so的意思就是shared object,现在的计算机科学重在分享,所以用好共享库吧~~

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有