检查并从MAC上的ELF文件获取二进制文件

时间:2019-09-13 13:38:44

标签: macos binary elf otool

我有一个ELF文件,我想从中获取我的代码的hexbin文件。在终端中,如果a做file main(这是我的文件),则显示main: ELF 32-bit LSB executable, UCB RISC-V, version 1 (SYSV), statically linked, not stripped

据我了解,MAC上的objdump无法正常工作,使用otool -l main时出现此错误llvm-objdump: 'main': Object is not a Mach-O file type.

使用以下命令创建了ELF文件:riscv-none-gcc/8.2.0-2.1-20190425-1021/bin/riscv-none-embed-gcc --specs=nosys.specs main.c -o main

那么有办法吗?

非常感谢

1 个答案:

答案 0 :(得分:1)

用于创建 "raw binary files" 节目objcopy 可以使用,如here

objcopy -O binary foo.elf foo.bin

程序 objcopyMacPorts 的一部分 包x86_64-elf-binutils, 并且可以如下使用:

/opt/local/bin/x86_64-elf-objcopy -O binary foo.elf foo.bin

其中 foo.elf 是在 x86_64 上编译(或交叉编译)的 ELF 文件 Linux。 MacPorts 包 x86_64-elf-binutils 可以按如下方式安装:

port install x86_64-elf-binutils

程序 objcopybinutils 的一部分。 对于 Mach-O,它可以通过 package binutils MacPorts,如下:

port install binutils

MacPorts binutils 软件包安装 gobjcopy

macOS 上的 binutils 版本,用于其他目标系统的交叉开发, 也是available 通过 MacPorts。

这篇文章也是由MacOSX: which dynamic libraries linked by binary?发起的, 并且还旨在提供信息。

可执行文件可以是:

ldd

ldd 是 Linux 中的脚本 包装 ld。它被描述为

<块引用>

打印共享对象依赖

GNU ld 在 macOS 上不可用。更根本的是,ldd 调用 ld 意味着它的操作是非静态的,与 readelf 等工具相比, objdumpnm

从这个意义上说,即使某些信息可以使用其他工具获得 比ldd,结果不等价,因为其他工具没有 尝试加载二进制文件。此外,尝试加载二进制文件需要 在 Linux 上,所以 ldd 是 真正的 Linux 工具,无法被 macOS 上的程序完全模拟。 relevant description。 确实存在一个近似于 ldd without 的纯 Python 实现 以 ld 的方式加载二进制文件:lddcollect。 在 Linux 系统上可以使用 lddcollect,其中所需的库 存在。

不使用 ldd 的一个原因是安全性:检查可执行文件而不使用 执行它们。

ldd is 的缩写 “列出动态依赖项”。

ldd 似乎是一个 bash 脚本,它是 glibc 的一部分,源代码位于: https://sourceware.org/git/?p=glibc.git;a=blob;f=elf/ldd.bash.in;h=ba736464ac5e4a9390b1b6a39595035238250232;hb=271ec55d0ae795f03d92e3aa61bff69a31a19e3a

objdump

objdump 显示有关 目标文件,并且可以反汇编它们。它是 binutils 的一部分。

在 macOS 上称为 objdump 的程序:

  • /opt/local/bin/gobjdump 来自 MacPorts 包 binutils
  • /usr/bin/objdump 由 macOS(包 com.apple.pkg.Essentials 的一部分)提供, 这被描述为 <块引用>

    llvm 目标文件转储器

ldd 的手册建议调用 objdump 作为替代方法,如下所示:

objdump -p /path/to/program | grep NEEDED

相关:https://superuser.com/questions/206547/how-can-i-install-objdump-on-mac-os-x

readelf

readelf 显示有关 通过读取 ELF 文件(静态,不加载它们)。它是 binutils 的一部分。 它不会反汇编文件,就像 objdump 可以。

macOS 上可用的变体:

  • /opt/local/bin/greadelf 来自 MacPorts 包 binutils
  • /opt/local/bin/elftc-readelf 来自 MacPorts 包 elftoolchain

示例用法:

readelf -s elf_file

