2013-05-29 1 views
0

저는 리눅스 플랫폼 용 공유 라이브러리를 개발하는 데있어 새로운 것으로 나타났습니다.라이브러리로드시 실행되는 함수

라이브러리로드시을 호출 할 .SO 내부 기능을 정의 할 수 있습니까?

답변

2

아니요, 시스템에서 정의한 공유 객체에는 표준 "진입 점"이 없습니다. dlopen()을 사용하는 주어진 응용 프로그램은 이런 방식으로로드 된 모듈의 진입 점으로 사용될 표준 심볼 이름을 정의 할 수 있습니다. 그런 다음 호스트 응용 프로그램은 dlsym()을 사용하여 기호를 호출하기 위해 해당 기호를 이름별로 검색합니다.

그러나 대부분의 응용 프로그램은 dlopen을 전혀 사용하지 않으며 사용자가 왜 그렇게해야하는지 설명하지 않았습니다.

+0

왜 그들은 dlopen을 직접 사용하지 않습니까? – opc0de

+0

일반 응용 프로그램은 빌드시 필요한 공유 라이브러리에 명시 적으로 연결되기 때문에 직접 사용하지 않습니다. 즉, 응용 프로그램에 명시 적 코드없이로드 할 라이브러리를 알리는 모든 실행 파일에 명령이 구워집니다. 실행 파일에서'ldd' 프로그램을 실행하면 어떤 라이브러리가 자동으로로드 될지 알 수 있습니다. 'dlopen()'의 명시 적 사용은 "플러그인"아키텍처를 구현하는 프로그램을위한 것입니다. 예를 들면 런타임까지 필요한 라이브러리를 모르는 프로그램입니다. 예 : Firefox, Python, Photoshop .... –

2

GCC 또는 호환 컴파일러를 사용하는 경우 __attribute__((constructor))으로 함수를 선언 할 수 있으며로드 할 때 호출됩니다. 사람 페이지에서

__attribute__((constructor)) 
void init() 
{ 
    puts("Hello dynamic linkage world!"); 
} 
1

식으로 뭔가 : 사용되지 않는 기호는 _init()와 _fini()가 링커는 특수 기호 _init과 _fini를 인식합니다. 동적 인 라이브러리가 _init()라는 루틴을 내 보내면 dlopen()이 반환되기 전에 해당 코드가 로딩 후 으로 실행됩니다. 동적 라이브러리 이 _fini()라는 루틴을 내보내는 경우 라이브러리가 언로드되기 전에 해당 루틴의 이름은 입니다. 을 시스템 시작 파일과 연결하지 않으려면 gcc (1) -nostartfiles 명령 줄 옵션을 사용하여이 작업을 수행 할 수 있습니다.

Using these routines, or the gcc -nostartfiles or -nostdlib options, 
    is not recommended. Their use may result in undesired behavior, 
    since the constructor/destructor routines will not be executed 
    (unless special measures are taken). 

    **Instead, libraries should export routines using the 
    __attribute__((constructor)) and __attribute__((destructor)) function 
    attributes. See the gcc info pages for information on these. 
    Constructor routines are executed before dlopen() returns, and 
    destructor routines are executed before dlclose() returns.** 
관련 문제