linux - 如何在Linux(Fedora)上调试ELF加载过程?

标签 linux debugging linker executable elf

有哪些有效的方法可以调试 Linux 系统上加载 ELF 二进制文件的实际过程?我使用的是 Fedora 36,并创建了一个 ELF 文件。但是,当我尝试通过输入 ./myElfFile 从 bash 运行 ELF 文件时,收到类似 cannotexecute binary file: Exec format error 的错误。我试图确定的是哪个特定的执行格式错误,并且我想使用调试器或其他动态跟踪来执行此操作。我曾经不得不在 Windows 上执行此操作,最终在内核 Debug模式下使用 WinDbg,以及称为 GFlags 的东西,然后我打开“加载器快照”,这使我能够观看整个可移植可执行文件加载过程。最终,我在 NtCreateSection 及其被调用者内部找到了检查。在 Linux/ELF 世界中我该如何做这样的事情呢?我想找出加载过程的哪一步失败了,以及哪个检查失败了。

最佳答案

What I am trying to determine is WHICH specific exec format error, and I'd like to do this using a debugger or some other dynamic tracing.

问题(无效的 ELF 文件)很可能是由内核检测到的。因此,您的程序永远不会启动,并且调试器或任何其他用户空间工具都不会提供帮助。

您可以尝试以下几种方法:

  • 如果 myElfFile 作为有效文件启动并被修改/修补,请检查工作副本和非工作副本上 readelf -l ... 的输出之间的差异,看看是否可以发现违反某些必需的不变量的情况(例如 .p_offset % pagesize == .p_vaddr % pagesize 吗?)。
  • 使用 readelf -a myElfFile 并查看 readelf 是否打印任何警告。如果确实如此,您可以调试 readelf 来找出它提示的是什么——它可能是也可能不是导致内核拒绝您的二进制文件的同一件事。
  • 使用 readelf -l myElfFile 的输出更新您的问题,并希望其他人指出其中的问题。
  • 使用user-mode Linux在尝试执行文件时调试内核

关于linux - 如何在Linux(Fedora)上调试ELF加载过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74393813/

相关文章:

c++ - 在 make 文件中链接 g++ 和 lib 不起作用

python - Linux 上 Python 的灵活 IPC 解决方案?

c++ - Linux 共享库链接错误( undefined symbol )

Java 移位奇怪

debugging - 使用 PHPStorm 8 进行 Xdebug — 在不存在的断点处打开错误的文件

java - Hibernate.initialize(...) 的问题我得到了 LazyInitializationException 但当我调试时一切都很好

linux - 我不明白 break 命令

linux - 如何在 VCD 文件中指定注释?

c++ - 链接到静态库时的多个函数调用

c - 使用非标准名称链接 C 库