2011-07-21 27 views
2

奇怪的是,dlsym可以从已删除的二进制文件中导入函数。dlsym如何从剥离的二进制库中成功导入函数?

有谁能告诉我为什么/如何?

=== FILE: a.c === 
int a1() { return 1; } 
int a2() { return 2; } 
=== end of a.c === 

=== FILE: b.c === 
#include <stdio.h> 
#include <dlfcn.h> 
#include <stdlib.h> 

typedef int (*fint)(); 

fint dlsym_fint(void *handle, char *name) 
{ 
    fint x = (fint)dlsym(handle, name); 
    char *err = NULL; 
    if ((err = dlerror()) != NULL) { 
     printf("dlsym: %s\n", err); 
     exit(1); 
    } 
    return x; 
} 

int main() 
{ 
    void *dl = dlopen("a.so", RTLD_NOW); 
    fint a = NULL; 
    a = dlsym_fint(dl, "a1"); 
    printf("%p: %d\n", a, a()); 
    a = dlsym_fint(dl, "a2"); 
    printf("%p: %d\n", a, a()); 
    return 0; 
} 
=== end of b.c === 

$ gcc -shared -fPIC -o a.so a.c 
$ nm a.so 
... 
00000000000004ec T a1 
00000000000004f7 T a2 
... 

$ strip a.so 
$ nm a.so 
nm: a.so: no symbols 

$ gcc -o b b.c -ldl 

$ ./b 
0x2aaaaaac74ec: 1 
0x2aaaaaac74f7: 2 

回答

5

尝试readelf -s a.so。动态符号仍然在那之后strip

(或者只是切换到nm -D a.so。)

+0

原来是他!非常感谢! – felix021

相关问题