2012-11-12 8 views
5

지금은 3 공유 객체, A.so, B.so, C.so암시 적으로 호출 할 때 RTLD_DEEPBIND를 사용하는 방법은 무엇입니까?

A.c  
    void libA() 
    { 
     common(); 
    } 

    B.c 
    void common() 
    { 
     printf("COME HERE B\n"); 
    } 

    C.c 
    void common() 
    {  
     printf("COME HERE C\n"); 
    } 
    (just ingore the .h files) 

    test.c 
    int main() 
    { 
     libA();  
     return 1; 
    } 

complie: 
gcc -fPIC -shared libB.so libB.c 
gcc -fPIC -shared libA.so libA.c ./libB.so 
gcc -o test test.c libC.so libA.so 

나는 "B 이리와"나는 RTLD_DEEPBIND 플래그 dlopen을 사용할 수 있습니다로 결과를 원하는,
하지만이 내 프로젝트에서 암묵적 호출에서 명시 적 호출로 함수를 변경하는 데 너무 많은 시간이 소요됩니다.
이 문제를 해결하기위한 방법이 있습니까?

gcc -Wl,-Bsymbolic은이 솔루션에서 작동하지 않습니다.

글쎄, A.c가 공통 구현을 포함하고 있다면. 그것은 효과가있다.

답변

1

동적 링커가 런타임에 심볼을 검색 할 때 나타나는 첫 번째 심볼을 선택하는 것처럼 보입니다. 검색 순서는 컴파일시 명령 행에서 라이브러리의 정확한 순서에 따라 달라지는 바이너리의 DT_NEEDED 섹션의 라이브러리 순서에 따라 다릅니다. 따라서 test.c을 컴파일 할 때 명령 줄에서 libB.solibC.so 앞에 오도록하십시오.