【问题标题】:why the DSO was loaded at address 0为什么 DSO 被加载到地址 0
【发布时间】:2013-05-16 00:16:14
【问题描述】:

有一个简单的测试程序,它 dlopen()s 一个 DSO "/lib/libc.so.6" 然后打印符号 "printf" 的地址。

#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=all”调试它时,它显示:

[root@localhost glibc_test]# LD_DEBUG=all LD_DEBUG_OUTPUT=error ./test &
[18] 14690
[root@localhost 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

另外,“/proc/14270/maps”文件执行正常,测试程序中符号“func”(0x2f87b0)的地址在正确的范围内(002af000-0043b000)。

[root@localhost ~]# 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 

【问题讨论】:

    标签: loader dlopen dynamic-loading


    【解决方案1】:

    这个问题与“预链接”有关,当一个 DSO 正在加载时,它已经被预链接到某个地址。

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 2016-03-13
      相关资源
      最近更新 更多