Benötige ich statische Bibliotheken, um statisch zu verknüpfen?

8

Ein 'C', Linux,

Benötige ich statische Bibliotheken, um statisch zu verlinken, oder die gemeinsamen, die ich habe? Wenn nicht, warum nicht? (Haben sie nicht dieselben Daten?)

    
Liran Orevi 20.06.2009, 17:54
quelle

4 Antworten

10

Ja, Sie benötigen statische Bibliotheken, um eine statisch verknüpfte ausführbare Datei zu erstellen.

Statische Bibliotheken sind Bündel kompilierter Objekte. Wenn Sie statisch mit der Bibliothek verknüpfen, ist dies im Grunde genommen dasselbe wie die Kompilierungsergebnisse dieser Bibliothek zu übernehmen, sie in Ihrem aktuellen Projekt zu entpacken und sie so zu verwenden, als wären sie Ihre eigenen Objekte.

Dynamische Bibliotheken sind bereits verknüpft. Das bedeutet, dass einige Informationen wie Verlagerungen bereits behoben und verworfen wurden.

Außerdem müssen dynamische Bibliotheken als positionsunabhängiger Code kompiliert werden. Dies ist keine Einschränkung für statische Bibliotheken und führt zu einem signifikanten Leistungsunterschied auf einigen gängigen Plattformen (wie x86).

Es gibt Tools wie ELF-Statifikator , die versuchen, dynamisch verknüpfte Bibliotheken zu einer dynamisch verknüpften ausführbaren Datei zu bündeln, aber es ist sehr schwierig um unter allen Umständen ein korrekt funktionierendes Ergebnis zu erzeugen.

    
ephemient 20.06.2009, 18:05
quelle
6

Es gibt keine statische Kompilierung, nur eine statische Verknüpfung. Und dafür benötigen Sie statische Bibliotheken. Der Unterschied zwischen statischer und dynamischer Verknüpfung besteht darin, dass bei der ersteren die Namen zur Verknüpfungszeit (direkt nach der Kompilierungszeit) aufgelöst werden, während sie bei der letzteren aufgelöst werden, sobald das Programm gestartet wird.

Statische und dynamische Bibliotheken können die gleichen Informationen enthalten oder auch nicht, abhängig von vielen Faktoren. Die Entscheidung, ob Sie Ihren Code statisch oder dynamisch verknüpfen möchten, ist wichtig und beeinflusst häufig die Anwendungsarchitektur.

    
anon 20.06.2009 17:59
quelle
2

Alle Bibliotheken, die Sie mit einem statisch verknüpften Programm verknüpfen, müssen die statische Variante sein. Während die Bibliotheken dynamic (libfoo.so) und static (libfoo.a) in ihnen die gleichen Funktionen haben, handelt es sich um unterschiedliche Formatdateien. Daher benötigen Sie den passenden Typ für Ihr Programm.

    
DaveR 20.06.2009 18:01
quelle
1

Eine andere Option ist Hermelin ( Ссылка ) Es ist wie ein Statifikator, aber in der Lage, mit Randomisierung des Speichers umzugehen.

    
Valery 23.07.2009 07:29
quelle