2012-01-05 4 views
0

나는 dylib 사용에 관해서 몇 가지 사항을 이해하고 공부하고 있기 때문에 어리석은 질문을하면 실례합니다.dylib는 어떻게 스스로 언로드 할 수 있습니까?

  1. dlopen()을 통해로드 된 lib가 자체를 언로드 할 수 있습니까?

예. 아래의 코드에서 hello() 코드를 실행 한 다음 마지막에 언로드 할 수 있습니까?

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

필자는 몇 개의 링크에서 libray를 언로드 할 수 있음을 확인했습니다. 그러나 그것은 창문을위한 것입니다. Lib unload itself.

2. 다른 프로세스가 일부 xyz 프로세스에서 주입 된 라이브러리를 언로드 할 수 있습니까?

답변

1

DLL이 자체적으로 언로드 될 수는 있지만 DLL에서 해당 프로세스가 나중에 함수를 호출하면 충돌이 발생하도록 DLL을 적법하게로드하는 프로세스가 발생할 수 있습니다.

당신이 참조 링크는 DLL의 코드는 프로세스가 다른 "합법적"DLL을에서 함수를 만드는 호출을 가로로 볼 수있는 프로세스의 주소 공간의 일부로서로드되는 곳이다 DLL 주입 설명

. 대개 "비밀"적인 방식으로 수행됩니다. 즉, 호출이 인터셉트되고 리 라우팅되는 프로세스는 DLL 주입을 인식하지 못한다.

그래서 링크는 드문 상황에서 사용되는 고급 기능을 나타냅니다.

로드하는 DLL에서 예외가 발생하는 경우 어떻게해야하는지 궁금 할 것입니다. 이를 잡을 수 있어야하지만 DLL을 언로드 할 필요는 없습니다. 모든 플랫폼에서 공유 라이브러리를 언로드하기위한 OS 특정 호출입니다. 그래, 네가 할 수있어. 그러나 예외가 발생했기 때문에 DLL을 언로드하는 것은 드문 경우입니다. 일반적으로 정상적으로 작동하지만 프로세스의 다른 스레드가 해당 DLL에서 코드를 사용하고있는 경우 문제가 발생할 수 있습니다 (이 사실을 알고 있어야합니다).

사용자가 명시 적으로로드 한 경우 DLL을 언로드 할 수 있습니다. 언제 언로드 할 때가 가장 좋은지 신중히 생각하십시오.

윈도우 :

LoadLibrary() 
FreeLibrary() 
GetProcAddress() 

유닉스/리눅스 :

dlopen() 
dlclose() 
dlsym() 

PS : 나는 Windows 및 Linux에서 공유 라이브러리를 참조하는 내 대답에 한 학기, DLL를 사용합니다.

+0

실제로 삽입 된 dylib를 언로 드하려고합니다. 나는 dlclose()와 dlsym()을 핸들 할 필요없이 사용할 수 없다.따라서 내가 언급 한 링크에서했던 것과 같은 일을하고 싶습니다. 하지만 OS X의 경우 – MacGeek

+0

비트가 혼동되었습니다. 주입 된 dynlib을 언 로딩하는 과정입니까? 또는 dynlib이 수행하는 또 다른 프로세스가 필요합니다. 나도 네가 dynlib을 내리고 싶다고 생각 했어? 질문을 다시 들여다 보면보다 명확하게 알 수 있습니다. – ScrollerBlaster

+0

나는 – MacGeek

1

Windows의 경우 에 관해서는 my answer here을 참조하십시오. FreeLibraryAndExitThread 제대로 수행하는 기능입니다. 다른 시스템에서 비슷한 기능을 사용할 수 있다고 가정합니다.
내가 undestand, 전화 FreeLibrary이 경우 잘못된 작업 - MSDN에서 : "그들은 FreeLibrary 및 ExitThread 별도로 호출 할 경우 경쟁 조건이 존재합니다. 라이브러리를 ExitThread 전에 언로드 할 수 있습니다. 전화했다. " 발언으로, ExitThread는 thread 함수에서 돌아 오는 것 외에도 몇 가지 부기 작업을 수행합니다.