我有一个ELF文件,我想从中获取我的代码的hex
或bin
文件。在终端中,如果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
那么有办法吗?
非常感谢
答案 0 :(得分:1)
用于创建 "raw binary files"
节目objcopy
可以使用,如here:
objcopy -O binary foo.elf foo.bin
程序 objcopy
是 MacPorts 的一部分
包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
程序 objcopy
是 binutils
的一部分。
对于 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
等工具相比,
objdump
和 nm
。
从这个意义上说,即使某些信息可以使用其他工具获得
比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:
> port provides /opt/local/bin/otool
/opt/local/bin/otool is provided by: cctools
在 this answer 中讨论。
还有 useful 用于找出每个
已安装的上述工具中有 pkgutil
:
pkgutil --file-info /usr/bin/objdump
这有助于确认二进制文件是 macOS 本身的一部分,而不是 通过其他方式安装。
当我想用 详情如下:
> 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
。
还有DWARF和dwarftool
,
以及 dwarfdump
(XCode 的一部分)。
binutils
可以在 Linux 上分析 Mach-O:https://stackoverflow.com/a/8714142/1959808darling
可以在 Linux 上运行
macOS 软件 (Mach-O, dyld
),类似于 wine