bash: ./<filename> 没有这样的文件或目录



我正在尝试运行二进制文件。但是,当我试图运行文件时,我面临以下错误:

`pegasus@pegasus:~/Documents/Courses/heaplab-main/house_of_force$ ./house_of_force 
bash: ./house_of_force: No such file or directory`
`pegasus@pegasus:~/Documents/Courses/heaplab-main/house_of_force$ ldd ./house_of_force 
linux-vdso.so.1 (0x00007fff7c6da000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f879bd000)
../.glibc/glibc_2.28_no-tcache/ld.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f3f87bf9000)
`

pegasus@pegasus:~/Documents/Courses/heaplab-main/house_of_force$ file ./house_of_force 
./house_of_force: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter ../.glibc/glibc_2.28_no-tcache/ld.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=278a2aec8b352ea120c49321ed3254eb15ca8ef5, with debug_info, not stripped`
pegasus@pegasus:~/Documents/Courses/heaplab-main/house_of_force$ readelf -l house_of_force 
Elf file type is EXEC (Executable file)
Entry point 0x400730
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      0x8
INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
0x0000000000000027 0x0000000000000027  R      0x1
[Requesting program interpreter: ../.glibc/glibc_2.28_no-tcache/ld.so.2]
LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
0x0000000000000d88 0x0000000000000d88  R E    0x200000
LOAD           0x0000000000001d70 0x0000000000601d70 0x0000000000601d70
0x00000000000002c0 0x00000000000002c8  RW     0x200000
DYNAMIC        0x0000000000001d80 0x0000000000601d80 0x0000000000601d80
0x0000000000000200 0x0000000000000200  RW     0x8
NOTE           0x0000000000000260 0x0000000000400260 0x0000000000400260
0x0000000000000044 0x0000000000000044  R      0x4
GNU_EH_FRAME   0x0000000000000c04 0x0000000000400c04 0x0000000000400c04
0x000000000000004c 0x000000000000004c  R      0x4
GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000  RW     0x10
GNU_RELRO      0x0000000000001d70 0x0000000000601d70 0x0000000000601d70
0x0000000000000290 0x0000000000000290  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_hdr .eh_frame 
03     .init_array .fini_array .dynamic .got .data .bss 
04     .dynamic 
05     .note.ABI-tag .note.gnu.build-id 
06     .eh_frame_hdr 
07     
08     .init_array .fini_array .dynamic .got 

My System Details:

pegasus@pegasus:~/Documents/Courses/heaplab-main/house_of_force$ uname -a
Linux pegasus 5.15.0-58-generic #64-Ubuntu SMP Thu Jan 5 11:43:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
pegasus@pegasus:~/Documents/Courses/heaplab-main/house_of_force$ lsb_release -a
LSB Version:    core-11.1.0ubuntu4-noarch:printing-11.1.0ubuntu4-noarch:security-11.1.0ubuntu4-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:    22.04
Codename:   jammy

我已经做了chmod a+x house_of_force我怀疑是某个共享对象或解释器坏了。我无法正确地链接它们。

帮助我使用./house_of_force正确运行文件

我面临以下错误

问题是你的二进制文件链接的方式很奇怪。

特别地,它的解释器被设置为../.glibc/glibc_2.28_no-tcache/ld.so.2,并且当从../.glibc/glibc_2.28_no-tcache/ld.so.2存在的目录中调用该二进制文件时,将只运行

使用ENOENT从任何其他目录调用该二进制文件将失败。

这不太可能是你想要这个二进制文件做的。你需要修复你的链接行——通常解释器被设置为ld.so的绝对路径。

注:您可能想要链接到这个自定义GLIBC构建以解决某些问题。但是,无论问题是什么,与自定义GLIBC链接都不太可能是正确的解决方案。参见http://xyproblem.info。

更新:

是linux堆开发课程中给出的文件。

你应该在你的问题中解释这一点。

就像答案所说的,这个二进制文件将只在../.glibc存在的目录中运行。如果您有.glibc/目录(包含glibc_2.28_no-tcache/ld.so.2),那么这样做:

cd .glibc
mkdir foo
mv /path/to/house_of_force foo
cd foo
./house_of_force

相关内容