2010-06-02 4 views
6

지연 부하은 유닉스 기반 시스템에서 동일합니다.유닉스 기반 시스템에서 지연 - 부하 등가

코드가 foo.cpp인데 gcc로 컴파일하는 동안 공유 객체에 연결합니다 (완전히 3 개의 .so 파일이 있습니다.). 서로 다른 옵션의 .so 파일 각각.

./foo -v 요구 libversion.so ./foo -update 내가 그 라이브러리에 대한 기호를 필요

libupdate.so 요구는 실행 번에 해결한다 .

./foo -v는 libupdate.so 라이브러리가 없어도 중단되지 않아야합니다.

지연로드 옵션 (dll 속성)을 사용하는 Windows에서 작동합니다. 유닉스 시스템에서 그 등가물은 무엇인가?

'lazy'옵션은 UNIX에서 동일하게 적용됩니까? 그렇다면이 옵션을 어디에 포함할까요? (makefile이나 링커 ld로).

유닉스에는 좋지 않습니다. 제발 도와주세요 .. 미리 감사드립니다.

+1

난 아직 오년 후,이 질문에 대한 답을 듣고 싶습니다. – Lothar

답변

2

dlopen()에 대한 시스템 참조 서를 참조하십시오. 링크가 아닌 런타임시 라이브러리를 수동으로 열고 외부 기호를 확인할 수 있습니다.

파고 밖으로 예 :

int main(int argc, char **argv) {     
    void *handle=NULL;         
    double (*myfunc)(double);      
    char *err=NULL;         

    handle = dlopen ("/lib/libm.so.1", RTLD_LAZY); 
    if (!handle) {         
     err=dlerror(); 
     perror(err); 
     exit(1);         
    }            

    myfunc = dlsym(handle, "sin");     
    if ((err = dlerror()) != NULL) {   
     perror(err); 
     exit(1);         
    }            

    printf("sin of 1 is:%f\n", (*myfunc)(1.));    
    dlclose(handle);    
    return 0;     
}             
+1

감사. 그러나 dlopen을 사용하는 대신 링커에서 Delay load equivalent 옵션을 지정할 수 있다면 더 좋을 것입니다. GCC에서 libxxx.so 파일을 게으른로드 할 수있는 옵션이 있습니까? gaz -WI를 사용하여 지연로드 옵션을 전달하여 지연로드에 링커를 설정하지 못하게 할 수 있습니까? 링커는 기본적으로 lazy load로 설정됩니까? 제발 도와주세요. 미리 감사드립니다. – saran

+1

아니요, dlopen()/dlsym()을 사용하면 유닉스에서 이식 할 수 있습니다. 일부 시스템의 사용자 정의 링커가이를 처리 할 수 ​​있지만 (예 : http://docs.sun.com/app/docs/doc/817-1983/6mhm6r4er?l=en&a=view) GNU ld에는 이러한 옵션이 없습니다. – pra

+0

@pra 성명서를 뒷받침하는 일부 문서를 파헤 치고 대답으로 올리면 나는 그것을 업 그레 이드합니다. –

0

나는 아직도 ...

지연 부하가 GNU 시스템의 상자 밖으로 밖으로 지원되지 않습니다 팔년하지만되었습니다하지만 당신은 스스로를 모방 수있어 필요한 모든 기호를 제공하는 작은 정적 스텁을 생성하고 dlopen 첫 번째 호출에서 (또는 프로그램 시작시에도) 실제 구현을 생성합니다. 이러한 서브는 프로젝트 별 스크립트에 의해 또는 Implib.so tool 통해 생성, 손으로 쓸 수있다 :

# Replace 
$ gcc -o foo foo.c -lversion 
# with 
$ gen-implib.py libversion.so 
$ gcc -o foo foo.c libversion.tramp.S libversion.init.c 
관련 문제