2011-09-23 31 views
5

Tengo un dylib que puedo cargar mediante inyección en mac os x. La llamada de constructor funciona bien.dylib destructor no se llama

__attribute__((constructor)) 
static void initialize() 

Pero destructor no se consiga llamar? Por lo tanto, los recursos inicializaron fugas.

__attribute__((destructor)) 
static void destroy() 
  1. ¿Tiene dylib se descarga automáticamente si se cierra la aplicación?
  2. ¿El dylib inyectado se descarga automáticamente si se cierra la aplicación?
  3. ¿Cómo podemos descargar dylib de la aplicación en tiempo de ejecución? Como su código de inyección, puedo acceder al área privada. ¿Hay un comando para hacer esto?
+0

Pregunta Continuación http://stackoverflow.com/q/7553355/802921 – MacGeek

Respuesta

4

1, 2: No. Las bibliotecas no se descargan realmente cuando sale una aplicación; simplemente desaparecen junto con el resto del proceso, del mismo modo que otros recursos (por ejemplo, identificadores de archivo, memoria asignada, sockets, etc.) se liberan a la salida.

3: Depende de cómo haya inyectado la biblioteca. Si lo cargó usando algo como dlopen(), debería poder descargar la biblioteca usando dlclose(), por ejemplo; NSBundle tiene algo equivalente.

Tenga en cuenta que la descarga de bibliotecas es desordenada. En particular, no es seguro descargar una biblioteca que contiene cualquier clase ObjC, ya que el tiempo de ejecución puede tener referencias en caché a sus clases.