Woher weiß der Code einer dynamischen Bibliothek, in welchem ​​Prozess er aufgerufen wird?

Woher weiß der Code einer dynamischen Bibliothek, in welchem ​​Prozess er aufgerufen wird?

Wenn ich das richtig verstanden habe, wird die eine Dylib-Instanz beim Laden in einem Speichersegment gespeichert, dann wird sie gemeinsam genutztund nicht kopiertzwischen mehreren Prozessen virtuelle Speicher, die dies benötigen. Aber woher weiß es, wer zur Ausführungszeit aufruft?

Z. B. frage ich den Klassenkonstruktor einer Bibliothek, der von meinem Prozessnamen abhängt (ohne den Namen direkt zu übergeben, da ich eigentlich jeden übergeben kann), woher er weiß, welcher von mehreren Prozessen, an die er angehängt ist, genau aufgerufen wurde?

(Unter Außerachtlassung der Tatsache, dass in diesem Beispiel die Metainformationen kein Geheimnis sind und mit einem einfachen Systemaufruf abgerufen werden können.) Der Code der Bibliothek kann sich nicht einmal auf Informationen aus jedem Prozessspeicher verlassen, wie er es theoretisch könnte, da dasselbe Speicherfreigabeschema sicherlich nicht umgekehrt angewendet werden kann (eine Bibliothek <- viele Prozesse gleichzeitig) – das wäre eine große Sicherheitslücke.

Die Situation wird noch komplizierter, wenn eine Bibliothek prozessspezifische Informationen in ihrer Klasse als statische Eigenschaft speichern muss, die innerhalb eines bestimmten Prozesses und/oder nicht in jedem Prozess gemeinsam genutzt werden können.esan die es angehängt ist. Ich gehe davon aus, dass die Daten tatsächlich in einem Format in den Prozessspeicher geschrieben werden, das die Klasse als ihr eigenes reguläres Feld erkennt, aber wir sind wieder auf das Problem der Prozesserkennung auf der Ebene des Codes einer Bibliothek zurückgekommen.

Antwort1

Im Allgemeinen werden Zeiger auf den Stack (von wo die Rücksprungadresse kommt), den Heap (Datenspeicher) und einige Variablenwerte oder Adressen in CPU-Registern übergeben. Alle diese Adressen befinden sich im virtuellen Speicher des Anrufers. Der dynamische Bibliothekscode wird im Kontext des Anrufers ausgeführt, sodass sich alle Systemaufrufe so verhalten, als hätte der Anrufer sie ausgeführt.

Ich rufe die gemeinsam genutzten Bibliotheken mit Zeigern auf meine Sachen in meinem virtuellen Raum auf, und Sie rufen die gemeinsam genutzten Bibliotheken mit Zeigern auf Ihre Sachen in Ihrem virtuellen Raum auf.

verwandte Informationen