web-dev-qa-db-fra.com

Comment obtenir la sortie d'assemblage d'un bâtiment avec Cargo?

Bien que j'ai déjà vu des documents sur l'utilisation de rustc directement dans l'assemblage en sortie, il est fastidieux d'extraire manuellement les commandes utilisées par Cargo et de les éditer pour écrire Assembly.

Existe-t-il un moyen d'exécuter Cargo pour écrire des fichiers d'assemblage?

13
ideasman42

Vous pouvez utiliser la commande cargo rustc de Cargo pour envoyer des arguments directement à rustc:

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

Pour un montage optimisé:

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

En plus de la réponse de kennytm, vous pouvez également utiliser la variable d'environnement RUSTFLAGS et utiliser les commandes cargo standard:

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

Ou en mode release (avec optimisations):

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

Vous pouvez transmettre différentes valeurs au paramètre --emit,, y compris (sans limitation):

  • mir (représentation intermédiaire de rouille)
  • llvm-ir (représentation intermédiaire de LLVM)
  • llvm-bc (code d'octet LLVM)
  • asm (Assemblée)
22
Lukas Kalbertodt

Les deux réponses existantes (en utilisant cargo rustc et RUSTFLAGS) constituent le meilleur moyen d'obtenir Assembly avec des outils standard. Si vous essayez de regarder assez souvent Assembly, vous pouvez envisager d'utiliser la sous-commande cargo asm . Après l'avoir installé avec cargo install cargo-asm, vous pouvez imprimer l'assemblage comme suit:

cargo build --release
cargo asm my_crate::my_function

Il y a quelques points à surveiller, cependant:

  • Vous n'êtes pas sûr du chemin de votre fonction? Il suffit d’exécuter cargo asm pour répertorier tous les symboles que vous pouvez inspecter.
  • Vous devez cargo build --release avant d'essayer de regarder l'assembly, parce que cargo asm (apparemment) ne regarde que les artefacts de construction existants
  • Le code de la fonction à inspecter doit être généré. Pour les fonctions génériques, cela signifie que la fonction doit être instanciée/monomorphisée avec un type concret. Si cela ne se produit pas dans votre caisse, vous pouvez toujours ajouter une fonction fictive au niveau supérieur qui fait tout ce que vous voulez pour inspecter l’assemblage de. 
1
Lukas Kalbertodt