必威体育Betway必威体育官网
当前位置:首页 > IT技术

深入理解linux执行文件提示No such file or directory的背后原因

时间:2019-10-03 23:45:51来源:IT技术作者:seo实验室小编阅读:79次「手机版」
 

no such file or directory

1 背景

最近一直在研究在ZC706-ARM开发板的linux系统中弄一套编译系统(不支持apt),刚好发现公司有一套英伟达的ARM开发板且带有ubunut系统(支持apt),此时产生一个想法,英伟达板子上编译的程序能否在ZC706的板子上运行?

2 过程

在英伟达的开发板中 gcc a.c生成a.out,然后拷贝到ZC706中执行出现“No such file or directory”

以前遇到的是以下原因:

  • 文件本身不存在或者文件损坏
  • 无执行权限 (chmod 777 xxx)
  • 系统位数与程序位数不同

但是经过以下过程发现是ZC706缺少xx程序的指定的装载器:

  1.排除文件损坏等问题-->重新生成拷贝验证
  2.排除程序权限问题--> chmod 777 xx && ls -all
  3.通过unanme -a 排除架构问题
  4.通过readelf file 等命令对比正常执行的文件与错误执行文件的差别

 验证过程:

 a.out由英伟达gcc编译生成且zc706出现上面问题 | b.out由x86 ubunut交叉编译生成且可以正常执行

 后来通过Google等发现装载器也会造成该现象  ,从下面可以发现两者的区别主要在于 interpreter

 解决方案

1.统一编译器与库的关系  

2. 建立软链接 ln -s  /lib/ld-linux.so.3 /lib/ld-linux-armhf.so.3 

3. 编译程序时,加入-static选项静态链接程序,即不使用动态库

 

root@tegra-ubuntu:~# readelf -h a.out
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x8315
  Start of program headers:          52 (bytes into file)
  Start of section headers:          4500 (bytes into file)
  Flags:                             0x5000402, has entry point, Version5 EABI, hard-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         9
  Size of section headers:           40 (bytes)
  Number of section headers:         30
  Section header string table index: 27
root@tegra-ubuntu:~# readelf -h b.out
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x86bc
  Start of program headers:          52 (bytes into file)
  Start of section headers:          4136 (bytes into file)
  Flags:                             0x5000202, has entry point, Version5 EABI, soft-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         8
  Size of section headers:           40 (bytes)
  Number of section headers:         31
  Section header string table index: 28
root@tegra-ubuntu:~# readelf -l helloworld | grep interpreter
readelf: ERROR: 'helloworld': No such file
root@tegra-ubuntu:~# readelf -l a.out | grep interpreter
      [requesting program interpreter: /lib/ld-linux-armhf.so.3]
root@tegra-ubuntu:~# readelf -l b.out | grep interpreter
      [Requesting program interpreter: /lib/ld-linux.so.3]

 

3 介绍 ld装载器

Linux 使用这个ld-linux.so*(虚拟机x86的ubuntu 是使用ld-linux.so2)中的来装载(其实这只是一个链接)其他库。所以这个库必须放在  linux中/lib下。对于其他,通常我们共享库放在/lib这个路径下,而且也是系统默认的搜索路径。

Linux共享库的搜索路径先后顺序:

1、编译目标代码时指定的动态库搜索路径:在编译的时候指定-Wl,-rpath=路径

2、环境变量LD_LIBRARY_PATH指定的动态库搜索路径

3、配置文件/etc/ld.so.conf中指定的动态库搜索路径

4、默认的动态库搜索路径/lib

5、默认的动态库搜索路径 /usr/lib

注意:

1.有些开发板会发现/etc没有ld.so.conf,此时运行ldconfig会提示 "ldconfig: Warning: ignoring configuration file that cannot be   opened: /etc/ld.so.conf: No such file or directory"

解决:加入库到环境变量,然后ldconfig -v (/sbin/ldconfig: relative path `–v' used to build cache

2.共享库 cnnot open shared object

测试是否动态连接,如果列出libtest.so,那么应该是连接正常了

这时候找不到libtest.so, 是动态链接库的查找路径出问题,因此加入上面动态库查找位置即可

3 ldconfig命令主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件

4 LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了,要用bash命令)

相关阅读

使用minimap+miniasm对nanopore进行基因组组装

我们用来练手的文章发表在 Nature Communication ,”High contiguity Arabidopsis thaliana genome assembly with a single nanop

JSONObject 与 JSON 互转

使用目的目前数据交互大多以 JSON 字符串为信息传输,主要格式有 {"age":"22","name":"李四"} [{"age":"21","name":"张三"}] 最常

Serverlet 动态web资源详解(包含生命周期等) no 10.

前言:web资源有两种分类:*静态资源HTML ,JavaScript*动态资源Java server pages ,Serverletserverlet介绍 作用: 访问静态资源或者动态

Linux系统查看端口的占用情况

1.netstat  -anp  |grep   端口号 如下,我以3306为例,netstat  -anp  |grep  3306(此处备注下,我是以普通用户操作,故加上了sudo

linux通配符和正则表达式

1、 通配符通配符是shell在做PathnameExpansion时用到的。说白了一般只用于文件名匹配,它是由shell解析的,比如find,ls,cp,mv等。1、1

分享到:

栏目导航

推荐阅读

热门阅读