
Viele Antworten auf andere Fragen helfen bei der Behebung eines Fehlers der Art „Segment konnte nicht von freigegebenem Objekt zugeordnet werden“, enthalten aber normalerweise sehr spezifische Antworten, die ich nur schwer auf andere Probleme anwenden kann. Andererseits kann ich zu diesem Fehler im Allgemeinen nichts finden.
Kann jemand eine grundlegende Beschreibung dieses Fehlers und (idealerweise) einige häufige Ursachen geben?
Es wäre beispielsweise schön zu wissen, welche Entität den Fehler auslöst (der Kernel, der Prozess, das Programm?) und welche Gründe hierfür am häufigsten auftreten (z. B. ist fast jede Bibliothek als lesbar gekennzeichnet, warum kann ich also nicht von ihr mappen?).
Ich verwende derzeit Ubuntu, obwohl ich vermute, dass dies auf viele Distributionen zutrifft.
Antwort1
Diese Nachricht wird vom dynamischen Linker ( ld.so(8)
) oder den dynamischen Ladeeinrichtungen ( dlopen(3)
) generiert.
Um Ihre Fragen direkt zu beantworten:A)es istnichtaus dem KernelB)es ist von einem Prozess im BenutzermodusC)es wird normalerweise nicht vom Hauptcode eines Programms generiert, sondern vom dynamischen Linker, der es lädt, oder von einer dynamischen Bibliothek, die es verwendet ( libdl.so
) undD)Die Tatsache, dass ein Segment aus einer Datei gelesen werden konnte, bedeutet nicht, dass es mit dem richtigen Schutz (z. B. ausführbar) gelesen werden konnte oder dass es an der erforderlichen Adresse gelesen mmap
werden konnte (bei Verwendung mit einer falschen Adresse anstelle der Adresse einer bekannten Zuordnung, die ersetzt werden sollte).mmap
MAP_FIXED
Wenn Sie weitere Details wünschen, werden Sie sehen, dass es im Glibc-Quellcode wie elf/dl-load.h
folgt definiert ist:DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT
und könnte zurückgegeben werden durch die_dl_map_segments()
statische Funktion, die selbst über _dl_map_object()
=> aufgerufen wird _dl_map_object_from_fd()
und _dl_map_object()
entweder direkt vom dynamischen Linker oder über ihren .dl_open
Rückruf aufgerufen wird, der letztendlich von aufgerufen wird dlopen(3)
.