为什么用符号剥离(strip=debuginfo或strip=symbol)编译的二进制rustc不运行?

k2fxgqgv  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(191)

我试图用剥离的符号构建一个简单的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

尝试另一个链接器

尝试使用不同的链接器:zldmold

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

不同的是芯片和系统版本,但不确定这是否与我的问题相关。
有人知道我的问题的根本原因是什么以及如何解决它吗?

xcitsw88

xcitsw881#

问题已解决。根本原因如下。
PATH在系统二进制文件之前包含了到自制二进制文件的路径,这导致将strip解析为/opt/homebrew/opt/binutils/bin/strip,而不是/usr/bin/strip
由于某些原因,binutils不能像预期的那样工作。

相关问题