有哪些有效的方法可以调试 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/