Ich habe eine einfache kleine Frage, die jemand, der weiß, in der Lage sein wird, leicht zu antworten, ich habe google gesucht, aber konnte die Antwort nicht finden.Werden .dll-Dateien einmal für jedes Programm oder einmal für alle Programme geladen?
Es gibt viele Programme, die gleichzeitig auf einem Computer laufen, und meine Frage ist: Wenn ein Programm eine DLL lädt, lädt es tatsächlich die DLL-Datei oder findet es den Speicher, in dem die DLL bereits geladen ist? Wird beispielsweise ws2_32.dll (winsock 2) für jedes Programm geladen, das winsock verwendet, oder wird es einmal geladen, und alle Programme, die es verwenden, verwenden dieselben Speicheradressen, um die Funktionen aufzurufen?
Ok danke, das macht Sinn. Ich musste nur wissen, ob ein Zeiger auf eine Funktion von einer DLL auf die gleiche Adresse zeigen würde, die von allen Programmen verwendet wird, die die Funktion verwendeten. – Nilbert
Die Antwort auf diese Frage ist "Nein". Funktionszeiger sind Adressen in den Prozessen * virtueller Adressraum *, und das wird definitiv nicht zwischen Prozessen geteilt. Eine DLL kann an verschiedenen Adressen in verschiedenen Prozessen geladen werden, und daher wird die Adresse eines Funktionszeigers anders sein - obwohl dieselbe physikalische Seite verwendet wird. –
Tatsächlich ist es sehr unwahrscheinlich, dass die Funktion in zwei verschiedenen Programmen dieselbe Adresse hat. Der Code der DLL wird nach allen ihm vorausgehenden Code-Segment-Beiträgen in den nächsten verfügbaren Adressraum abgebildet. In Secure Linux wird die Randomisierung der Ladeadressen verwendet (um zu verhindern, dass viri hartcodierte Adressen in Angriffen verwendet). Du schreibst kein Virus, oder? :-) – wallyk