дилиб деструктор не вызывается - PullRequest
5 голосов
/ 23 сентября 2011

У меня есть dylib, который я могу загрузить через Mac OS X.Вызов конструктора работает хорошо.

 __attribute__((constructor))
 static void initialize()

Но деструктор не вызывается?Таким образом, ресурсы инициализируют утечки.

__attribute__((destructor))
static void destroy()
  1. Загружается ли dylib автоматически при выходе из приложения?
  2. Загружается ли автоматически введенный dylib при выходе из приложения?
  3. Как можновыгрузить dylib из приложения во время выполнения?В качестве кода для инъекций я могу получить доступ к приватной области.Есть команда, чтобы сделать это?

1 Ответ

4 голосов
/ 23 сентября 2011

1, 2: Нет. Библиотеки на самом деле не выгружаются при выходе из приложения - они просто исчезают вместе с остальной частью процесса, так же, как другие ресурсы (например, файловые дескрипторы, отображенная память розетки, и т. д. ) освобождаются при выходе.

3: Зависит от того, как вы добавили библиотеку. Если вы загрузили его, используя что-то вроде dlopen(), вы сможете выгрузить библиотеку, например, с помощью dlclose(); NSBundle имеет что-то эквивалентное.

Имейте в виду, что выгрузка библиотек является грязной. В частности, небезопасно выгружать библиотеку, которая содержит какие-либо классы ObjC, поскольку среда выполнения могла кэшировать ссылки на ваши классы.

...