nm

  • /usr/bin/nm 由 macOS 提供(com.apple.pkg.Essentials 包的一部分)
  • /opt/local/bin/nm 由 MacPorts 包 cctools, 这是一个符号链接:/opt/local/bin/nm -> llvm-nm-mp-10
  • /opt/local/bin/nm-classic 来自 MacPorts 包 cctools
  • /opt/local/bin/elftc-nm 来自 MacPorts 包 elftoolchain
  • /opt/local/bin/gnm 来自 MacPorts 包 binutils

显然,/usr/bin/nm/opt/local/bin/nm 都是

<块引用>

llvm 符号表转储程序 并使用 ELF 文件。

otool(和变体)

otool 是 MacOS 的 Mach-O 格式的反汇编程序。

macOS 上可用的 otool 变体:

  • /usr/bin/otool 由 macOS 提供(com.apple.pkg.Essentials 包的一部分)
  • /opt/local/bin/otool 由 MacPorts 包 cctools, 它通过 MacPorts 包 /opt/local/bin/llvm-otool 链接到 cctools, 它被描述为: <块引用>

    用于 llvm-objdump 的 otool 兼容命令行解析器

  • /opt/local/bin/otool-classic 来自 MacPorts 包 cctools

更多详情:

> which -a otool
/opt/local/bin/otool
/usr/bin/otool
> ls -lsa /opt/local/bin/otool
... /opt/local/bin/otool -> llvm-otool
> port provides /opt/local/bin/otool
/opt/local/bin/otool is provided by: cctools
> which -a llvm-otool
/opt/local/bin/llvm-otool
> port provides /opt/local/bin/llvm-otool
/opt/local/bin/llvm-otool is provided by: cctools
> ls -lsa /usr/bin/otool
... /usr/bin/otool
> pkgutil --file-info /usr/bin/otool
volume: /
path: /usr/bin/otool

pkgid: com.apple.pkg.Essentials
...

MacPorts 包 cctools 也会安装 /opt/local/bin/otool-classic, 正如其文档中所说,它已过时。

elfdump

elfdump 可通过 MacPorts 包 elftoolchain 在 macOS 上使用, 并安装为二进制文件 /opt/local/bin/elftc-elfdump

strings

程序strings可以是 用于检查 ELF 文件中包含的符号。这是一个更 通用工具,并非专为 ELF 文件设计,但仍然可用。

macOS 上 strings 的变体:

  • /usr/bin/strings 由 macOS(com.apple.pkg.Essentials 包的一部分)
  • /opt/local/bin/strings 来自 MacPorts 包 cctools
  • /opt/local/bin/elftc-strings 来自 MacPorts 包 elftoolchain
  • /opt/local/bin/gstrings 来自 MacPorts 包 binutils

示例用法(管道到 ag):

strings some_elf_file | ag GLIBC

elftc-strings 似乎比 其他 strings 实现(彼此不同,但似乎 打印类似的结果)。

elftoolchain

可通过 MacPorts 获得,elftoolchain 是 BSD 许可的工具库,类似于 binutils 中的工具。工具从那 与分析 ELF 文件相关的集合:

  • /opt/local/bin/elftc-elfdump
  • /opt/local/bin/elftc-nm
  • /opt/local/bin/elftc-readelf
  • /opt/local/bin/elftc-strings

还有 plans 用于 实施objdump

确认二进制文件来自 MacPorts

要查明给定文件是否属于 MacPorts:

> port provides /opt/local/bin/otool
/opt/local/bin/otool is provided by: cctools

this answer 中讨论。

确认二进制文件来自 macOS

还有 useful 用于找出每个 已安装的上述工具中有 pkgutil:

pkgutil --file-info /usr/bin/objdump

这有助于确认二进制文件是 macOS 本身的一部分,而不是 通过其他方式安装。

确认可执行文件是 ELF

当我想用 详情如下:

> file filename
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=..., for GNU/Linux 3.2.0, not stripped

至于其他工具,file 在 macOS 上有多个选项:

  • /usr/bin/file 由 macOS 提供(com.apple.pkg.Essentials 包的一部分)
  • /opt/local/bin/file 来自 MacPorts 包 file

其他工具

显然,在某些操作系统上也有 elftools 可用。

为了分析特定架构的文件,有 MacPorts 包 喜欢arm-elf-binutils

矮人

还有DWARFdwarftool, 以及 dwarfdump(XCode 的一部分)。

杂项