Как получить сборку из здания с помощью 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
(по-видимому) смотрит только на уже существующие артефакты сборки. - Код для функции, которую вы хотите проверить, должен быть сгенерирован. Для универсальных функций это означает, что функция должна быть реализована/мономорфизирована с конкретным типом. Если этого не происходит в вашем ящике, вы всегда можете добавить фиктивную функцию на верхнем уровне, которая делает все, что вы хотите, чтобы проверить сборку.