Как получить сборку из здания с помощью Cargo?

В то время как я видел документы об использовании rustc непосредственно для сборки сборки, необходимость вручную извлекать команды, используемые Cargo, и редактировать их для записи сборки, является утомительной.

Есть ли способ запустить Cargo, который записывает файлы сборки?

Ответ 1

Вы можете использовать команду Cargo cargo rustc для прямого отправки аргументов rustc:

cargo rustc -- --emit asm
ls target/debug/deps/crate_name.s

Для оптимизированной сборки:

cargo rustc --release -- --emit asm
ls target/release/deps/crate_name.s

Ответ 2

В дополнение к ответу kennytm вы также можете использовать переменную окружения RUSTFLAGS и использовать стандартные команды груза:

RUSTFLAGS="--emit asm" cargo build
cat target/debug/deps/project_name-hash.s

Или в режиме деблокирования (с оптимизацией):

RUSTFLAGS="--emit asm" cargo build --release
cat target/release/deps/project_name-hash.s

Вы можете передать различные значения параметру --emit, включая (но не ограничиваясь этим):

  • mir (промежуточное представление Rust)
  • llvm-ir (промежуточное представление LLVM)
  • llvm-bc (LLVM-байтовый код)
  • asm (сборка)

Ответ 3

Оба существующих ответа (с использованием cargo rustc и RUSTFLAGS) являются наилучшими способами сборки с помощью стандартных инструментов. Если вы обнаружите, что пытаетесь посмотреть на сборку довольно часто, вы можете рассмотреть возможность использования подкоманды cargo asm. После того, как вы установили его вместе с cargo install cargo-asm, вы можете напечатать сборку так:

cargo build --release
cargo asm my_crate::my_function

Однако есть несколько вещей, на которые следует обратить внимание:

  • Не уверены в пути вашей функции? Просто запустите cargo asm и в нем будут перечислены все символы, которые вы можете проверить.
  • Вы должны выполнить cargo build --release прежде чем пытаться взглянуть на сборку, потому что cargo asm (по-видимому) смотрит только на уже существующие артефакты сборки.
  • Код для функции, которую вы хотите проверить, должен быть сгенерирован. Для универсальных функций это означает, что функция должна быть реализована/мономорфизирована с конкретным типом. Если этого не происходит в вашем ящике, вы всегда можете добавить фиктивную функцию на верхнем уровне, которая делает все, что вы хотите, чтобы проверить сборку.