zoukankan      html  css  js  c++  java
  • 如何获取Linux-gate.so.1动态库

    前面“Linux应用程序Helloworld入门”已经提到在Linux下每个可执行文件都依赖于几个最为基本的动态库,其中一个就是linux-gate.so.1。

    从上面ldd给出的结果可以看出,这个linux-gate.so.1动态库有一些异样,libc.so.6的实际动态库路径在/lib/tls/i686/cmov/libc.so.6,而ld-linux.so.2是在/lib/ld-linux.so.2。那么不禁要问一个问题linux-gate.so.1这个动态库的路径是什么,是文件系统中那个文件呢?其实这个文件是内核映射上去的,并非存在实际的动态库文件,对于这个具体问题我们后续再做详细分析,这里仅仅做如何获取linux-gate.so.1动态库的方法。

    通常情况下,比如在SUSE10, suse11系统上,linux-gate.so.1被映射到ffffe000-fffff000这个高端内存段里面。此时将这段内存导出到文件比较简单,可以使用下面脚本,帮助各位导出:

     
    1. VDSO_FILE_NAME=linux-gate.dso  
    2. cat /proc/self/maps|grep "vdso"  
    3. VDSO_ADDR=`cat /proc/self/maps|grep "vdso" |awk -F '-' '{print $1 }'`  
    4. echo "Current VDSO address is 0x$VDSO_ADDR"  
    5.   
    6. VDSO_BLOCK=`echo |awk '{print substr("'${VDSO_ADDR}'",1,5)}'`  
    7. ((SKIP_BLOCKS=16#$VDSO_BLOCK))  
    8. echo "We have $SKIP_BLOCKS blocks before VDSO library"  
    9.   
    10. echo "Ready to generate $VDSO_FILE_NAME from block $SKIP_BLOCKS"  
    11. dd if=/proc/self/mem of=$VDSO_FILE_NAME bs=4096 skip=$SKIP_BLOCKS count=1  
    12.   
    13. echo "Generate $VDSO_FILE_NAME Done"  

    在suse系统上执行的结果:

     
    1. ~> ./cat_linux_gate_so.sh  
    2. ffffe000-fffff000 ---p 00000000 00:00 0          [vdso]  
    3. Current VDSO address is 0xffffe000  
    4. We have 1048574 blocks before VDSO library  
    5. Ready to generate linux-gate.dso from block 1048574  
    6. 1+0 records in  
    7. 1+0 records out  
    8. 4096 bytes (4.1 kB) copied, 4.2e-05 seconds, 97.5 MB/s  
    9. Generate linux-gate.dso Done  
    10.   
    11. ~> file -b linux-gate.dso  
    12. ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped  
    13. ~> objdump -T linux-gate.dso  
    14.   
    15.   
    16. linux-gate.dso:     文件格式 elf32-i386  
    17.   
    18.   
    19. DYNAMIC SYMBOL TABLE:  
    20. ffffe400 l    d  .text  00000000              .text  
    21. ffffe478 l    d  .eh_frame_hdr  00000000              .eh_frame_hdr  
    22. ffffe49c l    d  .eh_frame      00000000              .eh_frame  
    23. ffffe620 l    d  .useless       00000000              .useless  
    24. ffffe400 g    DF .text  00000014  LINUX_2.5   __kernel_vsyscall  
    25. 00000000 g    DO *ABS*  00000000  LINUX_2.5   LINUX_2.5  
    26. ffffe440 g    DF .text  00000007  LINUX_2.5   __kernel_rt_sigreturn  
    27. ffffe420 g    DF .text  00000008  LINUX_2.5   __kernel_sigreturn  

    Ubuntu 上情况比较复杂,在此也耽误了不少时间,因为ubuntu映射到的内存地址是不固定的,每个进程映射的位置都是不同的。

    多次执行:

     cat /proc/self/maps|grep "vdso"  

    b7f47000-b7f48000 r-xp b7f47000 00:00 0          [vdso]

    b7f5f000-b7f60000 r-xp b7f5f000 00:00 0          [vdso]

    b7f54000-b7f55000 r-xp b7f54000 00:00 0          [vdso]

  • 相关阅读:
    dubbo springcloud区别
    rpc
    centos7 安装docker
    vibox安装
    知识点
    spring cloud
    微服务设计原则
    工具类
    xss--知识点
    java基础--注解
  • 原文地址:https://www.cnblogs.com/mao0504/p/5441218.html
Copyright © 2011-2022 走看看