Oui, vous avez besoin de bibliothèques statiques pour créer un exécutable lié statiquement.
Les bibliothèques statiques sont des ensembles d'objets compilés. Lorsque vous établissez un lien statique avec la bibliothèque, cela revient à prendre les résultats de compilation de cette bibliothèque, à les décompacter dans votre projet actuel et à les utiliser comme s'ils étaient vos propres objets.
Les bibliothèques dynamiques sont déjà liées. Cela signifie que certaines informations comme les délocalisations ont déjà été réparées et rejetées.
En outre, les bibliothèques dynamiques doivent être compilées en tant que code indépendant de la position. Ce n'est pas une restriction sur les bibliothèques statiques, et il en résulte une différence significative de performance sur certaines plates-formes communes (comme x86).
Il existe des outils tels que ELF Statifier qui tentent de regrouper des bibliothèques liées dynamiquement dans un exécutable lié dynamiquement, mais il est très difficile de générer un résultat correct dans tous les cas.
Merci pour votre réponse. Mais pourquoi est-ce si difficile? –
ELF Statfier charge l'exécutable et toutes ses bibliothèques, puis prend un instantané de la mémoire de processus. Lorsque l'image de sortie est exécutée, tout ce qui entraînerait une modification de la disposition de la mémoire (par exemple, VDSO randomisé) entraînera une opération incorrecte. Toute autre approche nécessite de réinventer l'éditeur de liens dynamique. – ephemient
Pourquoi serait-il difficile de réimplémenter l'éditeur de liens dynamique? N'y a-t-il pas seulement deux tables des importations et des exportations de la bibliothèque, à délocaliser? C'est le lieur, donc il est déjà en train d'implémenter un éditeur de liens statiques, et il connaît le format de fichier de l'exécutable et de la bibliothèque dynamique, etc – ChrisW