web-dev-qa-db-fra.com

Compiler un exécutable statique autonome

J'essaie de compiler un exécutable (fichier ELF) qui n'utilise pas de chargeur dynamique. J'ai construit un compilateur croisé qui compile les mips de Linux pour les utiliser sur un simulateur que j'ai fait. J'ai affirmé le drapeau -static-libgcc lors de la compilation de mon fichier hello.cpp (programme hello world). Apparemment, cela ne suffit pas. Parce qu'il y a encore un segment dans mon exécutable qui contient le nom/chemin du chargeur dynamique. Quels drapeaux dois-je utiliser pour générer un exécutable qui contient TOUT ce qui doit être exécuté? Dois-je reconstruire mon compilateur croisé?

34
Dan Snyder

Essayez d'utiliser le -static drapeau?

21
sigjuice

Utilisez les drapeaux suivants pour la liaison

-static -static-libgcc -static-libstdc++

Utilisez ces trois indicateurs pour établir un lien avec les versions statiques de toutes les dépendances (en supposant gcc). Notez que dans certaines situations, vous n'avez pas nécessairement besoin des trois drapeaux, mais ils ne "blessent" pas non plus. Par conséquent, allumez les trois.

Vérifiez si cela a réellement fonctionné

  1. Assurez-vous qu'il n'y a vraiment pas de lien dynamique

    ldd yourexecutable
    

    devrait retourner "pas un exécutable dynamique" ou quelque chose d'équivalent.

  2. Assurez-vous qu'il ne reste aucun symbole non résolu

    nm yourexecutable | grep " U "
    

    La liste doit être vide ou ne doit contenir que quelques symboles spéciaux de l'espace noyau comme

    U __tls_get_addr
    
  3. Enfin, vérifiez si vous pouvez réellement exécuter votre exécutable

98
Bernhard Kausler