我试图用剥离的符号构建一个简单的HelloWorld应用程序。编译成功,但当我试图执行它时,我得到"Killed:9 "消息(我正在运行MacOS)。
编译命令:
rustc main.rs -o main_stripped -C strip=symbols
main.rs file:
fn main() {
println!("Hello, world!");
}
以下是我的环境信息:
生 rust
$ rustup show
Default host: aarch64-apple-darwin
rustup home: /Users/<user>/.rustup
installed toolchains
--------------------
stable-aarch64-apple-darwin (default)
nightly-aarch64-apple-darwin
installed targets for active toolchain
--------------------------------------
aarch64-apple-darwin
wasm32-unknown-unknown
active toolchain
----------------
stable-aarch64-apple-darwin (default)
rustc 1.65.0 (897e37553 2022-11-02)
硬件和操作系统
- 产品型号:MacBook Pro
- 型号标识符:苹果笔记本18、2
- 芯片:苹果M1 Max
- 核心总数:10(8个性能和2个效率)
- 系统版本:macOS文图拉操作系统13.0.1(22A400)
目前为止我所做的...
d跟踪/d桁架
收到以下输出:
sudo dtruss ./main_stripped
dtrace: failed to execute ./main_stripped: Malformed Mach-o file
编译而不剥离
第一个月
我可以运行main
二进制文件
检查两个二进制文件
$ file main_stripped
main_strip: Mach-O executable arm64
$
$ otool -h main_stripped
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedface 16777228 0 0x00 2 10 1440 0x00a00085
$ file main
main: Mach-O 64-bit executable arm64
$
$
$ otool -h main
main:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777228 0 0x00 2 20 1960 0x00a00085
$
注意到一个差异:
| 二进制|锉|魔术|
| - ------| - ------| - ------|
| 主剥离|Mach-O可执行臂64| 0x馈电面|
| 主|Mach-O 64位可执行文件arm64| 0x馈入面f|
根据mach-o/loader.h,magic 0xfeedface指的是32位架构。
因此,由于某种原因,在使用strip=symbols
时,体系结构已更改为32位...
使用另一个命令去除符号
尝试GNU binutils 2.39软件包中的strip
命令
$ strip -v --strip-debug -o main_stripped_2 main
copy from `main' [mach-o-arm64] to `main_stripped_2' [mach-o-arm64]
因此,我收到了main_stripped_2
,它也有不正确的32位体系结构。
$ file main_stripped_2
main_stripped_2: Mach-O executable arm64
$
$ otool -h main_stripped_2
main_stripped_2:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedface 16777228 0 0x00 2 12 1544 0x00a00085
尝试了LLVM版本15.0.5中的llvm-strip
命令
$ llvm-strip -s -o main_stripped_3 main
因此,我收到了具有正确64位体系结构的main_stripped_3
,并且能够运行。但是,我不确定如何使用此信息来解决我的问题。
$ file main_stripped_3
main_stripped_3: Mach-O 64-bit executable arm64
尝试另一个链接器
尝试使用不同的链接器:zld
或mold
rustc main.rs -o main_strip_mold -C strip=debuginfo -C link-arg=-fuse-ld=/opt/homebrew/bin/ld64.mold
我再次收到32位体系结构的二进制文件
$ file main_strip_mold
main_strip_mold: Mach-O executable arm64
$
$ otool -h main_strip_mold
main_strip_mold:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedface 16777228 0 0x00 2 15 2104 0x00a00085
上述步骤在另一台规格低于标准的MacBook上运行良好
- 产品型号:MacBook Pro
- 型号标识符:苹果笔记本18、3
- 芯片:苹果M1 Pro
- 核心总数:8(6个性能和2个效率)
- 系统版本:macOS Monterey
不同的是芯片和系统版本,但不确定这是否与我的问题相关。
有人知道我的问题的根本原因是什么以及如何解决它吗?
1条答案
按热度按时间xcitsw881#
问题已解决。根本原因如下。
PATH在系统二进制文件之前包含了到自制二进制文件的路径,这导致将
strip
解析为/opt/homebrew/opt/binutils/bin/strip
,而不是/usr/bin/strip
由于某些原因,binutils不能像预期的那样工作。