Laissez-moi 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. Je crains 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 fonctionnement, la solution est pratique: essayez de pirater un peu la source et de la compiler statiquement --- l'exécutable résultant sera gros et pas si efficace, mais ça marchera dans un avenir prévisible (1). Cela semble être le cas pour xfig
et je vais l'essayer dès que possible.
Mais, par exemple, pdfedit
dépend de Qt3, et configurer un système pour le compiler est assez complexe en ce moment. Heureusement il peut être exécuté pour le moment, grâce au fait que la bibliothèque dont elle a besoin n’entre en conflit avec rien. Mais cela peut changer dans le futur, je voudrais donc résoudre ce problème:
Comment puis-je créer un binaire statique (ou similaire) si j'ai une bibliothèque dynamique et toutes les bibliothèques, mais pas de code source, sur Ubuntu?
J'ai cherché autour. Une possibilité est statifier (2), mais il y a beaucoup de problèmes de randomisation d'adresse , c'est donc 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 le tutoriel que j'ai trouvé sont plutôt orientés RedHat ; et, honnêtement, assez complexe à suivre.
Notes de bas de page :
(1) n'est pas si fou. J'utilise un statique ffmpeg par exemple, fonctionne bien et sans aucun problème de compatibilité ...
(2) pour compiler statifier
, voir https://stackoverflow.com/questions/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error
Vous pouvez résoudre votre problème d’une autre manière plus simple:
Utilisez ldd
sur 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, rassemblez toutes les bibliothèques dans un dossier et définissez la variable d’environnement LD_LIBRARY_PATH avant d’exécuter votre programme pour qu’il pointe 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 à /etc/ld.so.conf.d/
. Mais cela appliquerait le changement à l'échelle du système.
Une suggestion concernant le statifier :
Si la randomisation de la disposition de l'espace adresse (ASLR) provoque 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 va exécuter cette commande avec la disposition aléatoire désactivée (pas besoin d'être root).