2.7 Mo le HelloWorld en rust

je veux désassembler un petit binaire fait maison

a marqué ce sujet comme résolu.

salut, sur linux, ce code: fichier test.rs

fn main() {
    println!("Hello world!");
}

après cette commande: rustc test.rs

ça pèse 2.7 Mo ; la commande strings test me sort une tonne de trucs.

Ai je raté quelque chose ? mon objectif est d' étudier le code désassembler juste après la compil, mais avec 2.7 Mo je vais pas m’en sortir de la sorte. J’ai envie de travailler à partir de rust plutot que c/c++ ; pour l' instant je galère à cythonizer mes scripts python ; lua c’est en projet derrière rust.

un conseil ?

+0 -0

En effet, @entwanne dit vrai, la compilation est en statique par défaut ; pour étudier le code, le moyen le plus simple est de compiler en dynamique en passant l’argument -C prefer-dynamic au compilateur.

+2 -0

Le fichier ne fait plus que 13.9 ko mais quand je le lance, j' obtiens ./test ./test: error while loading shared libraries: libstd-c32b051c3aafd36c.so: cannot open shared object file: No such file or directory

pourriez vous me simplifier la notion de binaire statique / dynamique ?

13.9 ko, ça fait encore beaucoup je trouve, dans le passé y avait des jeux d' arcade qui tenait sur une 5pouce 1/4 de 720 ko !

+0 -0

pourriez vous me simplifier la notion de binaire statique / dynamique ?

En très simplifié :

Soit le programme suivant, en pseudo-code :

importe bibliothèque standard

fonction principale {
    affiche Bonjour
}

La fonction affiche n’est pas définie dans mon code. Elle vient d’ailleurs. Mon code compile quand même parce que la fonction est définie dans la bibliothèque standard, que j’importe.

La question est quand et comment.

  • Si, lors de la compilation, je prends toute la bibliothèque standard, avec toutes ses fonctions (au moins toutes les fonctions que j’utilise), et que je les mets dans mon exécutable avec mon code compilé, ce sera un binaire statique.
  • Si je ne mets dans le binaire que mon code, mais que je charge tout au lancement du programme, j’aurai un binaire dynamique. Par contre, la bibliothèque appelée devra être présente sur la machine où le code est exécuté dans un emplacement que mon programme va chercher. Si la bibliothèque est absente, ou qu’une bibliothèque avec le même nom mais pas les bonnes fonctions est trouvé, ça ne va pas marcher. Si elle existe avec les bonnes fonctions, mais qu’elles ne renvoient pas les bonnes choses, le programme va se lancer mais ne pas réagir correctement. Si la bibliothèque n’est pas trouvée, il faut changer le chemin de recherche (variable d’environnement LD_LIBRARY_PATH sous Linux, par exemple) pour qu’elle le soit.
  • Je peux aussi demander que la bibliothèque soit importée durant l’exécution de mon programme et non pas au début. Ainsi, le programme plantera durant l’exécution si la bibliothèque n’est pas trouvée.

Intérêt et inconvénients de chaque méthode :

  • En statique, c’est plus lourd. Par contre, ça marche sur toutes les machines compatibles avec le code sans avoir besoin d’installer quoi que ce soit.
  • En dynamique, c’est plus léger (disque et mémoire). Si la bibliothèque est utilisée par deux programmes en même temps, comme ils utilisent la même, elle n’est chargée qu’une fois. Par contre, la bibliothèque doit être présente, au bon endroit, et dans la bonne version. Si une version incompatible avec le même nom est présente, le programme va buguer. C’est donc moins stable dans le temps.
  • Le chargement à la volée (dlopen) est utile pour les extensions. Le but est de mettre plus de fonctionnalités, mais sous conditions. Par exemple, je fais un programme qui peut se connecter à 4 base de données différentes. Je ne veux pas charger les 4 bibliothèques associées au démarrage, je ne veux même pas dépendre d’elle (sinon, les 4 bases de données doivent être installées sur la machine). Lorsque j’appelle une base de donnée précise, je charge la bonne bibliothèque, et je renvoie une erreur si elle n’est pas présente. Ainsi, je ne dépends pas au démarrage d’autre programme, mais j’ai quand même plein de fonctionnalités.
+4 -0

combien pèse chez vous un hello world en rust une fois compilé ?

comment procéder pour "s’amuser" avec le code compilé-désassemblé ? car si ça fait toujours 14 ko même chez vous, je ne sais pas faire plus simple ou alors coder une addition tout bête mais y’aurai aucun intérêt là.

du coup, pour mon histoire de reversing, vous me conseiller de compiler en statique ou en dynamique ou en dlopen ?

Tu peux rajouter -C opt-level=s à la compilation pour que Rust optimise la taille du binaire. Chez moi, il passe de 18 à 13 ko.

Après, si tu veux utiliser un débogueur, tu as l’option-g qui va ajouter les symboles de débug (20ko au final), mais va t’aider à te repérer dans le programme.

Pour étudier le binaire, je pense que le mieux est en dynamique. Car le statique contient plein d’autre trucs, et avec dlopen, ça rajoute une couche potentiellement complexe.

Après, j’ai pas bien compris où tu veux en venir. Si tu ne savais pas ce qu’étais la différence statique / dynamique, je ne suis pas sûr que tu arrives à sortir quelque chose d’intéressant du code désassemblé.

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte