2013-05-21 5 views
0

Существует простая тестовая программа: dlopen() - DSO "/lib/libc.so.6", а затем распечатать адрес символа "printf".Почему DSO был загружен по адресу 0

#include <dlfcn.h> 
#include <stdio.h> 

int main() { 
    void* handle; 
    void (*func)(); 
    char* error_test; 
    if (handle = dlopen("/lib/libc.so.6", RTLD_NOW)) { 
     func = dlsym(handle, "printf"); 
     (*func)("address:%p\n",func); 
     sleep(-1); 
     dlclose(handle); 
     return 0; 
    } 
    return -1; 
} 

Когда я отлаживать его с "LD_DEBUG = все", это показывает, что:

[[email protected] glibc_test]# LD_DEBUG=all LD_DEBUG_OUTPUT=error ./test & 
[18] 14690 
[[email protected] glibc_test]# address:0x2f87b0 

Но файл "ошибка" показывает, что "/lib/libc.so.6" был загружен адрес 0! Вот почему?

14690: initialize program: ./test 
14690: 
14690: 
14690: transferring control: ./test 
14690: 
14690: symbol=dlopen; lookup in file=./test [0] 
14690: symbol=dlopen; lookup in file=/changed_glibc/lib/libdl.so.2 [0] 
14690: binding file ./test [0] to /changed_glibc/lib/libdl.so.2 [0]: normal symbol `dlopen' [GLIBC_2.1] 
14690: 
14690: file=/lib/libc.so.6 [0]; needed by ./test [0] 
14690: file=/lib/libc.so.6 [0]; generating link map 
14690: dynamic: 0x0043cd7c base: 0x00000000 size: 0x00191988 
14690:  entry: 0x002c5e40 phdr: 0x002af034 phnum:   10 

What`s больше, файл "/ Proc/14270/карты" выполнить нормальный, а также адрес символа "Func" (0x2f87b0) в тестовой программе лежит в нужном диапазоне (002af000-0043b000).

[[email protected] ~]# cat /proc/14690/maps 
002af000-0043b000 r-xp 00000000 fd:00 1714117 /lib/libc-2.12.so 
0043b000-0043d000 r--p 0018c000 fd:00 1714117 /lib/libc-2.12.so 
0043d000-0043e000 rw-p 0018e000 fd:00 1714117 /lib/libc-2.12.so 
0043e000-00441000 rw-p 00000000 00:00 0 

ответ

0

Проблема связана с «Prelink», когда DSO загружается, она была предварительно скомпонованы на определенный адрес.