【问题标题】:bash: ./<filename> No such file or directorybash: ./<文件名> 没有那个文件或目录
【发布时间】:2023-01-18 03:45:37
【问题描述】:

我正在尝试运行二进制文件。但是当我尝试运行该文件时,我遇到了以下错误。

`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 

我的系统详细信息:

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帮助我正确运行文件

【问题讨论】:

    标签: linker binaryfiles interpreter glibc loader


    【解决方案1】:

    我面临以下错误

    问题是您的二进制文件以一种非常奇怪的方式链接。

    特别是,它的解释器设置为../.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
    

    【讨论】:

    • ../.glibc/glibc_2.28_no-tcache/ld.so.2 我不知道这个目录是什么。我有 glibc 和所有必需的文件。但是我应该把它放在哪里 ../.glibc/glibc_2.28_no-tcache/ld.so.2 的解释是什么
    • @NobinPegasus 您试图通过链接到自定义 GLIBC 来解决什么问题?
    • 我正在尝试运行二进制文件。我实际上正在为此开设一门课程,我需要运行二进制文件。为了运行它,我需要链接解释器。
    • 这是 linux 堆开发课程中给出的文件。力之屋。所以我需要运行二进制文件。
    • @NobinPegasus 我已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2021-05-02
    • 2021-04-22
    • 1970-01-01
    • 2015-11-24
    • 2022-12-07
    • 2022-12-20
    相关资源
    最近更新 更多