无法从 Rust 代码生成最小的二进制文件

Xob*_*tah 7 gcc objdump rust

我的目标是将 Rust 程序编译为尽可能小的二进制文件并提取机器代码。我编写了一个非常简单的程序来测试。

.cargo/配置

[target.x86_64-pc-windows-gnu]
rustflags = ["-C", "link-args=-e _start -static -nostartfiles"]
Run Code Online (Sandbox Code Playgroud)

Cargo.toml

[package]
name = "r"
version = "0.1.0"
edition = "2021"

[profile.release]
panic = "abort"
opt-level = "z"
lto = true
codegen-units = 1
Run Code Online (Sandbox Code Playgroud)

主程序.rs

#![no_std]
#![no_main]

#[panic_handler]
fn panic(_: &core::panic::PanicInfo) -> ! {
    loop {}
}

#[no_mangle]
unsafe fn _start() -> isize {
    42
}
Run Code Online (Sandbox Code Playgroud)

我编译cargo build --target x86_64-pc-windows-gnu --release并提取该.text部分objcopy -j .text -O binary target/x86_64-pc-windows-gnu/release/r.exe r.bin,但是当我显示机器代码时,我得到的比我预期的要多:

% objdump -D -b binary -mi386 -Mx86-64 -Mintel -z r.bin 

r.bin:     file format binary


Disassembly of section .data:

00000000 <.data>:
   0:   b8 2a 00 00 00          mov    eax,0x2a
   5:   c3                      ret
   6:   66 90                   xchg   ax,ax
   8:   ff                      (bad)
   9:   ff                      (bad)
   a:   ff                      (bad)
   b:   ff                      (bad)
   c:   ff                      (bad)
   d:   ff                      (bad)
   e:   ff                      (bad)
   f:   ff 00                   inc    DWORD PTR [rax]
  11:   00 00                   add    BYTE PTR [rax],al
  13:   00 00                   add    BYTE PTR [rax],al
  15:   00 00                   add    BYTE PTR [rax],al
  17:   00 ff                   add    bh,bh
  19:   ff                      (bad)
  1a:   ff                      (bad)
  1b:   ff                      (bad)
  1c:   ff                      (bad)
  1d:   ff                      (bad)
  1e:   ff                      (bad)
  1f:   ff 00                   inc    DWORD PTR [rax]
  21:   00 00                   add    BYTE PTR [rax],al
  23:   00 00                   add    BYTE PTR [rax],al
  25:   00 00                   add    BYTE PTR [rax],al
  27:   00                      .byte 0x0
Run Code Online (Sandbox Code Playgroud)

我预料到了:

% objdump -D -b binary -mi386 -Mx86-64 -Mintel -z r.bin 

r.bin:     file format binary


Disassembly of section .data:

00000000 <.data>:
   0:   b8 2a 00 00 00          mov    eax,0x2a
   5:   c3                      ret
Run Code Online (Sandbox Code Playgroud)

两个问题:

  • 从地址 0x6 到文件末尾的机器码的用途是什么?
  • 我该如何摆脱它?