2009-06-20 3 views

Répondre

10

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.

+1

Merci pour votre réponse. Mais pourquoi est-ce si difficile? –

+2

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

+1

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

6

Il n'existe pas de compilation statique, seulement une liaison statique. Et pour cela, vous avez besoin de bibliothèques statiques. La différence entre les liens statiques et les liens dynamiques est qu'avec les premiers, les noms sont résolus au moment du lien (juste après la compilation), alors qu'avec le dernier, ils sont résolus au moment où le programme commence à s'exécuter.

Les bibliothèques statiques et dynamiques peuvent contenir ou non les mêmes informations, en fonction de nombreux facteurs. La décision de lier de façon statique ou dynamique votre code est importante et influencera souvent l'architecture de l'application.

+0

Merci, corrigé 'compile' à 'link'. –

2

Toutes les bibliothèques que vous liez dans un programme lié statiquement doivent être la variante statique. Alors que les bibliothèques dynamiques (libfoo.so) et statiques (libfoo.a) ont les mêmes fonctions, elles sont de formats différents et vous avez donc besoin du type correspondant à votre programme.

1

Une autre option est Ermine (http://magicErmine.com) C'est comme statifier, mais capable de gérer la randomisation de la mémoire.

+0

Très bon produit, merci. –

Questions connexes