Frage

Ich habe zahlreiche Probleme bei der Kompilierung Shared Objects hat, die statisch gegen statische Bibliotheken verknüpfen. Dieses Problem wird nur auf x84_64-Plattformen auf. Wenn die gleiche Zusammenstellung Arbeit auf x86_32 tun Ich habe keine Probleme.

Vielleicht ist dies eine OS-spezifische GCC Konfiguration Sache, aber meine Forschung zeigt, dass seine, wie GCC auf x86_64-Plattformen funktioniert. Wie auch immer, ich bin mit gcc 4.4.3 auf Ubuntu 10.04 x86_64.

Wie wird das Problem behoben? ... Sicherstellen, dass alle statischen Bibliothek Abhängigkeiten werden mit -fPIC zusammengestellt.

Frage 1: Was ist der Unterschied zwischen -fpic und -fPIC (scheinbar -fPIC erzeugt mehr Anweisungen auf x86)? Warum gibt die später mehr relevant im x86_64 Kontext?

Frage 2: Meine Vermutung ist, dass, wenn Sie statische Code-Link gegen Sie die Funktionen in die Binärdatei zu Verbindungszeitfestverdrahtung sind, warum es die Dereferenzierungsebene müssen die „Position unabhängige Code "Maschinen bieten?

Frage 3: Wenn nun x86 nicht braucht sich -fpic / -fPIC zu Link Shared Objects gegen statische Archive, warum es in x86_64 benötigt?

Frage 4: , auch wenn es gebraucht wird, warum es nicht implizit geliefert? Ich dachte, wichtige Änderungen sollte ein großes no-no

sein
War es hilfreich?

Lösung

  1. Siehe Frage 3.544.035 . Auch diskutiert hier und dort .
  2. Es hängt davon ab, was Sie verwenden für Ihre statische Bibliothek. Wenn Sie es nur in Programme verknüpfen mögen, ist es nicht PIC-Code (libtool Anrufe, dass eine Komfort-Bibliothek, weil man so ziemlich ohne es tun könnte, ist es einfach Ihren Übersetzungsvorgang auf eine vernünftige Größe erhalten hilft, zum Beispiel) benötigen. Andernfalls, wenn Sie auf einen Link geteilt Bibliotheken dagegen beabsichtigen, müssen Sie PIC-Code in Ihre statische Bibliothek.
  3. Siehe Frage 3.146.744 und auch hier
  4. Es bläht Code, es ist also nicht der Standard. Eine Sache, zu sehen, dass, wenn Sie eine einzelne Objektdatei kompilieren, ist GCC nicht, wenn du gehst, eine gemeinsame Bibliothek aus ihm heraus erstellen oder nicht. In den meisten meiner kleineren Projekten, verlinke ich einfach zusammen ein paar Objektdateien und nicht PIC-Code benötigen, zum Beispiel.

Auch mein Rat wäre: wenn Sie Sorge darüber brauchen, bist du es falsch zu machen (oder Sie mögen die harte Weise lernen, was schön ist, weil Sie mehr aus der Erfahrung bekommen). Compilation Systeme (libtool, cmake, was auch immer Sie verwenden) sollte das für Sie tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top