linux执行文件 no such,Linux运行可执行程序提示:No such file or directory | 码农部落...

这种情况可能有以下2种情况(可能不全,欢迎补充):

1、程序位数和系统位数不匹配。比如程序是32位系统为64位。

2、程序找不到对应的加载器。

这种情况可以按以下情况检查处理:

1) 查看当前程序的解释器:

我们可以先比较下静态编译的程序和动态编译的程序的区别:

以下是静态编译的程序,执行命令:# readelf -l hello-static

Elf file type is EXEC (Executable file)

Entry point 0x8b28

There are 6 program headers, starting at offset 52

Program Headers:

Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align

EXIDX 0x077610 0x0007f610 0x0007f610 0x00768 0x00768 R 0x4

LOAD 0x000000 0x00008000 0x00008000 0x77d7c 0x77d7c R E 0x8000

LOAD 0x077d7c 0x00087d7c 0x00087d7c 0x00c58 0x020dc RW 0x8000

NOTE 0x0000f4 0x000080f4 0x000080f4 0x00020 0x00020 R 0x4

TLS 0x077d7c 0x00087d7c 0x00087d7c 0x00010 0x00028 R 0x4

GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4

Section to Segment mapping:

Segment Sections...

00 .ARM.exidx

01 .note.ABI-tag .init .text __libc_freeres_fn __libc_thread_freeres_fn .fini .rodata __libc_subfreeres __libc_atexit __libc_thread_subfreeres .ARM.extab .ARM.exidx .eh_frame

02 .tdata .init_array .fini_array .jcr .data.rel.ro .got .data .bss __libc_freeres_ptrs

03 .note.ABI-tag

04 .tdata .tbss

05

以下是动态链接的程序,执行命令:readelf -l hello-dynamic:

Elf file type is EXEC (Executable file)

Entry point 0x82c4

There are 8 program headers, starting at offset 52

Program Headers:

Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align

EXIDX 0x00049c 0x0000849c 0x0000849c 0x00008 0x00008 R 0x4

PHDR 0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4

INTERP 0x000134 0x00008134 0x00008134 0x00013 0x00013 R 0x1

[Requesting program interpreter: /lib/ld-linux.so.3]

LOAD 0x000000 0x00008000 0x00008000 0x004a8 0x004a8 R E 0x8000

LOAD 0x0004a8 0x000104a8 0x000104a8 0x0011c 0x00120 RW 0x8000

DYNAMIC 0x0004b4 0x000104b4 0x000104b4 0x000e8 0x000e8 RW 0x4

NOTE 0x000148 0x00008148 0x00008148 0x00020 0x00020 R 0x4

GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4

Section to Segment mapping:

Segment Sections...

00 .ARM.exidx

01

02 .interp

03 .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .ARM.exidx .eh_frame

04 .init_array .fini_array .jcr .dynamic .got .data .bss

05 .dynamic

06 .note.ABI-tag

07

看出两者的区别了么! 动态编译的程序有INTERP段,它指明了程序在加载过程中需要使用的动态链接加载器,如果指定的这个加载器未找到,那么就会提示“ No such file or directory”,如果,找到动态链接加载器,但未找到需要的库,那会有另外的提示。

你需要检查你的机器里面有没有这个解释器,如果没有则会提示“ No such file or directory”。没有的话则补上即可。

实例:我遇到的情况

Elf file type is EXEC (Executable file)

Entry point 0x4166d0

There are 8 program headers, starting at offset 64

Program Headers:

Type Offset VirtAddr PhysAddr

FileSiz MemSiz Flags Align

PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040

0x00000000000001c0 0x00000000000001c0 R E 0x8

INTERP 0x0000000000000200 0x0000000000400200 0x0000000000400200

0x000000000000000f 0x000000000000000f R 0x1

[Requesting program interpreter: /lib/ld64.so.1]

LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000

0x00000000009be2bc 0x00000000009be2bc R E 0x200000

LOAD 0x00000000009befa8 0x0000000000fbefa8 0x0000000000fbefa8

0x0000000000205428 0x00000000002b3850 RW 0x200000

DYNAMIC 0x0000000000baec50 0x00000000011aec50 0x00000000011aec50

0x0000000000000230 0x0000000000000230 RW 0x8

NOTE 0x0000000000000210 0x0000000000400210 0x0000000000400210

0x0000000000000044 0x0000000000000044 R 0x4

GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000

0x0000000000000000 0x0000000000000000 RWE 0x10

GNU_RELRO 0x00000000009befa8 0x0000000000fbefa8 0x0000000000fbefa8

0x00000000001f0058 0x00000000001f0058 R 0x1

Section to Segment mapping:

Segment Sections...

00

01 .interp

02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame

03 .init_array .fini_array .jcr .data.rel.ro .dynamic .got .got.plt .data .bss

04 .dynamic

05 .note.ABI-tag .note.gnu.build-id

06

07 .init_array .fini_array .jcr .data.rel.ro .dynamic .got

需要的解释器是:[Requesting program interpreter: /lib/ld64.so.1]

但是在/lib目录下没有该解释器,查看程序该动态库的链接目录:

执行命令 ldd mipcm

libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fd6fa385000)

/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007fd6fe000000)

librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fd6fa17d000)

可以看到第二个就是该解释器的相关路径,去/lib64/ld-linux-x86-64.so.2查看,该动态库存在。

链接/lib64/ld-linux-x86-64.so.2到/lib/ld64.so.1

ln -s /lib64/ld-linux-x86-64.so.2 /lib/ld64.so.1

执行程序,正常运行!

另外如果可以静态编译的话也可以解决这个问题!

参考文章:

https://bbs.csdn.net/topics/390349057?page=1

https://blog.csdn.net/dragon101788/article/details/17507961

https://blog.csdn.net/u013345056/article/details/68946304

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值