原因大概有以下几种:
- 文件本身不存在或者文件损坏
- 无执行权限 (chmod 777 xxx)
- 系统位数与程序位数不同
- 解释器不匹配或者找不到
- 针对原因三的解决方法可以参见:https://stackoverflow.com/questions/3949161/no-such-file-or-directory-but-it-exists
uname -a //查看编译平台的编译器位数
root@idriver:~/soft/Workspace# uname -a
Linux idriver 5.4.0-65-generic #73~18.04.1-Ubuntu SMP Tue Jan 19 09:02:24 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
file ./1910_demo //查看可执行文件的位数
root@idriver:~/soft/Workspace/pcie_trans/1910_demo/build# file 1910_demo
1910_demo: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, not stripped
发现位数匹配,不是原因三。
2. 针对原因四
查看elf信息:
readelf -l ./1620_demo
root@mdchost:/home/mdc/pcie_trans/1620_demo/build# readelf -l ./1620_demo
Elf file type is EXEC (Executable file)
Entry point 0x400bb0
There are 9 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001d 0x000000000000001d R 1
[Requesting program interpreter: /lib64/ld-linux-aarch64.so.1]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x00000000000013ac 0x00000000000013ac R E 10000
LOAD 0x0000000000001d50 0x0000000000411d50 0x0000000000411d50
0x0000000000000338 0x0000000001000348 RW 10000
DYNAMIC 0x0000000000001d68 0x0000000000411d68 0x0000000000411d68
0x0000000000000260 0x0000000000000260 RW 8
NOTE 0x0000000000000258 0x0000000000400258 0x0000000000400258
0x0000000000000020 0x0000000000000020 R 4
GNU_EH_FRAME 0x00000000000012ac 0x00000000004012ac 0x00000000004012ac
0x0000000000000034 0x0000000000000034 R 4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 10
GNU_RELRO 0x0000000000001d50 0x0000000000411d50 0x0000000000411d50
0x00000000000002b0 0x00000000000002b0 R 1
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag
06 .eh_frame_hdr
07
08 .init_array .fini_array .dynamic .got
发现解释器为: Requesting program interpreter: /lib64/ld-linux-aarch64.so.1
而平台解释器的路径为:/lib/ld-linux-aarch64.so.1
在运行平台上发现解释器的路径不对,然后修改了平台解释器路劲即可。