Как dylib может сам себя разгрузить? - PullRequest
0 голосов
/ 05 января 2012

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

  1. Возможно ли загрузить саму библиотеку, загруженную через dlopen ()?

Ex. В приведенном ниже коде мы можем просто выполнить код hello (), а затем в конце выгрузить его.

 __attribute__((constructor))
 static void hello()
{
   // get handle to this dylib some how ???
   // some how unload itself ????
}

Я видел по нескольким ссылкам, что можно выгрузить библиотеку из себя. Но это для окон. Lib выгружается сам .

2. Может ли другой процесс выгружать библиотеку, вставленную в какой-то процесс xyz?

Ответы [ 2 ]

1 голос
/ 29 ноября 2013

Для Windows, смотрите мой ответ здесь относительно FreeLibraryAndExitThread функции для правильного выполнения этого. Я предполагаю, что есть аналогичные функции, доступные в других системах.
Как я понимаю, вызов FreeLibrary в этом случае является неправильным способом сделать это - из MSDN: «Если бы они вызывали FreeLibrary и ExitThread по отдельности, могло бы возникнуть условие гонки. Библиотека могла бы быть выгруженным до вызова ExitThread. " В качестве примечания, ExitThread выполняет некоторую бухгалтерию, помимо простого возврата из функции потока.

1 голос
/ 05 января 2012

Возможно, DLL выгружает саму себя, но это может привести к сбою процесса, который законно загрузил DLL, если этот процесс позже вызовет функцию в DLL.

Ссылка, на которую вы ссылаетесь, описывает Внедрение DLL , где код DLL загружается как часть адресного пространства процесса с целью перехвата вызовов, которые процесс делает к функциям.в других «законных» DLL.Обычно это делается «скрытно».то есть процесс, чьи вызовы перехватываются и перенаправляются, не знает о внедрении DLL.

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

Вам также интересно, что делать, еслизагружаемая вами DLL генерирует исключение.Вы должны быть в состоянии поймать его, но может не потребоваться выгрузить DLL.На всех платформах есть специфичные вызовы для выгрузки общей библиотеки.Так что да, вы можете сделать это.Однако было бы необычно выгружать DLL только потому, что она вызвала исключение.Обычно он работает нормально, но может вызвать проблемы, если другой поток в вашем процессе все еще использует код в этой DLL (об этом вы, очевидно, должны знать).

Краткий ответ: да, вы можете выгрузить DLL, если вы ее явно загрузили.Просто подумайте, когда лучше всего выгружать его.

Windows:

LoadLibrary()
FreeLibrary()
GetProcAddress()

Unix / Linux:

dlopen()
dlclose()
dlsym()

PS: я использую один термин, DLL в моем ответе ссылается на общие библиотеки в Windows и Linux.

...