Existe-t-il un moyen open source pour créer une statique à partir d'un exécutable dynamique sans disponibilité de code source?

20

Permettez-moi d'expliquer le problème avec un exemple. J'utilise un ancien programme dans mon travail quotidien, comme par exemple xfig et pdfedit .

Maintenant, ces programmes sont assez anciens et ne sont pas mis à jour trop souvent; ma crainte est qu'un jour ou l'autre ils ne fonctionneront plus faute de bibliothèque ou de mise à jour incompatible.

Si le programme est facile à compiler maintenant , sur un système en cours d'exécution, la solution est pratique: essayez de pirater un peu la source et compilez-la statiquement --- l'exécutable résultant sera gros et pas si efficace, mais cela fonctionnera pour le avenir prévisible (1). Cela semble être le cas xfiget je vais l'essayer dès que possible.

Mais, par exemple, pdfeditdépend de Qt3, et la mise en place d'un système pour le compiler est assez complexe à l'heure actuelle. Heureusement, il peut être exécuté dès maintenant, grâce au fait que la bibliothèque dont il a besoin n'est en conflit avec rien. Mais cela peut changer à l'avenir, donc je voudrais résoudre ce problème:

Comment puis-je créer un binaire statique (ou quelque chose de similaire) si j'en ai un dynamique et toutes les bibliothèques, mais pas de code source, sur Ubuntu?

J'ai cherché autour. Une possibilité est statifier (2), mais il a beaucoup de problèmes avec la randomisation d'adresse , donc c'est un non-non. La version non libre, Ermine , semble fonctionner, mais je préférerais vraiment une option open source.

Une autre possibilité consiste à utiliser Docker ou un système d'emballage similaire. Mais tous les tutoriels que j'ai trouvés sont assez orientés RedHat ; et, honnêtement, assez complexe à suivre.


Notes de bas de page :

(1) n'est pas si fou. J'utilise un ffmpeg statique par exemple, fonctionne bien et sans aucun problème de compatibilité ...

(2) pour compiler statifier, voir /programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error

Rmano
la source

Réponses:

19

Vous pouvez résoudre votre problème d'une autre manière plus simple:

Utilisez lddsur votre exécutable pour voir les bibliothèques liées, par exemple:

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

Ensuite, collectez toutes les bibliothèques dans un dossier et définissez la variable d'environnement LD_LIBRARY_PATH avant d'exécuter votre programme pour pointer vers ce dossier:

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

Vous pouvez également ajouter une entrée pour le dossier lib dans /etc/ld.so.conf.d/. Mais cela appliquerait le changement à l'échelle du système.

Klaus D.
la source
C'est une bonne idée --- bien que j'aimerais vraiment trouver un moyen de regrouper tout cela dans un exécutable; cette solution peut être affectée par des changements dans le chargeur (bien que j'espère que personne ne fera une telle chose de manière non rétrocompatible). Accordera la prime si aucune meilleure solution ne se présente --- merci.
Rmano
Eh bien, vous pouvez l'ajouter à un petit script d'installation et le lier au chemin local. J'aime cette solution, j'aurais pu l'utiliser il y a longtemps.
WalyKu
1
@ Klaus, linux-vdso.so.1 est introuvable, je suppose que c'est dans le noyau, correct?
Rmano
1
Oui. De man 7 vdso: "Le" vDSO "(objet dynamique dynamique partagé) est une petite bibliothèque partagée que le noyau mappe automatiquement dans l'espace d'adressage de toutes les applications de l'espace utilisateur."
Klaus D.
Bien que ce ne soit pas strictement une réponse à la question, c'est une solution de contournement raisonnable. Merci.
Rmano
2

Une suggestion concernant le statificateur :

Si la randomisation de la disposition de l'espace d'adressage (ASLR) entraîne son échec, vous n'avez pas besoin de la désactiver pour l'ensemble de la machine. Vous pouvez le désactiver uniquement pour ce processus:

$ setarch `uname -m` -R statified_pdfedit [args...]

Il exécutera cette commande avec la disposition aléatoire désactivée (pas besoin d'être root).

citronnelle
la source
Wow intéressant. Maintenant, si je pouvais juste compiler statifier...
Rmano
Compilé et vérifié. xfig_statifiedcore core dumps ... dommage. Merci quand même.
Rmano
Ouais, dommage. Je me demande si ce ne serait pas un problème 64 bits, essayez peut-être d'exécuter statifier sur une configuration 32 bits?
lemonsqueeze
Vérifié sur une machine 32 bits, toujours des vidages de mémoire.
Rmano