2013-03-26 1 views
1

공유 라이브러리의 dlopen() 호출에 실패한 모든 미해결 심볼을보고하려고합니다. dlopen 호출에 대한 플래그로 RTLD_LAZY 및 RTLD_NOW를 모두 시도했습니다. 공유 라이브러리에 10 개의 기호가 누락 된 것을 알고 있습니다 (예 : 정적 링크 g ++를 수행 한 경우 blah : 링크가 10 개의 기호가 없으면 실패합니다). 나는 dlerror()를 사용하여 실패한로드 중에 10 개의 누락 된 심볼에 대해 알려줍니다.dlerror() report dlopen()에서 * all * 미해결 심볼을 공유 라이브러리를로드하지 못했습니다.

아무도 이런 일이 일어나지 않도록합니다. 맨 페이지에서 dlerror()가 마지막 오류를 반환하는 것을 봅니다. 그래서 어쩌면 나는 너무 많이 묻고 있지만 누군가 알고 있는지 궁금해 할 것입니다. 너무 많은

덕분에,

답변

4

나는() 실패 부하시에 대한 모든 열없는 기호를 말해 그리고 dlerror을 싶어.

당신은 할 수 없습니다 : 로더은 (는 첫째없는 기호를 발견로 즉 빨리) 라이브러리를로드 할 수 없음을 발견 즉시 오류 를보고합니다. 로더가 더 이상 나아갈 필요가 없으므로 로더가 더 이상 나아갈 필요가 없습니다.

그러나 및 LD_TRACE_LOADED_OBJECTS을 사용하여 ldd -r이 수행하는 것을 시뮬레이트하여 완전한 대답을 얻을 수 있습니다. 예 :

$ cat main.c 
#include <dlfcn.h> 
#include <stdio.h> 

int main() 
{ 
    void *p = dlopen("./foo.so", RTLD_NOW); 
    if (p == NULL) { 
    printf("%s\n", dlerror()); 
    return 1; 
    } 
    return 0; 
} 


$ cat foo.c 
int bar(), baz(); // not defined anywhere 
int foo() { 
    return bar() + baz(); 
} 

$ gcc main.c -ldl; gcc -fPIC -shared -o foo.so foo.c 

$ ./a.out 
./foo.so: undefined symbol: baz # only the first symbol is reported 

$ ldd -r ./a.out 
    linux-vdso.so.1 => (0x00007fff52ddc000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f158e48d000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f158e0ce000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f158e6b2000) 

프로그램이 실행되지 않아 실행되지 않으므로 foo.so이로드되지 않습니다. 그러나 구조에 LD_PRELOAD :

$ LD_BIND_NOW=1 LD_WARN=1 LD_TRACE_LOADED_OBJECTS=1 LD_PRELOAD=./foo.so ./a.out 
    linux-vdso.so.1 => (0x00007fff3c1b6000) 
    ./foo.so (0x00007ffd33212000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffd3300e000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffd32c4f000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007ffd33414000) 
undefined symbol: baz (./foo.so) 
undefined symbol: bar (./foo.so) 

자보세요 : 해결되지 않은 모든 기호는 현재보고했다.

관련 문제