如何 "map" 一个二进制文件到一个架构 + libc 版本?

How to "map" a binary to a an architecture + libc version?

我想知道 Linux 中是否有简单的方法,或者是否有一个现有的开源项目可以让我为它提供二进制或固件映像,并且 return使用的架构(aarch64、armv7-eabihf、armv7m 等)和 libc 类型(glibc、musl、uclibc)?

我希望能够编写一种方法,根据要模拟的单个二进制文件(理想)或完整固件自动获取正确的 qemu-system-* 映像(例如 https://azeria-labs.com/emulate-raspberry-pi-with-qemu/) for device emulation as well as the correct cross-compile toolchain (https://toolchains.bootlin.com/)图像(不太理想)。

目前的理解——完整的架构可能能够根据 file 命令的输出“映射”到 toolchains.bootlin.com 和 qemu-system-* 架构,也许吧?另外,我知道 SO 上有很多答案显示了这个问题的类似答案,但假设您有某种系统访问权限并且可以 运行 命令,如“ldd”。我正在寻找一种完全基于对二进制文件或未知设备的固件映像进行静态分析的解决方案。

对于独立的二进制文件,您可以 运行 实用程序,例如 objdump 和一些 header 成员的 grep。对于体系结构,它应该是 ELF header 的 e_machine 成员。 我不知道如何从二进制文件中获取 libc 类型,但建议对一些使用所有 libc 类型构建它的小程序进行测试,然后进行分析 所有内置二进制文件的 header 的差异。

固件映像的任务变得复杂,因为可能有整个文件系统。我建议使用像这样的项目 https://github.com/cruise-automation/fwanalyzer 分析它们。