2009-12-07 3 views
5

Ich habe eine gcc-kompilierte Anwendung gegen dynamische Bibliotheken verknüpft. Gibt es eine Möglichkeit, die Reihenfolge anzugeben, in der Bibliotheken geladen werden? (In meinem Fall verwendet ein Bibliothekskonstruktor Ressourcen, die von einem anderen Bibliothekskonstruktor eingerichtet wurden).imposante Bibliothek loading order

Danke.

Antwort

5

gcc ist nicht verantwortlich für das Laden der Bibliotheken, entweder ld.so tut es automatisch, wenn Ihr Programm geladen wird, oder Sie tun es manuell als @jldupont schlägt vor.

Und ld.so könnte absichtlich randomise die Reihenfolge, um return-to-stdlib Angriffe zu verhindern.

Also entweder:

  1. laden die Bibliotheken selbst.
  2. Oder entfernen Sie die Abhängigkeiten zwischen den Bibliotheken laden Skripts.
  3. Lassen Sie die Bibliotheken die Abhängigkeiten selbst enthalten (funktioniert möglicherweise, möglicherweise nicht) Das ist, wenn Sie zu dem Punkt der Verknüpfung jeder gemeinsam genutzten Bibliothek kommen, stellen Sie sicher, dass es -l<dependentlib> in den Link-Befehl enthält. Sie können dies testen, indem Sie ein Trival-Programm erstellen, das nur mit dieser gemeinsam genutzten Bibliothek verknüpft ist. Wenn es erstellt und ausgeführt wird, enthält die Bibliothek alle erforderlichen abhängigen Bibliotheken. Dies kann hilfreich sein, wenn ld.so die Bibliotheken in Abhängigkeitsreihenfolge lädt - was ich denke, dass es tun muss.
+0

Wie mache ich "die Bibliotheken die Abhängigkeiten selbst enthalten"? – jackhab

+0

@Jack - bearbeitete meine Antwort - im Grunde, wenn Sie die Bibliothek verknüpfen, stellen Sie sicher, dass alle abhängigen Bibliotheken verknüpft sind. –

3

Sie können dlopen verwenden und die Bibliotheken selbst laden: Auf diese Weise können Sie den Lade-/Entladevorgang feiner steuern. Siehe here.

Natürlich ist dies keine "gcc" -basierte Lösung und es erfordert eine Überarbeitung Ihrer Anwendung ... Vielleicht könnten Sie das "Problem", mit dem Sie konfrontiert werden, etwas genauer erklären?

Sie können meine Lösung ignorieren, wenn sie nicht Ihren Anforderungen entspricht. Prost!