So erstellen Sie statisch verknüpfte gemeinsam genutzte Bibliotheken

Für meine Masterarbeit versuche ich einen Shared Library Ansatz für ein ARM Cortex-M3 Embedded System anzupassen. Da unser Zielboard keine MMU hat, halte ich die Verwendung "normaler" dynamischer gemeinsam genutzter Bibliotheken für sinnlos. Da .text direkt von Flash ausgeführt wird und .data beim Booten in den Arbeitsspeicher kopiert wird, kann ich .data nicht relativ zum Code adressieren, GOT also auch. Auf GOT müsste über eine absolute Adresse zugegriffen werden, die zur Verbindungszeit definiert werden muss. Warum also nicht allen Symbolen zur Verbindungszeit feste absolute Adressen zuweisen ...?

Von dem Buch"Linker und Loader" Mir ist bekannt geworden, dass "statisch verknüpfte gemeinsam genutzte Bibliotheken, dh Bibliotheken, bei denen Programm- und Datenadressen in Bibliotheken zur Verbindungszeit an ausführbare Dateien gebunden sind". Das verknüpfte Kapitel beschreibt, wie solche Bibliotheken im Allgemeinen erstellt werden können, und verweist auf Unix System V, BSD / OS. erwähnt aber auch Linux und den Systemaufruf uselib (). Leider enthält das Buch keine Informationen darüber, wie solche Bibliotheken wie Tools und / oder Compiler / Linker-Schalter tatsächlich erstellt werden. Abgesehen von diesem Buch habe ich kaum andere Informationen über solche Bibliotheken "in the wild" gefunden. Das einzige, was ich in dieser Hinsicht gefunden habe, warPrelink für Linux. Aber da dies mit "normalen" dynamischen Bibliotheken funktioniert, ist das nicht das, wonach ich suche.

Ich befürchte, dass die Verwendung dieser Art von Bibliotheken sehr spezifisch ist, so dass es keine gemeinsamen Werkzeuge gibt, um sie zu erstellen. Obwohl das erwähnte uselib () -Syscall in diesem Zusammenhang mich wundert. Aber ich wollte sicherstellen, dass ich nichts übersehen habe, bevor ich anfing, meinen eigenen Linker zu hacken ...;) Könnte mir jemand mehr Informationen über solche Bibliotheken geben?

Außerdem frage ich mich, ob es einen gcc / ld-Schalter gibt, der eine Datei verknüpft und verschiebt, aber die Verschiebungseinträge in der Datei beibehält - damit sie verschoben werden kann. Ich habe die Option "-r" gefunden, aber dadurch wird der Umzugsprozess vollständig übersprungen. Hat jemand eine Idee?

bearbeiten:

Ja, ich kenne auch Linker-Skripte. Mitgcc libfoo.c -o libfoo -nostdlib -e initLib -Ttext 0xdeadc0de Ich habe es geschafft, eine Art verknüpfte und verschobene Objektdatei zu bekommen. Ich habe aber bisher keine Möglichkeit gefunden, ein Hauptprogramm dagegen zu verlinken und als Shared Library zu nutzen. (Der "normale Weg" zum Verknüpfen einer dynamischen gemeinsam genutzten Bibliothek wird vom Linker abgelehnt.)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage