Ich habe eine dynamische Bibliothek, die ich mit dlopen()
lade und dann entlade mit dlclose()
;
Wenn ich keinen objektiven c-Code einschließe, benötigt dlopen()
einen dlclose()
-Aufruf, der das erwartete Verhalten ist. Aber wenn ich irgendeinen objektiven c-Code zum Ziel hinzufüge, habe ich das Problem, dass ich zwei dlclose()
-Aufrufe an die geladene Bibliothek machen muss, um sie zu entladen.
Ist das etwas erwartetes Verhalten? Wie kann ich es beheben?
Ich verstehe, dass Sie dlopen
, nicht CFBundle
oder NSBundle
verwenden. Dennoch ist die Code Loading Programming Topics Handbuch sagt dies:
In Cocoa-Anwendungen sollten Sie
CFBundle
routinen nicht zum Laden und Entladen von ausführbarem Code verwenden, daCFBundle
die Objective-C-Laufzeit nicht nativ unterstützt.NSBundle
lädt korrekt Objective-C-Symbole in das Laufzeitsystem, aber es gibt keine Möglichkeit, Cocoa-Bundles nach dem Laden aufgrund einer Laufzeitbeschränkung zu entladen.
und das:
Aufgrund einer Einschränkung im Objective-C-Laufzeitsystem kann
NSBundle
den ausführbaren Code nicht entfernen.
Das lässt mich vermuten, dass wenn Sie Ihre Bibliothek laden, sie sich bei der Objective-C-Laufzeit registriert und die Laufzeit dlopen
in der Bibliothek erneut aufruft (oder die Referenzzahl der Bibliothek irgendwie erhöht).
Ich habe den Source-Code der Objective-C-Laufzeitumgebung durchsucht und das :
%Vor% Also, die Objective-C-Laufzeit ruft dlopen
in Ihrer Bibliothek auf, um zu verhindern, dass sie entladen wird. Wenn du schummelst und dlclose
zweimal aufruft, solltest du erwarten, dass schlimme Dinge passieren.
Tags und Links c objective-c macos cocoa dylib