unload dynamische Bibliothek benötigt zwei dclclose () -Aufrufe?

7

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?

    
MacGeek 09.01.2012, 18:10
quelle

1 Antwort

26

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, da CFBundle 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.

    
rob mayoff 09.01.2012, 19:08
quelle

Tags und Links